NSURLSession/NSURLConnection HTTP 加载在 iOS 9 上失败
NSURLSession/NSURLConnection HTTP load failed on iOS 9
尝试 运行 我在 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 中,ATS 在网络调用期间实施最佳实践,包括使用 HTTPS。
ATS 可防止意外泄露,提供安全的默认行为,并且易于采用。无论您是创建新应用程序还是更新现有应用程序,都应尽快采用 ATS。如果您正在开发新的应用程序,您应该只使用 HTTPS。如果您已有应用程序,则应立即尽可能多地使用 HTTPS,并制定计划以尽快迁移应用程序的其余部分。
在 beta 1 中,目前无法在 info.plist 中定义它。解决方法是手动添加:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
更新 1:这是一个临时解决方法,直到您准备好采用 iOS9 ATS 支持。
Update2:详情请参考以下link:
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>
我从 here. 找到了解决方案,它对我有用。
检查这个,它可能对你有帮助。
<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,一种解决方法是:
正如 Apple 所说:
iOS 9 和 OSX 10.11 要求您计划从中请求数据的所有主机使用 TLSv1.2 SSL,除非您在应用的 Info.plist 文件中指定例外域。
Info.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>
如果您的应用程序(例如 third-party 网络浏览器)需要连接到任意主机,您可以这样配置:
<key>NSAppTransportSecurity</key>
<dict>
<!--Connect to anything (this is probably BAD)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
如果您必须这样做,最好更新您的服务器以使用 TLSv1.2 和 SSL(如果它们尚未这样做的话)。这应该被视为临时解决方法。
截至今天,预发布文档没有以任何特定方式提及任何这些配置选项。完成后,我会将 link 的答案更新到相关文档中。
有关详细信息,请转到 iOS9AdaptationTips
Apple's Technote on App Transport Security is very handy;它帮助我们找到了更安全的问题解决方案。
希望这会对其他人有所帮助。我们在连接到似乎完全有效的 Amazon S3 URL、TLSv12 HTTPS URL 时遇到了问题。事实证明,我们必须禁用 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>
我已经通过在 info.plist 中添加一些密钥解决了这个问题。我遵循的步骤是:
我打开了项目的 info.plist 文件
添加了名为 NSAppTransportSecurity 的密钥作为字典。
添加了一个名为 NSAllowsArbitraryLoads 的布尔值子项,并将其值设置为 YES,如下图所示。
在此处输入图片描述
清理项目,现在一切都运行和以前一样好了。
参考 Link:
如果您像我一样在使用 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
词典
它现在将为您自动完成,意识到它是一本字典,然后自动完成 Allows Arbitrary
负载。
info.plist screenshot
只需在您的 .plist 文件中添加以下字段
语法如下:
<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:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}
解决 NSURLConnection Http load failed bug Just Add following Dict in info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
除上述答案外,重新检查您的 url
您应该将 App Transport Security Settings
添加到 info.plist
并将 Allow Arbitrary Loads
添加到 App Transport Security Settings
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
尝试 运行 我在 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 中,ATS 在网络调用期间实施最佳实践,包括使用 HTTPS。
ATS 可防止意外泄露,提供安全的默认行为,并且易于采用。无论您是创建新应用程序还是更新现有应用程序,都应尽快采用 ATS。如果您正在开发新的应用程序,您应该只使用 HTTPS。如果您已有应用程序,则应立即尽可能多地使用 HTTPS,并制定计划以尽快迁移应用程序的其余部分。
在 beta 1 中,目前无法在 info.plist 中定义它。解决方法是手动添加:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
更新 1:这是一个临时解决方法,直到您准备好采用 iOS9 ATS 支持。
Update2:详情请参考以下link: 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>
我从 here. 找到了解决方案,它对我有用。
检查这个,它可能对你有帮助。
<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,一种解决方法是:
正如 Apple 所说:
iOS 9 和 OSX 10.11 要求您计划从中请求数据的所有主机使用 TLSv1.2 SSL,除非您在应用的 Info.plist 文件中指定例外域。
Info.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>
如果您的应用程序(例如 third-party 网络浏览器)需要连接到任意主机,您可以这样配置:
<key>NSAppTransportSecurity</key>
<dict>
<!--Connect to anything (this is probably BAD)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
如果您必须这样做,最好更新您的服务器以使用 TLSv1.2 和 SSL(如果它们尚未这样做的话)。这应该被视为临时解决方法。
截至今天,预发布文档没有以任何特定方式提及任何这些配置选项。完成后,我会将 link 的答案更新到相关文档中。
有关详细信息,请转到 iOS9AdaptationTips
Apple's Technote on App Transport Security is very handy;它帮助我们找到了更安全的问题解决方案。
希望这会对其他人有所帮助。我们在连接到似乎完全有效的 Amazon S3 URL、TLSv12 HTTPS URL 时遇到了问题。事实证明,我们必须禁用 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>
我已经通过在 info.plist 中添加一些密钥解决了这个问题。我遵循的步骤是:
我打开了项目的 info.plist 文件
添加了名为 NSAppTransportSecurity 的密钥作为字典。
添加了一个名为 NSAllowsArbitraryLoads 的布尔值子项,并将其值设置为 YES,如下图所示。 在此处输入图片描述
清理项目,现在一切都运行和以前一样好了。
参考 Link:
如果您像我一样在使用 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
词典
它现在将为您自动完成,意识到它是一本字典,然后自动完成 Allows Arbitrary
负载。
info.plist screenshot
只需在您的 .plist 文件中添加以下字段
语法如下:
<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:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}
解决 NSURLConnection Http load failed bug Just Add following Dict in info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
除上述答案外,重新检查您的 url
您应该将 App Transport Security Settings
添加到 info.plist
并将 Allow Arbitrary Loads
添加到 App Transport Security Settings
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>