首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iOS 9上的NSURLSession/NSURLConnection HTTP加载失败

iOS 9上的NSURLSession/NSURLConnection HTTP加载失败
EN

Stack Overflow用户
提问于 2015-06-10 01:58:56
回答 13查看 138.9K关注 0票数 137

尝试在iOS9上运行我现有的应用程序,但在使用AFURLSessionManager时遇到故障。

代码语言:javascript
复制
__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

我得到以下错误:

代码语言:javascript
复制
Error Domain=NSURLErrorDomain Code=-999 "cancelled.

还可以获得以下日志:

代码语言:javascript
复制
 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

更新:我在我的解决方案中添加了多个更新:NSURLSession/NSURLConnection HTTP load failed on iOS 9

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2015-06-10 13:56:35

找到解决方案:

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

From Apple documentation:

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

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

代码语言:javascript
复制
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Update1: 这是一个临时解决方法,直到您准备好采用iOS9自动测试系统支持。

Update2:有关更多详细信息,请参阅以下链接:http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3:,如果您尝试连接到只有TLS1.0的主机(YOURHOST.COM)

将这些内容添加到应用程序的Info.plist中

代码语言:javascript
复制
<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>
票数 240
EN

Stack Overflow用户

发布于 2015-06-15 10:45:57

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

正如Apple所说:

除非您在应用程序的Info.plist文件中指定了异常域,否则iOS 9和OSX10.11需要为您计划从其请求数据的所有主机提供TLSv1.2SSL。

Info.plist配置的语法如下所示:

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

代码语言:javascript
复制
<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

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

到今天为止,预发行版文档没有以任何具体的方式提到这些配置选项。一旦完成,我将更新答案以链接到相关文档。

欲了解更多信息,请访问

票数 54
EN

Stack Overflow用户

发布于 2015-09-11 00:15:55

Apple's Technote on App Transport Security is very handy;它帮助我们找到了一个更安全的问题解决方案。

希望这能对其他人有所帮助。我们在连接到亚马逊S3 URL时遇到了问题,这些URL似乎是完全有效的,TLSv12 HTTPS URL。事实证明,我们必须禁用NSExceptionRequiresForwardSecrecy才能启用S3使用的另外几个密码。

在我们的Info.plist

代码语言:javascript
复制
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>
票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30739473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档