转自:http://www.cocoachina.com/ios/20150929/13598.html
中文快速导航:
1.iOS9网络适配_ATS:改用更安全的HTTPS(见Demo1)
i. WHAT(什么是SSL/TLS?跟HTTP和HTTPS有什么关系)
ii. WHY(以前的HTTP不是也能用吗?为什么要用SSL/TLS?Apple是不是又在反人类?)
iii. HOW(如何适配?---弱弱地问下:加班要多久?)
a.第1种情况:HTTPS Only (只有HTTPS,所有情况下都使用ATS)
b.第2种情况:Mix & Match(混合)
c.第3种情况:Opt Out(禁用ATS)
d.第4种情况:Opt Out With Exceptions(除特殊情况外,都不使用ATS)
e.Certificate Transparency
iv. Q-A
2.iOS9新特性_更灵活的后台定位(见Demo2)
3.企业级分发
i. iOS9以后,企业级分发ipa包将遭到与Mac上dmg安装包一样的待遇:默认不能安装,也不再出现“信任按钮”
ii. iOS9以后,企业分发时可能存在:下载的ipa包与网页两者的 bundle ID 无法匹配而导致下载失败的情况
4.Bitcode
5.iOS9 URL Scheme 适配_引入白名单概念(见Demo3)
i.常见 URL Scheme
ii.Q-A
6.iPad适配Slide Over 和 Split View
7.字体间隙变大导致 UI 显示异常
8.升级 Xcode7 后的崩溃与警告
i.iOS9 下使用 Masonry 会引起崩溃的一种情况
ii.Xcode 升级后,旧的状态栏的样式设置方式会引起警告
a.Demo4---navigationController状态栏样式新的设置方法
iii.Xcode7 在 debug 状态下也生成 .dSYM 文件引起的警告
iv.Xcode7 无法使用 8.x 系统的设备调试,一运行就报错 there is an intenal API error
v.使用了 HTML 的 iframe 元素可能导致无法从 Safari 跳转至 App
vi.iOS 9锁屏控制台会打印警告
vii.Xcode7 上传应用时提示 ITMS-90535 Unable to publish iOS app with xxx SDK 的问题
9.Demo5、Demo6--- 搜索 API
10.iOS国际化问题:当前设备语言字符串返回有变化
1. Demo1_iOS9网络适配_ATS:改用更安全的HTTPS
[摘要]为了强制增强数据访问安全, iOS9 默认会把 所有的http请求 所有从NSURLConnection 、 CFURL 、 NSURLSession发出的 HTTP 请求,都改为 HTTPS请求:iOS9.x-SDK编译时,默认会让所有从NSURLConnection 、 CFURL 、 NSURLSession发出的 HTTP请求统一采用TLS 1.2 协议。因为 AFNetworking 现在的版本底层使用了 NSURLConnection,众多App将被影响(基于iOS8.x-SDK的App不受影响)。服务器因此需要更新,以解析相关数据。如不更新,可通过在Info.plist 中声明,倒退回不安全的网络请求。而这一做法,官方文档称为ATS,全称为App Transport Security,是iOS9的一个新特性。
一个符合 ATS 要求的 HTTPS,应该满足如下条件:
Transport Layer Security协议版本要求TLS1.2以上
服务的Ciphers配置要求支持Forward Secrecy等
证书签名算法符合ATS要求等
官方文档App Transport Security Technote对ATS 的介绍:
注:有童鞋反映:服务器已支持TLS 1.2 SSL ,但iOS9上还是不行,还要进行本文提出的适配操作。
那是因为:要注意 App Transport Security 要求 TLS 1.2,而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的,ATS只信任知名CA颁发的证书,小公司所使用的 self signed certificate,还是会被ATS拦截。。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。对此,建议使用下文中给出的
NSExceptionDomains,并将你们公司的域名挂在下面。下文也会详细描述该问题。
官方文档App Transport Security Technote对CA颁发的证书要求:
"Certificates must be signed using a SHA256 or better signature hash
algorithm, with either a 2048 bit or greater RSA key or a 256 bit or
greater Elliptic-Curve (ECC) key. Invalid certificates result in a hard
failure and no connection"
在讨论之前,跟往常一样,先说下iOS程序猿们最关心的问题:
跟我有毛关系?需要我加班吗?!
首先咱们来看下业内对Apple这一做法的评论:
这是某社交App上讨论,看来业内还是吐槽声和肯定声同在。
结论是:"跟你很有关系,加班吧,少年!"
书归正传【严肃脸】,我们正式讨论下 WHAT,WHY,HOW:
WHAT(什么是SSL/TLS?跟HTTP和HTTPS有什么关系)
WHY(以前的HTTP不是也能用吗?为什么要用SSL/TLS?!Apple是不是又在反人类?)
HOW(如何适配?---弱弱地问下:加班要多久?)
1.WHAT(什么是SSL/TLS?跟HTTP和HTTPS有什么关系)
什么是SSL/TLS? SSL你一定知道,在此不做赘述。主要说下什么是TLS,还有跟HTTP和HTTPS有什么关系。
TLS 是 SSL 新的别称:
“TLS1.0”之于“SSL3.1”,犹“公元2015”之于“民国104”,“一千克”之于“一公斤”:称呼不同,意思相同。
SSL 3.0版本之后的迭代版本被重新命名为TLS 1.0:TLS 1.0=SSL 3.1。所以我们平常也经常见到 “SSL/TLS” 这种说法。
目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。目前主流浏览器都已经实现了TLS 1.2的支持。
常用的有下面这些:
SSL 2.0 SSL 3.0 TLS 1.0 (SSL 3.1) TLS 1.1 (SSL 3.1) TLS 1.2 (SSL 3.1)
那为什么标题是“使用HTTPS”而没有提及SSL和TLS什么事? “SSL/TLS”跟HTTP和HTTPS有什么关系?
要理解这个,要看下他们之间的关系:
HTTP+SSL/TLS+TCP = HTTPS
或者:HTTPS = “HTTP over SSL”
也就是说:Apple让你的HTTP采用SSL/TLS协议,就是让你从HTTP转到HTTPS。而这一做法,官方文档称为ATS,全称为App Transport Security。
2.WHY(以前的HTTP不是也能用吗?为什么要用SSL/TLS?Apple是不是又在反人类?)
不使用SSL/TLS的HTTP通信,就是不加密的通信!
不使用SSL/TLS的HTTP通信,所有信息明文传播,带来了三大风险:
窃听风险(eavesdropping):第三方可以获知通信内容。
篡改风险(tampering):第三方可以修改通信内容。
冒充风险(pretending):第三方可以冒充他人身份参与通信。
SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
所有信息都是加密传播,第三方无法窃听。
具有校验机制,一旦被篡改,通信双方会立刻发现。
配备身份证书,防止身份被冒充。
SSL/TLS的作用,打个比方来讲:
如果原来的 HTTP 是塑料水管,容易被戳破;那么如今新设计的 HTTPS 就像是在原有的塑料水管之外,再包一层金属水管(SSL/TLS协议)。一来,原有的塑料水管照样运行;二来,用金属加固了之后,不容易被戳破。
3.HOW(如何适配?---弱弱地问下:加班要多久?)
正如文章开头所说:
TLS 1.2 协议 强制增强数据访问安全 系统 Foundation
框架下的“相关网络请求”将不再默认使用 HTTP 等不安全的网络协议,而默认采用 TLS
1.2。服务器因此需要更新,以解析相关数据。如不更新,可通过在 Info.plist 中声明,倒退回不安全的网络请求。
总之:
要么咱们iOS程序猿加班,要么后台加班:
方案一:立即让公司的服务端升级使用TLS 1.2,以解析相关数据。
方案二:虽Apple不建议,但可通过在 Info.plist 中声明,倒退回不安全的网络请求依然能让App访问指定http,甚至任意的http,具体做法见gif图,示例Demo见Demo1
这也是官方文档和WWDC给出的解决方案:
a.Apple官方文档
b.WWDC Session: "Networking with NSURLSession" session( 【WWDC 2015 session 703, “Privacy and Your App” O网页链接 】, 时间在30:18左右)
即使你的应用使用的是:你没有权限控制的CDN (Content Delivery Network),而且它不支持HTTPS!
也别担心,Apple都替你考虑好了:
正如你在上图中看到的:苹果官方提供了一些可选配置项来决定是否开启ATS模式,也就是可以选择开启或者不开启。
开发者可以针对某些确定的URL不使用ATS,这需要在工程中的info.plist中标记NSExceptionDomains。在NSExceptionDomains字典中,可以显式的指定一些不使用ATS的URL。这些你可以使用的例子可以是:
NSIncludesSubdomains
NSExceptionAllowInsecureHTTPLoads
NSExceptionRequiresForwardSecrecy
NSExceptionMinimumTLSVersion
NSThirdPartyExceptionAllowsInsecureHTTPLoads
NSThirdPartyExceptionMinimumTLSVersion
NSThirdPartyExceptionRequiresForwardSecrecy
这些关键字使我们可以更加细致的设置针对不使用ATS的域名情况下禁用ATS或者一些特殊的ATS选项。
你可能注意到一些关键字像是使用了一些其他关键字中的词但是在前面加上了"ThirdParty"字样,比如列表里最后三个:
NSThirdPartyExceptionAllowsInsecureHTTPLoads
NSThirdPartyExceptionMinimumTLSVersion
NSThirdPartyExceptionRequiresForwardSecrecy
在功能上,这些关键字与不含有"ThirdParty"的关键字有同样的效果。而且实际运行中所调用的代码将会完全忽略是否使用"ThirdParty"关键字。你应该使用适用于你的场景的关键字而不必过多考虑这些。
关于App Transport Security,每个应用都属于4个大类当中的一类。我们来看看每一个大类都是怎样影响应用的。
下面分别做一下介绍:
1.HTTPS Only (只有HTTPS,所有情况下都使用ATS)
如果你的应用只基于支持HTTPS的服务器,那么你太幸运了。你的应用不需要做任何改变。唯一需要做的事情就是使用 NSURLSession 。如果你的开发目标是iOS 9或者 OS X EI Capitan之后,ATS 的最佳实践将会应用到所有基于 NSURLSession 的网络。但也有人遇到过这样的疑惑:服务器已支持TLS 1.2 SSL ,但iOS9上还是不行,还要进行本文提出的适配操作。那是因为:要注意 App Transport Security 要求 TLS 1.2,而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的,ATS只信任知名CA颁发的证书,小公司所使用的 self signed
certificate,还是会被ATS拦截。。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。对此,建议使用下文中给出的
NSExceptionDomains,并将你们公司的域名挂在下面。
官方文档App Transport Security Technote对CA颁发的证书要求:
Certificates must be signed using a
SHA256 or better signature hash algorithm, with either a 2048 bit or
greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key.
Invalid certificates result in a hard failure and no connection
2.Mix & Match(混合)
你的应用与一个不符合ATS要求的服务器工作是很有可能的,
当你遇到以下三个不符合 ATS 要求的服务器的域名时:
api.insecuredomain.com
cdn.domain.com
thatotherdomain.com
你可以分别设置如下:
api.insecuredomain.com
Info.plist 配置中的XML源码如下所示:
在 plist 文件里显示如下:
我们定义的第一个“例外”(Exception)告诉ATS当与这个子域交互的时候撤销了必须使用HTTPS的要求。注意这个仅仅针对在“例外”
(Exception)中声明了的子域。非常重要的一点是要理解NSExceptionAllowsInsecureHTTPLoads关键字并不仅仅只
是与使用HTTPS相关。这个“例外”(Exception)指明了对于那个域名,所有的App Transport Security的要求都被撤销了。
cdn.domain.com Info.plist 配置中的XML源码如下所示:
在 plist 文件里显示如下:
很可能你的应用是与一个支持HTTPS传输数据的服务器交互,但是并没有使用TLS
1.2或更高。在这种情况下,你定义一个“例外”(Exception),它指明应该使用的最小的TLS的版本。这比完全撤销那个域名的App
Transport Security要更好更安全。
thatotherdomain.com
Info.plist 配置中的XML源码如下所示:
在 plist 文件里显示如下:
NSIncludesSubdomains 关键字告诉 App Transport Security 这个“例外(Exception)适用于这个特定域名的所有子域。这个“例外”(Exception)还进一步通过扩展可接受的密码列表来定义这个域名可以使用不支持forward secrecy( NSExceptionRequiresForwardSecrecy ) 协议的密码。想了解更多关于forward secrecy的信息,推荐去看官方文档Apple's technote。
如果你的App中同时用到了这三个域名,那么应该是这样: