关于 iOS 10 中 ATS 的问题
WWDC 15 提出的 ATS (App Transport Security) 是 Apple 在推进网络通讯安全的一个重要方式。在 iOS 9 和 OS X 10.11 中,默认情况下非 HTTPS 的网络访问是被禁止的。当然,因为这样的推进影响面非常广,作为缓冲,我们可以在 Info.plist 中添加 NSAppTransportSecurity
字典并且将 NSAllowsArbitraryLoads
设置为 YES
来禁用 ATS。相信大家都已经对这个非常熟悉了,因为我自己也维护了一些网络相关的框架,所以我还自己准备了一个小脚本来快速关闭 ATS。
不过,WWDC 16 中,Apple 表示将继续在 iOS 10 和 macOS 10.12 里收紧对普通 HTTP 的访问限制。从 2017 年 1 月 1 日起,所有的新提交 app 默认是不允许使用 NSAllowsArbitraryLoads
来绕过 ATS 限制的,也就是说,我们最好保证 app 的所有网络请求都是 HTTPS 加密的,否则可能会在应用审核时遇到麻烦。
现在 (2016-11-28),这方面的相关规定和几个事实如下:
- 默认情况下你的 app 可以访问加密足够强 (TLS v1.2 以上,AES-128 和 SHA-2 以及 ECDHC 等) 的 HTTPS 内容。这对所有的网络请求都有效,包括
NSURLSession
,通过 AVFoundation 访问的流媒体,UIWebView
以及WKWebView
等。 - 你依然可以添加
NSAllowsArbitraryLoads
为YES
来全面禁用 ATS,不过如果你这么做的话,需要在提交 app 时进行说明,为什么需要访问非 HTTPS 内容。一般来说,可能简单粗暴地开启这个选项,而又无法找到正当理由的 app 会难以通过审核。 - 相比于使用
NSAllowsArbitraryLoads
将全部 HTTP 内容开放,选择使用NSExceptionDomains
来针对特定的域名,通过设定该域名下的NSExceptionAllowsInsecureHTTPLoads
来开放 HTTP 应该要相对容易过审核。“需要访问的域名是第三方服务器,他们没有进行 HTTPS 对应”会是审核时的一个可选理由,但是这应该只需要针对特定域名,而非全面开放。如果访问的是自己的服务器的话,可能这个理由会无法通过。 - 对于网页浏览和视频播放的行为,iOS 10 中新加入了
NSAllowsArbitraryLoadsInWebContent
和NSAllowsArbitraryLoadsForMedia
键。通过将它们设置为YES
,可以让你的 app 中的UIWebView
、WKWebView
或者使用AVFoundation
播放的在线视频不受 ATS 的限制。虽然依然需要在审核时进行说明,但这也应该是绝大多数使用了相关特性的 app 的首选。坏消息是这个键在 iOS 9 中并不会起作用。
总结一下就是以下两点:
- 对于 API 请求,基本上是必须使用 HTTPS 的,特别是如果你们自己可以管理服务器的话。可能需要后端的同学尽快升级到 HTTPS (不过话说虽然是用 Let's Encrypt 的,我一个个人博客都启用 HTTPS 了,作为 API 的用户服务器,还不开 HTTPS 真有点说不过去)。如果使用的是第三方的 API,而他们没有提供 HTTPS 支持的话,需要在
NSExceptionDomains
中进行添加。 - 如果你的 app 只支持 iOS 10,并且有用户可以自由输入网址进行浏览的功能,或者是在线视频音频播放功能的话,只加入
NSAllowsArbitraryLoadsInWebContent
或/和NSAllowsArbitraryLoadsForMedia
,并且将组件换成UIWebView
或WKWebView
,以及AVFoundation
中的 player 就可以了。如果你还需要支持 iOS 9,并且需要访问网页和视频的话,可能只能去开启NSAllowsArbitraryLoads
然后提交时进行说明,并且看 Apple 审核员的脸色决定让不让通过了。除了WKWebKit
以外,另外一个访问网页的选择是使用SFSafariViewController
。因为其实SFSafariViewController
就是一个独立于 app 的 Safari 进程,所以它完全不受 ATS 的限制。 - 如果你需要使用内网,可以设置
NSAllowsLocalNetworking
,而不必担心 SSL 连接的问题。
另外,当 NSAllowsArbitraryLoads
和 NSAllowsArbitraryLoadsInWebContent
或 NSAllowsArbitraryLoadsForMedia
同时存在时,根据系统不同,表现的行为也会不一样。简单说,iOS 9 只看 NSAllowsArbitraryLoads
,而 iOS 10 会优先看 InWebContent
和 ForMedia
的部分。在 iOS 10 中,要是后两者存在的话,在相关部分就会忽略掉 NSAllowsArbitraryLoads
;如果不存在,则遵循 NSAllowsArbitraryLoads
的设定。说起来可能有点复杂,我在这里总结了一下根据 NSAppTransportSecurity
中设定条件不同,所对应的系统版本和请求组件的行为的不同,可以作为你设置这个字典时的参考 (表中使用了 NSAllowsArbitraryLoadsInWebContent
作为例子,NSAllowsArbitraryLoadsForMedia
也同理):
ATS 设定 | 使用的组件 | iOS 9 HTTP | iOS 10 HTTP | 备注 |
---|---|---|---|---|
NSAllowsArbitraryLoads: NO | WebView | ❌ | ❌ | 默认行为 |
URLSession | ❌ | ❌ | ||
NSAllowsArbitraryLoads: YES | WebView | ✅ | ✅ | 彻底禁用 ATS |
URLSession | ✅ | ✅ | 审核时需要说明理由 | |
NSAllowsArbitraryLoads: NO & NSAllowsArbitraryLoadsInWebContent: YES | WebView | ❌ | ✅ | 只对网页内容禁用 ATS |
URLSession | ❌ | ❌ | 保证 API 的安全性 | |
NSAllowsArbitraryLoads: NO & NSAllowsArbitraryLoadsInWebContent: NO | WebView | ❌ | ❌ | |
URLSession | ❌ | ❌ | ||
NSAllowsArbitraryLoads: YES & NSAllowsArbitraryLoadsInWebContent: NO | WebView | ✅ | ❌ | 对于 iOS 10,NSAllowsArbitraryLoadsInWebContent 存在时忽略 NSAllowsArbitraryLoads 的设置 |
URLSession | ✅ | ❌ | iOS 9 将继续使用 NSAllowsArbitraryLoads | |
NSAllowsArbitraryLoads: YES & NSAllowsArbitraryLoadsInWebContent: YES | WebView | ✅ | ✅ | 对于 iOS 10,NSAllowsArbitraryLoadsInWebContent 存在时忽略 NSAllowsArbitraryLoads 的设置 |
URLSession | ✅ | ❌ | iOS 9 将继续使用 NSAllowsArbitraryLoads |
该列表是根据 Apple prerelease 的文档中关于
NSAppTransportSecurity
和NSAllowsArbitraryLoadsInWebContent
部分的描述作出的。如果您发现这个行为发生了变化,或者上面的列表存在问题,欢迎留言,我会进行更正。
作为参考,这里将有效的 NSAppTransportSecurity
字典结构也一并附上:
NSAppTransportSecurity : Dictionary {NSAllowsArbitraryLoads : BooleanNSAllowsArbitraryLoadsForMedia : BooleanNSAllowsArbitraryLoadsInWebContent : BooleanNSAllowsLocalNetworking : BooleanNSExceptionDomains : Dictionary {<domain-name-string> : Dictionary { NSIncludesSubdomains : Boolean NSExceptionAllowsInsecureHTTPLoads : Boolean NSExceptionMinimumTLSVersion : String NSExceptionRequiresForwardSecrecy : Boolean // Default value is YES NSRequiresCertificateTransparency : Boolean } } }
不得不说,Apple 使用自己现在的强势地位,在推动技术进步上的做的努力是有目共睹的。不论是前几天强制支持 IPv6,还是现在的 HTTPS,其实都不是很容易就能作出的决定。而为用户构建一个更安全的使用环境,可能不仅是 Apple 单方面可以做的,也是需要开发者来配合的一件事情。尽快适配更进步和安全的使用方式,会是一件双赢的事情。
转载于:https://www.cnblogs.com/huzhenchao/p/6900707.html
关于 iOS 10 中 ATS 的问题相关推荐
- iOS 10 适配 ATS
一. HTTPS 其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的 ...
- 黑苹果不能imessage_如何修复iMessage在iOS 10中不显示消息效果
黑苹果不能imessage iMessage got a huge update in iOS 10, adding things like third-party app integration, ...
- ios raise_如何在iOS 10中关闭“ Raise to Wake”
ios raise Raise to Wake is a new Lock screen feature available in iOS 10. It allows you to wake your ...
- ios 启用 证书_如何在iOS 10中启用就寝提醒,轻柔的唤醒和睡眠跟踪
ios 启用 证书 If you have trouble regularly getting a full night's sleep, the new Bedtime feature in iOS ...
- 使用 Swift 在 iOS 10 中集成 Siri —— SiriKit 教程
使用 Swift 在 iOS 10 中集成 Siri -- SiriKit 教程 转载地址:http://swift.gg/2016/06/28/adding-siri-to-ios-10-apps- ...
- ios手写_如何在iOS 10中发送手写和数字触摸消息
ios手写 We live in a very high-tech world. We walk around with our heads bowed down to our phones tapp ...
- 在iOS 10中创建iMessage应用
介绍 在iOS 10上,Apple通过名为iMessage应用程序的新功能向第三方开发人员开放了Messages应用程序. 开发人员现在可以创建自己的各种类型的应用程序,从贴纸包到完全交互式的界面,都 ...
- iOS 10中不推荐使用UILocalNotification(UILocalNotification is deprecated in iOS 10)
It may be a question in advance but I wonder what to use instead of UILocalNotification in iOS 10. I ...
- ios 开发账号 退出协作_如何在iOS 10中的Notes上进行协作
ios 开发账号 退出协作 iOS' Notes app provides a convenient way to remember the great ideas you come up with ...
最新文章
- android weight(权重)的具体分析
- c# list排序的三种实现方式 (转帖)
- Python 深度学习目标检测评价指标 :mAP、Precision、Recall、AP、IOU等
- 测试工具iometer, iozone, bonnie++
- vs2012建立java,在Microsoft Visual Studio 2012中使用Java
- JavaWeb编程中如果jar包存在但显示无法输出,就在IDEA的项目发布中添加lib依赖!
- 达而稳 驱动 fl2000dx_Intel-AMD核显驱动没人管:Win10无法升级,不要撞车
- Ubuntu 下 MySQL 数据自执行备份
- EJB到底是什么,真的那么神秘吗?
- 闪灵CMS插件自动采集文章主动推送给搜索引擎
- win10桌面计算机打不开,win10开机后桌面无响应,win10开机后啥都打不开
- keil更改黑色背景颜色
- 芯片解密LPC2119单片机基本特性
- 用proteus实现STM32仿真
- puber們這一季的愛情啊
- Lab5: xv6 lazy page allocation
- oracle导入多个dmp文件到一个用户,Oracle dmp文件导入(还原)到不同的表空间和不同的用户下...
- 北京某公司前端笔试题及其答案
- java_JSP_1
- c语言中的头文件stdlib.h的作用,c语言includestdlib.h什么意思?
热门文章
- 初创公司MongoDB最佳实践策略和躲坑秘笈
- Win7 SP1 msado15 unresolved external symbol
- PolarSSL 1.2.0 发布,SSL 加密库
- 冒号课堂§4.3:汇总范式
- 3.7 PPP协议和HDLC协议
- vivado----fpga硬件调试 (一)----mark_debug
- 通信系统中对眼图的理解(二)
- centos7安装mysql .gz_转:centos7安装mysql.tar.gz
- jsp java el_jsp之EL表达式
- Word中的自定义编号详解及疑难汇总!