背景
苹果公司在2015年在Xcode7.0中开始强制支持HTTPS协议,并引入 ATS(App Transport Security)。之后的版本中默认仅支持 HTTPS协议请求。
问题
在最新Xcode版本中使用HTTP请求地址(如下集成代码):
// http
@IBAction func httpRequestAction(_ sender: Any) {
print("http request action")
// http 示例
if let url = URL(string: "http://xxx.xxx.xxx:xxxx/xxx/xxx/xxx") {
fetchData(from: url) { data, response, error in
if let error = error {
print("Error: \(error)")
} else if let data = data {
// 处理获取到的数据
print("Data: \(String(decoding: data, as: UTF8.self))")
} else {
print("No data returned.")
}
}
}
}
// 定义一个函数来执行GET请求
func fetchData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> Void) {
let task = URLSession.shared.dataTask(with: url) { data, response, error in
completion(data, response, error)
}
task.resume()
}
运行上面代码,我们可以在打印日志中看到如下错误提示:
分析
由上面的调试可以知道使用HTTP协议在Xcode项目中与服务端交互数据,需要遵循苹果的App Transport Security 政策。
苹果提供了两种配置支持HTTP协议:
Exception Domains:这种需要指定服务器域名URL
Allow Arbitrary Loads:支持加载所有的URL
第一种使用范围较窄,本文示范的是第二种方式。
行动
在 Xcode 项目中找到 Info.plist 文件
添加如下代码:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
设置值为 YES
我们就配置好的支持HTTP请求。
调试
运行项目,触发事件我们可以看到如下图
服务端数据已经正确的打印在控制台了。
结尾
相关配置视频及调试Demo已上传至云盘,限时领取:
通过网盘分享的文件:App Transport Security Settings
链接: https://pan.baidu.com/s/1a_K2HenTCgjVeIkVmL9kZg?pwd=a4ec 提取码: a4ec