NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
错误描述
环境:
iOS9 / Xcode7, Cordova
错误提示:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
百度/Google之后 不难发现报错的原因
这是因为 iOS9
增加了新特性 App Transport Security (ATS)
。详情:App Transport Security (ATS)
新特性要求 App 内访问的网络必须使用HTTPS协议并且改成 TLS1.2
协议进行传输
解决方法
网上提供了一种方不遵循 iOS9
新特性的规则,将 AppTransportSecurity
转为使用用户自定义的设置的方法,据说可以解决此问题~
讲的最多的一种方法就是修改 (...)/platforms/ios/YOURAPP/YOURAPP-Info.plist
文件,添加以下代码:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
还有一种修改 info.list
文件的方法:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>YOUDOMAIN(e.g. baidu.com)</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
然而这两种方法,我都测试过,并没有什么用。。。
只能再找方法试试了,找到了这个:修改 (...)/platforms/ios/嘎嚓嘎嚓/Classes/AppDelegate.m
文件,添加以下代码:
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
哈哈。。。果然有用,简直 Nice!
不过,info.list
文件是之前修改过的,然后就觉得是不是只需要修改 AppDelegate.m
文件就可以呢?
经过验证是不行的,必须同时修改 info.list
和 AppDelegate.m
文件才可以解决此问题。
info.list
添加第一种代码即可:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
参考链接
http://forum.ionicframework.com/t/nsurlsession-nsurlconnection-http-load-failed/32898
好文要顶啊