在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]); }