Swift網路訪問庫Alamofire訪問httpslocalhost伺服器

ebxinxi發表於2017-10-31

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


相關文章