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)
更新:
我为解决方案添加了多个更新:
NSURLSession / NSURLConnection HTTP在iOS 9上加载失败
#1 楼
找到的解决方案:在iOS9中,ATS会在网络调用过程中实施最佳实践,包括使用HTTPS。
从Apple文档中:
ATS可以防止意外披露,提供安全的默认行为,并且易于采用。无论您是创建新应用还是更新现有应用,都应尽快采用ATS。如果您要开发新应用,则应专门使用HTTPS。如果您已经有一个应用程序,则应立即使用HTTPS,并制定一个计划以尽快迁移其余应用程序。
在beta 1中,目前有没有办法在info.plist中定义它。解决方案是手动添加:
<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>
评论
请注意,您刚刚完全摆脱了应用程序传输安全性,因此应用程序中只有一项主要的iOS 9功能。这是一个hack,如果该hack使您的申请被拒绝,我也不会感到惊讶。更有可能允许将特定网站添加到该词典中。
– gnasher729
2015年6月10日上午10:11
@StevenPeterson您只能逐个案例获取Apple逐个排除的整个应用程序。我认为,如果Apple祝福您的应用具有此功能,他们会指示您包括此密钥。期望苹果很少这样做。
–马蒂奥河
2015年6月11日18:43
拜托,拜托,拜托,拜托,拜托-不要仅将例外添加到您的plist中,而继续进行“仅因为它起作用”。考虑用户数据的安全性,并实施SSL和其他安全性最佳做法。
–圣诞老人
2015年6月16日下午5:27
@ gnasher729,我知道最好支持TLS 1.2,而不仅仅是禁用ATS。但是,如果您依赖第三方API / Web服务,该怎么办。我不能强迫他们升级,该怎么办?
–伍德斯托克
15年6月28日在20:06
此答案中有一个细微的错误:NSTemporaryExceptionMinimumTLSVersion必须为TLSv1.0代替1.0,请参阅NSAppTransportSecurity异常域字典键
–mbi
16 Jan 19 '17:11
#2 楼
如何在iOS9中处理SSL,一种解决方案是:苹果所说:
除非您在应用的Info.plist文件中指定了例外域,否则iOS 9和OSX 10.11要求您计划向其请求数据的所有主机使用TLSv1.2 SSL。
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>
如果您的应用程序(例如第三方Web浏览器)需要连接到任意主机,则可以这样配置: br />
<key>NSAppTransportSecurity</key>
<dict>
<!--Connect to anything (this is probably BAD)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
如果必须执行此操作,则最好将服务器更新为使用TLSv1.2和SSL(如果尚未这样做)。
从今天开始,预发行版文档没有以任何特定方式提及任何这些配置选项。完成后,我将更新答案以链接到相关文档。
有关更多信息,请转到iOS9AdaptationTips
评论
SSL和TLS是HTTPS协议使用的不同加密层。因此,应该完全禁用SSL并使用TLS v1.2或更高版本。有关更多信息,我建议从以下资源开始:SSL / TLS Security 2015-简化快速指南
–康拉德·泰勒(Conrad Taylor)
15年6月16日在10:30
我只在下面的示例中添加了运气,您将NSAllowsArbitraryLoads设置为true。我的服务器仅使用TLS v1.2,我仍然必须这样做才能使其正常工作。非常沮丧。
–踏板车
15年7月8日在18:48
那么,有什么变通办法可以用来确定我的新应用将在App Store中获得批准,例如代理服务吗?
–乔什
16-10-26在21:52
#3 楼
苹果公司关于应用传输安全的技术说明非常方便。它帮助我们找到了一个更安全的解决方案。希望这对其他人有帮助。我们在连接到看起来完全有效的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>
评论
这是我的确切问题,并且可以立即解决!谢谢! :)
– Alex Zak
15年9月30日在11:05
这也解决了我遇到的问题;不同的情况可能需要不同的设置。好消息是,他的技术说明中还包含有关如何使用nsurl来帮助您总体上找到正确设置的信息。
–生态税
2015年10月7日在9:06
如果在Amazon S3之前使用CDN,则需要对cloudfront.net进行相同的操作。
– Raymond26
2015年12月9日在9:56
#4 楼
如果您像我那样遇到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
评论
上帝保佑你兄弟
– Vervatovskis
17年2月23日在16:08
#5 楼
我从这里找到了解决方案。并且对我有用。检查此内容可能会对您有所帮助。
<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>
#6 楼
只需在.plist文件中添加以下字段即可:语法如下所示:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
评论
这将允许所有http请求。可行,但不推荐。
– KVISH
16年3月11日在20:29
#7 楼
更新:从Xcode 7.1开始,您无需在
NSAppTransportSecurity
中手动输入info.plist
字典。现在它将为您自动完成,意识到它是字典,然后自动完成
Allows Arbitrary
加载。 info.plist屏幕截图
评论
这将允许所有http请求。可行,但不推荐。
– KVISH
16年3月11日在20:30
#8 楼
解决NSURLConnection Http加载失败的bug只需在info.plist中添加以下Dict:<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
#9 楼
我已经通过在info.plist中添加一些键解决了它。我遵循的步骤是:我打开了项目的info.plist文件
添加了一个名为NSAppTransportSecurity的键作为字典。
添加了一个子键称为NSAllowsArbitraryLoads的布尔值,并将其值设置为YES,如下图所示。
在此处输入图像描述
清理项目,现在一切都像以前一样正常运行。
参考链接:https://stackoverflow.com/a/32609970
#10 楼
当我遇到此错误时,这对我有用:<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>
#11 楼
您可以尝试在文件RCTHTTPRequestHandler.m中添加此功能。- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}
#12 楼
除了上述答案外,请重新检查您的网址评论
就我而言,我试图加载.html文件。
–Vaishnavi
18年1月4日在10:10
#13 楼
您应该将App Transport Security Settings
添加到info.plist
并将Allow Arbitrary Loads
添加到App Transport Security Settings
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
评论
您确定错误发生在第一行吗?我遇到过同样的问题。这似乎解决了这个问题:stackoverflow.com/questions/30720813/…