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。

From Apple documentation:

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>