iOS9中关于 NSURLSession/NSURLConnection HTTP load failed 的解决办法
最近为了新的存管app
上线,忙了近一个月,重新过了一段996
的日子,今天终于可以喘口气,继续更新博客了。本文记录一下在iOS 9
中发送https
请求遇到的问题及解决办法,希望通过本文,可以对ATS
的配置有一个更深入的了解。
问题描述
在开发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
的具体工作流程,请参考相关资料。
参考资料
#iOS问题记录#关于NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) on a subdomain?
iOS9中关于 NSURLSession/NSURLConnection HTTP load failed 的解决办法的更多相关文章
- NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
本篇文章由:http://xinpure.com/nsurlsessionnsurlconnection-http-load-failed-kcfstreamerrordomainssl-9802/ ...
- iOS ---------NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
遇到此问题的解决办法: 使用<NSURLSessionDelegate>中的didReceiveChallenge方法,方法中的代码如下: - (void)URLSession:(NSUR ...
- python导入sklearn模块出现DLL load failed的解决办法
笔者安装的python版本是2.7.6,最近在导入sklearn(版本:0.16.1)的模块时,经常出现DLL load failed的报错,具体截图如下: 解决办法与步骤如下: 由于sklearn的 ...
- 升级Xcode7&iOS9后,出现NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -980X)
在info.plist里面添加如下内容即可: <key>NSAppTransportSecurity</key> <dict> <key>NSAllow ...
- #iOS问题记录#关于NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)
响应Apple的号召,将APP里的HTTP请求全部升级为HTTPS,一切配置OK,正常的请求也没问题: 但,当使用SDwebImg缓存图片时,遇到了标题写的问题: 根据资料得: 这个问题的出现是因为i ...
- YARN加载本地库抛出Unable to load native-hadoop library解决办法
YARN加载本地库抛出Unable to load native-hadoop library解决办法 用官方的Hadoop 2.1.0-beta安装后,每次hadoop命令进去都会抛出这样一个War ...
- jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法
jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法 在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...
- 5个Android开发中比较常见的内存泄漏问题及解决办法
android中一个对象已经不需要了,但是其他对象还持有他的引用,导致他不能回收,导致这个对象暂存在内存中,这样内存泄漏就出现了. 内存泄漏出现多了,会是应用占用过多的没存,当占用的内存超过了系统 ...
- eclipse中运行出错:无法初始化主类的解决办法
问题描述:eclipse中运行程序时,出现如下错误 解决办法: 出现此类:无法初始化主类有可能是因为eclipse中Java的版本与JDK的版本不匹配,我开始用的时候eclipse中用的是Java s ...
随机推荐
- Hibernate快速入门实例
Hibernate工程项目创建基本步骤:导包(Hibernate依赖包.SQL驱动包).编写实体类.编写ORM映射配置文件.编写核心配置文件.编写测试驱动. 整个工程项目结构如下图: 一.导包 笔者使 ...
- 谈谈ES6箭头操作符
如果你会C#或者Java,你肯定知道lambda表达式,ES6中新增的箭头操作符=>便有异曲同工之妙.它简化了函数的书写.操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=& ...
- Docker 部署DropWizard
FROM index.alauda.cn/alauda/ubuntu MAINTAINER hongxiao.shou "shouhongxiao@163.com" COPY jd ...
- 利用base64函数,对文件进行转码加密
设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的内容就是通过base64转码后传输的.Base64-encoded后, 数据要比原始数据多占用 33% 左右的空间. ...
- jvm学习006 jvm内存结构分配
主要内容如下: JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一.JVM启动流程: JVM启动时,是由java命令/javaw命令来启动的. 二.JVM基本结构: JVM基本结构图: ...
- Oracle PIVOT 行转列方法
数据库中業種的存储如下图: SELECT * FROM M_TORIHIKISAKI_GYOSYU 其中GYIUSYU_CD字段代表不同的業種 而画面需要实现下图所示样式:(将每条数据的業種横向展开显 ...
- nopCommerce 3.9 大波浪系列 之 汉化-Roxy Fileman
官网:http://www.roxyfileman.com/ 中文包:zh.json 1.将zh.json包拷贝到Nop.Admin项目中"Content\Roxy_Fileman\lang ...
- 20170717_python_爬虫_网页数据解析_BeautifulSoup_数据保存_pymysql
上午废了老大劲成功登陆后,下午看了下BeautifulSoup和pymysql,晚上记录一下 自己电脑装的sublime,字体颜色竟然拷贝不下来 - - 写的过程中遇到了很多问题: 1.模拟登陆部分 ...
- 以图像分割为例浅谈支持向量机(SVM)
1. 什么是支持向量机? 在机器学习中,分类问题是一种非常常见也非常重要的问题.常见的分类方法有决策树.聚类方法.贝叶斯分类等等.举一个常见的分类的例子.如下图1所示,在平面直角坐标系中,有一些点 ...
- (转)memcached学习笔记1(windows 7 64bit 环境下安装memcached)
windows 7 64bit 环境下安装memcached 1.下载后解压到D:\memcached(下载地址:memcached-win64下载地址) 2.安装到windows服务,打开cmd命令 ...