iwanghang

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1.建立Tools文件夹:

2.新建一个Swift File,用于封装网络请求,名字比如“AFNetworkingManager”:

import Foundation
import AFNetworking

// 定义枚举类型
enum HTTPRequestType : Int{
    case GET = 0
    case POST
}

class NetworkTools: AFHTTPSessionManager {
    // 设计单例 let是线程安全的
    static let shareInstance : NetworkTools = {
        let tools = NetworkTools()
        tools.responseSerializer.acceptableContentTypes?.insert("text/html")
        return tools
    }()
    
}

// 封装请求方法
extension NetworkTools {
    func request(methodType : HTTPRequestType, urlString : String, parameters : [String : AnyObject], finished :@escaping (_ result : AnyObject?, _ error : Error?)-> ())  {
        // 1 成功回调
        let successCallBack = {(task :URLSessionDataTask, result : Any) in
            finished(result as AnyObject?, nil)
        }
        // 2 失败回调
        let failureCallBack = {(task : URLSessionDataTask?, error :Error) in
            finished(nil, error)
        }
        
        if methodType == .GET {
            // get请求
            
            get(urlString, parameters: parameters, progress: nil, success: successCallBack, failure: failureCallBack)
        }else {
            // post请求
            
            post(urlString, parameters: parameters, progress: nil, success: successCallBack, failure: failureCallBack)
            
        }
    }
}

3.“import AFNetworking”可能会报错,这个是Xcode的一个Bug,我们按command+N,重新编译一下项目就好了

4.我们给登录按钮点击事件,增加网络请求和json解析:

import UIKit
import SwiftyJSON

class ViewController: UIViewController {
    
    
    @IBOutlet weak var et_vip_code: UITextField! // VIP号码
    @IBOutlet weak var bt_login: UIButton! // 登录按钮

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // 登录按钮 的 点击事件
    @IBAction func bt_login_clicked(_ sender: Any) {
        //创建请求参数
        // let params = ["VIP_keyworld":"595466","password":"123456"] // 多个参数写法
        // let params = ["VIP_keyworld":"595466"]
        
        let vipCode = et_vip_code.text!
        let params = ["VIP_keyworld":vipCode] // 请求参数
        let loginUrl = "http://www.xxxxxx.com/login.asp" // 请求地址
        
        // 使用 AFNetworking 发送POST请求
        NetworkTools.shareInstance.request(methodType: .POST, urlString: loginUrl, parameters: params as [String : AnyObject]) { (result : AnyObject?, error : Error?) in
            
            if error != nil  {
                print(error!)
                return
            }
            print(result!)
            
            
            // 使用 SwiftyJSON 解析json -- 这里解析的是 jsonObject
            // 如果要解析 jsonArray, SwiftyJSON 更加丝滑, 参考 http://www.hangge.com/blog/cache/detail_968.html
            let json = JSON(result as Any)
            if let vip_id = json["id"].string {
                print("id是:",vip_id)
            }
        }
    }
    
    // 输入框内容 改变 监听
    @IBAction func et_vip_code_changed(_ sender: Any) {
        let vipCode = et_vip_code.text!
        if vipCode.count > 0 {
            bt_login.backgroundColor = #colorLiteral(red: 0.1921568627, green: 0.5411764706, blue: 1, alpha: 1) // 已经输入VIP号码 登录按钮背景色
        } else{
            bt_login.backgroundColor = #colorLiteral(red: 0.3137254902, green: 0.3921568627, blue: 0.5137254902, alpha: 1) // 没有输入VIP号码 登录按钮背景色
        }
    }
    
}

5.至此,应该是结束了,但是会报错,可以理解为没有网络权限:

NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection
翻译:因为应用程序传输安全策略需要使用安全连接,所以无法加载资源

6.增加网络权限:

  6.1.点击项目,点击info,点击Custom iOS Target Properties,创建 App Transport Security Settings 的 Dictionary:

  

  6.2.在其里面 创建Allow Arbitrary Loads的Boolean 值为YES:

    

7.看一下效果(忽略渣画质):

8.好了,我们把登录界面的UI和网络请求,都实现了。

posted on 2018-05-28 14:48  iwanghang  阅读(562)  评论(0编辑  收藏  举报