Swift 網絡訪問庫Alamofire 訪問https localhost服務器

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系統網絡安全配置。

經驗如下:

  1. 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)
    )
}
    }
  1. 系統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本身的問題。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容