NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL
解决办法
在AppDelegate中添加
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
这个问题会连 以下问题一起解决
nw_coretls_callback_handshake_message_block_invoke_3 tls_handshake_continue: [-9807]
在使用第三方登录以及分享等功能的时候要注意以下三个方法的实现,如果有某一个没有具体实现的话,也可能会有问题的
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
http://www.cnblogs.com/fishbay/p/7216142.html
问题描述
在开发app时,遇到了在iOS 9中发送https请求报错的问题:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)
我们知道,在iOS 9以后,所有的网络请求默认使用https,如果你发送http请求,则会报如下错误,但是我们可以通过在info.plist中设置NSAppTransportSecurity - NSAllowsArbitraryLoads的值为YES来允许http请求:
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
info.plist
这样解决了http的请求问题,但是我发送是https请求,还是出现HTTP laod failed的问题,尽管使用上述方法也可以解决,但这不是根本的解决办法。
解决办法
经过分析,怀疑是TLS的问题,因为iOS 9默认需要TLS1.2版本来加密数据,如果服务端不支持TLS1.2,则URLSession:task:didCompleteWithError:会返回nil的error,但是后端开发同事说服务器支持TLS1.0、TLS1.1和TLS1.2,这好像又不是TLS的问题。于是不放心,用nscurl测试了一下测试服务器,果然不支持TLS1.2,问题找到。
# 加 --verbose 是为了显示详细的调试信息
/usr/bin/nscurl --ats-diagnostics --verbose https://testresource.chaoaicai.com
通过输出看出,服务器只支持TLS1.0,于是让后台开发的同事测试并修改后,再次测试,发现服务器支持TLS1.2了,并且https的网络请求也正常了。
ATS异常配置
其实,针对服务器不支持TLS1.2,而客户端发送https请求还有其它的解决方法,就是配置ATS,设置最低的TLS版本即可,如下info.plist所示:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<!--你的https域名-->
<key>testresource.chaoaicai.com</key>
<dict>
<!--允许子域-->
<key>NSIncludesSubdomains</key>
<true/>
<!--TLS允许的最低版本号-->
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
</dict>
</dict>
</dict>
其中,NSExceptionDomains的具体设置项介绍如下,可以更详细的了解ATS的异常配置
NSIncludesSubdomains:是否应用到子域名,默认是NO
NSExceptionAllowsInsecureHTTPLoads:是否允许http请求,YES(允许),默认是NO
NSExceptionMinimumTLSVersion:最低的TLS版本
NSExceptionRequiresForwardSecrecy:是否需要前置加密,NO(允许加密,但不支持PFS:perfect forward secrecy),默认是YES
NSRequiresCertificateTransparency:是否需要有效的签名证书,YES(需要),默认是NO
本文只是简单的介绍了一下如何配置ATS,及解决由于服务器不支持TLS1.2造成的https无法访问的问题,需要了解https、TLS的具体工作流程,请参考相关资料。
分享到:
相关推荐
您可以阅读我的博客文章,以获取有关此更新的其他信息: 如果收到这样的错误: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824) Error : Error Domain=NSURLErrorDomain Code=-...
与NSURLSession和NSURLConnection一起使用的证书固定的Swift实现 。 2017年1月9日:针对Swift 3.0进行了更新。 如果您想使用 2018-07-25:已针对Swift 4.0更新。 如果您想使用 如果您不使用或 ,则证书固定会非常...
一、Podfile.lock文件 上文讲过,在开始使用CocoaPods,执行完pod install之后,会生成一个Podfile.lock文件。这个文件看起来跟我们关系不大,实际上绝对不应该忽略它。... - AFNetworking/NSURLSession
早期,Objective-C的开发者通常使用NSURLConnection来执行这些任务,但随着iOS 7的发布,Apple引入了更现代、更高效的NSURLSession API。本篇文章将深入探讨如何将原本使用NSURLConnection的同步任务转换为使用...
NSURLSession+SynchronousTask是一个NSURLSession类别,它将NSURLConnection类(记住sendSynchronousRequest:returningResponse:error: NSURLSession )同步任务带到NSURLSession 。 在内部,类别使用GCD等待任务...
对于iOS,尽管NSURLConnection已经被弃用并被NSURLSession取代,但理解其工作原理仍然有价值。NSURLConnection提供了一个异步的接口,用于发起网络请求并处理响应。它支持HTTP请求方法(GET, POST等),可以处理...
NSURLConnection是iOS开发中用于网络...对于现代的iOS开发,虽然NSURLSession已经取代了NSURLConnection,但理解NSURLConnection的原理和使用仍然是十分必要的,因为它可以帮助开发者更好地理解网络请求的底层机制。
VCRURLConnection VCRURLConnection是一个受启发的iOS和OSX API,用于记录和重播HTTP交互 ...// use either NSURLSession or NSURLConnection NSURLSessionDataTask *task = [[ NSURLSession sharedSession ] dataTas
详细的使用大家可以参考我的博客《Swift UITableView瀑布流/NSURLConnection异步网络请求》http://blog.csdn.net/zhuming3834/article/details/51014467 GitHub地址:...
同时,为了优化性能和用户体验,可以考虑使用`NSURLSession`代替`NSURLConnection`,因为前者提供了更多的功能和更好的性能。但`NSURLConnection`对于简单的异步下载任务仍然是一个有效且实用的选择。
NSURLSession是Apple官方提供的网络编程接口,替代了原来的NSURLConnection。它更加高效,支持多任务并发,并且在后台模式下仍能进行下载。NSURLSession适用于更复杂的网络编程需求。 1. **创建会话配置**:首先,...
在iOS 9之后,`NSURLSession`取代了`NSURLConnection`,但在讲解断点续传的初级概念时,`NSURLConnection`仍然适用。 1. **断点续传原理**:断点续传的核心在于记录已下载部分的文件信息,包括文件大小、最后下载的...
NSURLSession是由Apple提供的一个网络编程接口,它取代了旧的NSURLConnection,提供了异步、并发的网络请求处理能力。通过NSURLSession,开发者可以实现后台下载、上传任务,以及数据传输状态的跟踪。 ### 2. 创建...
iOS网络基础课程主要涉及了iOS平台中网络编程的核心组件,包括但不限于NSURLSession和NSURLConnection。课程内容涵盖了从基础的URL加载系统到具体的编程实践,包括会话管理、任务类型、代理交互、缓存管理、cookie...
`URLCache`是Apple的URL加载系统(NSURLSession或NSURLConnection)的一部分,它遵循HTTP缓存规范,提供了对网络请求结果的本地存储。 **URLCache的基本工作原理** `URLCache`的工作流程主要包括以下几个步骤: 1...
"DemoNetwork"这个项目专注于演示如何使用原生的网络请求方法,即NSURLSession和NSURLConnection。这两种方式都是苹果提供的API,用于实现iOS应用与服务器之间的数据交互。 首先,我们来看NSURLSession。它是iOS 7...
在iOS7后,NSURLSession基本代替了NSURLConnection进行网络开发,在iOS9后,NSURLConnection相关方法被完全的弃用,iOS系统有向下兼容的特性,尽管NSURLConnection已经被弃用,但在开发中,其方法依然可以被使用,...
NSURLSession是由苹果在iOS7引入的,替代了之前的NSURLConnection,提供了更加高效和灵活的网络编程模型。它支持后台下载、上传任务,可以设置代理或使用数据任务来处理网络请求,同时提供了对HTTP/2协议的支持。 1...
在iOS开发中,`NSURLSession` 是苹果提供的一种用于网络数据传输的高级API,它在iOS 7及以上版本中被引入,取代了之前的`NSURLConnection`。`NSURLSession` 不仅提供了基本的数据请求功能,还支持断点续传、后台下载...
这个组件在iOS 7及更高版本中被引入,取代了旧的NSURLConnection,并提供了更加灵活、高效且功能丰富的网络通信接口。下面将详细介绍NSURLSession的使用方法以及相关知识点。 1. **初始化配置** - `...