遇到的問題
剛剛寫一個簡單的獲取天氣數據的demo,進行Http請求的時候,程序報錯提示:
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
解決方法
在Info.plist中添加 App Transport Security Settings 類型 Dictionary ;
并在App Transport Security Settings 下添加 Allow Arbitrary Loads 類型Boolean, 值設為 YES-
或者在plist source code添加
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
二者效果等同
解釋原因、關于ATS
簡單翻閱了Apple官方App Transport Security文檔(簡稱ATS)得知:
ATS
ATS限制使用HTTP, 數據請求盡量通過HTTPS加密傳輸,
且HTTPS的請求也要滿足以下規定:
- 傳輸層協議(TLS)至少為1.2版本
- 連接的加密方式要提供Forward Secrecy,支持如下加密算法詳見蘋果官方文檔
- 證書至少要使用一個SHA256的指紋與任一個2048位或者更高位的RSA密鑰,或者是256位或者更高位的ECC密鑰。如果不符合其中一項,請求將被中斷并返回nil.
上面新增的配置中的NSAppTransportSecurity是ATS配置的根節點,配置了節點表示告訴系統要走自定義的ATS設置。而NSAllowsAritraryLoads節點則是控制是否禁用ATS特性,設置YES就是禁用ATS功能。
總結:
- 如果請求源是HTTP,則按以上方法處理
- 如果請求源是HTTPS,則需要根據是否滿足以上三個條件來針對性地配置plist