iOS9 +http請求不能用的解決辦法


報錯NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802);

查詢得知 iOS9引入了新特性App Transport Security (ATS)。詳情:App Transport Security (ATS)

 新特性要求App內訪問的網絡必須使用HTTPS協議。

但是現在公司的項目使用的是HTTP協議,使用私有加密方式保證數據安全。現在也不能馬上改成HTTPS協議傳輸。

 

解決方法:

  1. 在Info.plist中添加NSAppTransportSecurity類型Dictionary

  2. 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM