Alamofire提供了比IOS标准库便捷的网络访问接口,沿用了Objective-C的AFNetwork的各种优点,所以成为了我迁移到Swift平台不二的选择。
Alamofire文档地址
不过刚刚上手就碰到了很初级的问题:使用https连接本地的服务器总是报错。
- 为什么一定要用把人逼疯的https呢? *
2016年6月14日在WWDC 2016开发者大会上,苹果宣布了一个最后期限:2017年1月1日起,苹果App Store中的所有App都必须启用 App Transport Security(ATS)安全功能。
所以 现在开发一个商用的程序必须使用https来访问后台API啦
在多次碰壁无果后,只好把问题分解隔离,各个击破。
- Alamofire的 https 连接问题。访问个baidu.com试试?
- Alamofire 的 localhost 自定义证书的问题。
- ATS IOS系统网络安全配置。
经验如下:
- Alamofire的 https 连接问题, 报错 Error Domain=NSURLErrorDomain Code=-999 “cancelled”。问题主要是由于sessionManager的生命周期导致的。通过把sessionManager 设置为类成员,避免在response回调时提前销毁,解决了正常访问baidu.com的问题。
import Foundation
import Alamofire
class NetworkManager {
var manager: Manager?
init() {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
manager = Alamofire.Manager(configuration: configuration)
}
}
2.Alamofire 的 localhost 自定义证书的问题。
需要在serverTrustPolicies中加上域名,disableEvaluation选项。注意使用域名,不需要端口等其他参数。
class NetworkManager {
var manager: SessionManager?
init() {
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"10.68.24.127" : .disableEvaluation
]
let configuration = URLSessionConfiguration.default
manager = Alamofire.SessionManager(
configuration: configuration,
serverTrustPolicyManager :ServerTrustPolicyManager(policies: serverTrustPolicies)
)
}
}
- 系统ATS安全。
该功能属于IOS的新功能,需要配置info.plist文件。增加域名对应的配置项。
<key>NSAppTransportSecurity</key><dict>
<key>NSExceptionDomains</key>
<dict>
<key>url.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
由于上面3种因素混合,导致了这个问题难以解决。
最后Alamofire的作者提供了一个很好的建议:
- 在ServiceTrustManger的数组中设置断点来判断究竟是ATS系统阻拦了请求,还是Alamofire本身的问题。