iOS9 & iOS10 & iOS11 HTTP 不能正常使用的解決辦法

今天升級Xcode 7.0 bata發現網絡訪問失敗。
輸出錯誤信息html

The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

Google後查證,iOS9引入了新特性App Transport Security (ATS)。詳情:App Transport Security (ATS)ios

新特性要求App內訪問的網絡必須使用HTTPS協議。
可是如今公司的項目使用的是HTTP協議,使用私有加密方式保證數據安全。如今也不能立刻改爲HTTPS協議傳輸。git

最終找到如下解決辦法:

  1. 在Info.plist中添加NSAppTransportSecurity類型Dictionary
  2. NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設爲YES

看到不少同窗修改後仍是不能用添加一下截圖:

  1. 在Filter中搜索Info.plist,選擇Info.plist進行編輯

圖片描述

  1. 按照上面提到的方式添加信息,正確的修改會看到下圖這個樣子,注意類型NSAppTransportSecurityDictionaryNSAllowsArbitraryLoadsBoolean,複製粘貼的時候,不要多了空格,segment fault 頁面上直接複製,常常會多一個出空格!

圖片描述

  1. 注意⚠️,單元測試下面也有一個Info.plist,修改那個文件是沒有做用的!

補充說明

上面介紹的方法雖然解決了網絡訪問的問題,可是蘋果提供的安全保障也被關閉了。
不過,按照國內的現狀,關閉這個限制也許是更實際的作法。
至於緣由就太多了,第三方SDK(幾乎都是訪問HTTP),合做夥伴接入(不能要求它們必定要支持HTTPS)。
若是你的App沒有受到這些緣由的限制,仍是更建議你增長HTTPS支持,而不是關閉限制。
請你們根據項目的實際狀況做調整。github

出於安全考慮咱們提倡使用HTTPS,退而求其次,優先考慮使用例外:將容許訪問的域加入到配置列表中安全

@banxi1988 補充了配置的方法
對於實在不支持HTTPS的應該首先考慮添加例外網絡

添加例外的方式也很簡單:
左鍵Info.plist選擇open with source code
而後添加相似以下的配置:session

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>qq.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
            <key>sina.com.cn</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
           </dict>
   </dict>

根據本身須要的域名修改, NSIncludeSubdomains 顧名思義是包括子域的意思。app


參考:

總結:

蘋果正在加大應用安全的管控,這個舉措能夠看出蘋果對信息安全的重視,也暴露出大部分應用傳輸數據時都是未通過加密的,或使用私有方式加密,以致於蘋果開始對開發者提出要求。
私有加密雖然必定程度上是安全的,可是終究不是一個長久之計。全世界這麼多安全專家在維護HTTPS安全,早日使用HTTPS確保信息安全才是王道!也省去了私有加密協議的安全隱患!dom

若是這片文章對你有用,請點一下推薦,讓更多的人能找到這裏

相關文章
相關標籤/搜索