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本身的問題。