報錯NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802);
查詢得知 iOS9引入了新特性App Transport Security (ATS)。詳情:App Transport Security (ATS)
新特性要求App內訪問的網絡必須使用HTTPS協議。
但是現在公司的項目使用的是HTTP協議,使用私有加密方式保證數據安全。現在也不能馬上改成HTTPS協議傳輸。
解決方法:
-
在Info.plist中添加
NSAppTransportSecurity類型Dictionary。 -
在
NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設為YES
在項目配置文件info.plist中添加App Transport Security Settings字典dictionary。在其下添加屬性名為Allow Arbitrary Loads的bool值為yes。
即可解決。
如下圖:

補充說明:
上面介紹的方法雖然解決了網絡訪問的問題,但是蘋果提供的安全保障也被關閉了。
不過,按照國內的現狀,關閉這個限制也許是更實際的做法。
至於原因就太多了,第三方SDK(幾乎都是訪問HTTP),合作伙伴接入(不能要求它們一定要支持HTTPS)。
如果你的App沒有受到這些原因的限制,還是更建議你增加HTTPS支持,而不是關閉限制。
請大家根據項目的實際情況作調整。
出於安全考慮我們提倡使用HTTPS,退而求其次,優先考慮使用例外:將允許訪問的域加入到配置列表中
@banxi1988 補充了配置的方法
對於實在不支持HTTPS的應該首先考慮添加例外
添加例外的方式也很簡單:
左鍵Info.plist選擇open with source code
然后添加類似如下的配置:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>test.testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
根據自己需要的域名修改, NSIncludeSubdomains 顧名思義是包括子域的意思。
參考:
https://github.com/meteor/meteor/issues/4560
http://stackoverflow.com/questions/31662134/https-request-in-ios-9-nsurlsession-nsurlconnection-http-load-failed-kcfstrea
