遇到的问题
刚刚写一个简单的获取天气数据的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