iOS ATS / 非HTTPS被禁问题

前言

自iOS 9起苹果就开始推荐使用HTTPS,在iOS 9中默认是禁止非HTTPS的协议来访问网络的,但是还是给我我们缓冲的机会,解决方法:

  • Info.plist中添加NSAppTransportSecurity类型Dictionary
  • NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES

2016年6月WWDC之后,便传出从2017年1月1日起苹果提出所有新提交的App不允许使用NSAllowsArbitraryLoads来绕过ATS的限制,也就是说强制我们用HTTPS,如果不这样的话提交App可能会被拒绝。在2016年即将结束之际,我们也网站和APP也开始支持HTTPS的工作,但是之前也有传言说2017年1月1日App Store不会强制支持HTTPS,事实确实如此,下面苹果官网的一条公告:

Supporting App Transport Security
App Transport Security (ATS), introduced in iOS 9 and OS X v10.11, improves user security and privacy by requiring apps to use secure network connections over HTTPS. At WWDC 2016 we announced that apps submitted to the App Store will be required to support ATS at the end of the year. To give you additional time to prepare, this deadline has been extended and we will provide another update when a new deadline is confirmed. Learn more about ATS.

不管怎么说我们还是要支持HTTPS,原因三点:

  • iOS客户端强制支持HTTPS以后是必然的趋势
  • HTTPS协议解决了很多客户端和服务端安全问题
  • 领导们很关注,一直跟进服务端客户端的HTTPS的适配工作

问题描述

  • 问题一:一些第三方的SDK并没有及时支持HTTPS我们怎么解决呢?
  • 问题二:如何知道哪些接口是非HTTPS的呢?

解决办法

问题一:

把一些不支持HTTPS的第三方接口添加NSExceptionDomains白名单中,配置如下:

  • Info.plist中添加NSAppTransportSecurity类型Dictionary
  • NSAppTransportSecurity中添加NSExceptionDomains类型Dictionary
  • NSExceptionDomains中添加要支持的域(也就是非HTTPS的接口地址),域作为Key,类型为Dictionary
  • 在每个域下面添加三个Boolean类型的属性,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>qq.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>

问题二:

  • NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES,调试找到非HTTPS接口后记得改成NO
  • 使用Charles抓包,详细使用教程请查看:Charles 从入门到精通
  • 把抓到的一些非HTTPS的接口添加到白名单中,添加方法请看问题一解决办法

注意事项

1、抓包的时候发现有些图片的地址是非HTTPS的,也会导致图片无法显示,把地址添加到白名单中即可或协调服务端进行修改。
2、友盟统计、友盟分享、百度地图等SDK现已支持HTTPS记得更新哦。