IOS9上的 NSULSession/NSULConnection 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)

更新: 我已经在我的解决方案中添加了多个更新: IOS9上的 NSULSession/NSULConnection HTTP 加载失败

139806 次浏览

找到解决办法:

在 iOS9中,ATS 在网络调用期间执行最佳实践,包括使用 HTTPS。

来自苹果的文档:

ATS 防止意外披露,提供安全的默认行为,并且易于采用。您应该尽快采用 ATS,无论您是创建一个新的应用程序还是更新一个现有的应用程序。如果你正在开发一个新的应用程序,你应该只使用 HTTPS。如果你有一个现有的应用程序,你应该尽可能多地使用 HTTPS,并且尽快创建一个计划来迁移你的应用程序的其余部分。

在 beta 1中,目前还没有办法在 info.plist 中定义它,解决方案是手动添加它:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

enter image description here

更新1: 这是一个临时的解决方案,直到您准备采用 iOS9 ATS 支持为止

更新2: 详情请参阅以下连结: 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>

我从 给你。中找到了解决方案,它对我很有效。

看看这个,可能对你有帮助。

<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>

如何在 iOS9中处理 SSL,一个解决方案是这样做:

正如 苹果所言: enter image description here enter image description here

enter image description here

除非在应用程序的 Info.plist 文件中指定异常域,否则 iOS 9和 OSX 10.11要求所有计划请求数据的主机使用 TLSv1.2 SSL。

Plist 配置的语法如下:

<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 浏览器)需要连接到任意主机,您可以这样配置它:

<key>NSAppTransportSecurity</key>
<dict>
<!--Connect to anything (this is probably BAD)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

如果您不得不这样做,最好是更新您的服务器以使用 TLSv1.2和 SSL,如果它们还没有这样做的话。这应该被认为是一个临时的解决方案。

到目前为止,预发布文档没有以任何特定的方式提到任何这些配置选项。一旦这样做,我将更新答案以链接到相关文档。

欲了解更多信息,请访问 IOS9AdaptationTips iOS9AdaptationTips

我通过在 info.plist 中添加一些键来解决这个问题:

我打开了我的项目的 info.plist 文件

添加了一个名为 NSAppTransport Security 的密钥作为字典。

添加了一个名为 NSAllowsArbitaryLoads 的子键作为布尔值,并将其值设置为 YES,如下图所示。 在此输入图像描述

清理项目,现在一切都像以前一样运行良好。

参考链接: https://stackoverflow.com/a/32609970

如果您像我一样遇到 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>

你可以在以下网址找到更多信息:

Http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue

更新:

从 Xcode 7.1开始,您不需要在 info.plist中手动输入 NSAppTransportSecurity Dictionary。

它现在将自动完成为您,意识到它是一个字典,然后自动完成的 Allows Arbitrary负载以及。 Info.plist 截图

只需在.plist 文件中添加以下字段

enter image description here

语法如下:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

当我犯这个错误的时候,这个方法对我很有效:

<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: (NSULSession *) session did ReceiveChallenge: (NSULAuthenticationChallenge *) Challenge 补充处理程序: (void (^)(NSULSessionAuthChallengeDisposition,NSULCredential * 凭证))补充处理程序 { CompletionHandler (NSULSessionAuthChallengeUseCredential,[ NSULCredential credentialForTrust: Challenge.protected Space.serverTrust ]) ; }

解决 NSURLConnection Http 加载失败的错误只需在 info.plist 中添加以下 Dict:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>

除了上面提到的答案,重新检查你的网址

您应该将 App Transport Security Settings添加到 info.plist,并将 Allow Arbitrary Loads添加到 App Transport Security Settings

enter image description here

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>