在iOS 9上NSURLSession / NSURLConnection HTTP加载失败
试图在iOS9上运行我现有的应用程序,但使用AFURLSessionManager
失败。
__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { if (error) { } else { } }]; [task resume];
我得到以下错误:
Error Domain=NSURLErrorDomain Code=-999 "cancelled.
还获得以下日志:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824 CFNetwork SSLHandshake failed (-9824)
更新:我已经添加了多个更新到我的解决scheme: NSURLSession / NSURLConnection HTTP加载失败在iOS 9上
find解决scheme
在iOS9中,ATS在networking呼叫期间执行最佳做法,包括使用HTTPS。
从Apple文档:
ATS防止意外泄露,提供安全的默认行为,并且易于采用。 您应该尽快采用ATS,无论您是创build新应用还是更新现有应用。 如果您正在开发新的应用程序,则应该专门使用HTTPS。 如果您有现有的应用程序,则应尽可能使用HTTPS,并尽快制定一个计划来迁移应用程序的其余部分。
在beta 1中,目前没有办法在info.plist中定义这个。 解决scheme是手动添加它:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Update1: 这是一个临时解决方法,直到您准备好采用iOS9 ATS支持。
Update2:欲了解更多详情,请参阅以下链接: http : //ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/
Update3:如果您尝试连接到只有TLS 1.0的主机(YOURHOST.COM)
将这些添加到您的应用的Info.plist
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>YOURHOST.COM</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>1.0</string> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> <false/> </dict> </dict> </dict>
如何处理iOS9中的SSL,一个解决scheme是这样做的:
正如苹果所说:
除非您在应用程序的Info.plist文件中指定了例外域,否则iOS 9和OSX 10.11要求您计划从中请求数据的所有主机都使用TLSv1.2 SSL。
Info.plistconfiguration的语法如下所示:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>yourserver.com</key> <dict> <!--Include to allow subdomains--> <key>NSIncludesSubdomains</key> <true/> <!--Include to allow insecure HTTP requests--> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <!--Include to specify minimum TLS version--> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> </dict> </dict> </dict>
如果您的应用程序(例如第三方Web浏览器)需要连接到任意主机,您可以像这样configuration它:
<key>NSAppTransportSecurity</key> <dict> <!--Connect to anything (this is probably BAD)--> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
如果您不得不这样做,最好是更新您的服务器以使用TLSv1.2和SSL,如果他们还没有这样做的话。 这应该被认为是暂时的解决方法。
截至今天,预发布文档没有提到任何具体的configuration选项。 一旦完成,我会更新答案以链接到相关文档。
欲了解更多信息,请访问iOS9AdaptationTips
苹果的应用程序运输安全技术非常方便 , 它帮助我们find了更安全的解决scheme来解决我们的问题
希望这会帮助别人。 我们遇到的问题连接到似乎完全有效的Amazon S3url,TLSv12 HTTPSurl。 原来,我们必须禁用NSExceptionRequiresForwardSecrecy
来启用S3使用的另一些密码。
在我们的Info.plist
:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>amazonaws.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionRequiresForwardSecrecy</key> <false/> </dict> </dict> </dict>
如果您在使用Amazon S3时遇到此问题,请尝试将其粘贴到您的info.plist上,作为顶级标记的直接子项
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>amazonaws.com</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> <key>amazonaws.com.cn</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>
你可以find更多的信息:
http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue
我从这里find解决办法。 它为我工作。
检查这个,它可能会帮助你。
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>myDomain.com</key> <dict> <!--Include to allow subdomains--> <key>NSIncludesSubdomains</key> <true/> <!--Include to allow HTTP requests--> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <!--Include to specify minimum TLS version--> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> </dict> </dict> </dict>
只需在.plist文件中添加以下字段
语法如下所示:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
更新:
从Xcode 7.1开始,您不需要在info.plist
手动inputNSAppTransportSecurity
Dictionary。
现在它会自动完成,意识到这是一个字典,然后自动完成Allows Arbitrary
负载以及。 info.plist截图
解决NSURLConnection HTTP加载失败的bug只需在info.plist中添加以下字典:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSAllowsArbitraryLoadsInWebContent</key> <true/> </dict>
我已经通过在info.plist中添加一些键来解决这个问题。 我遵循的步骤是:
我打开了我的项目的info.plist文件
添加了一个名为NSAppTransportSecurity的密钥作为字典。
添加一个名为NSAllowsArbitraryLoads的子项,并将其值设置为YES,如下图所示。 在这里input图像描述
清理项目,现在一切正常运行。
Ref链接: https : //stackoverflow.com/a/32609970
当我有这个错误时,这是对我有用的东西:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>example.com</key> <dict> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> </dict> </dict> </dict>
您可以尝试在文件RCTHTTPRequestHandler.m中添加此函数
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }