NSURLSession/NSURLConnection HTTP负载在IOS 9上失败

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

尝试在iOS 9上运行我现有的应用程序,但是在使用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)

提问于
用户回答回答于

找到解决办法:

在iOS 9中,ATS在网络呼叫期间执行最佳实践,包括使用HTTPS。

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

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

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

将这些添加到应用程序的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中的SSL,一种解决方案是这样做:

iOS 9和OSX10.11要求所有主机都需要TLSv1.2SSL,除非在应用程序的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>

如应用程序(例如第三方Web浏览器)需要连接到任意主机,可以这样配置它:

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

如果必须这样做,最好是更新服务器使用TLSv1.2和SSL,如果他们还没有这样做。这应被视为一种临时的解决办法。

扫码关注云+社区