收藏官网首页
查看: 29784|回复: 5

[问答] iOS ATS问题

6

主题

21

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
跳转到指定楼层
楼主
发表于 2016-12-14 20:21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
教您5分钟接入机智云,实现傻瓜式开发
2017年1月1日起,苹果App Store中的所有App都必须启用App Transport Security(ATS)安全功能。这个是真的吗?

相关帖子

562

主题

1222

帖子

8127

积分

版主

Rank: 7Rank: 7Rank: 7

积分
8127
沙发
发表于 2016-12-14 23:25:07 | 只看该作者
这个问题也就是说,必须支持HTTPS协议。


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 也同理):
1、机智云QQ群: 287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits /   机智云智能宠物屋go-kit
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息

562

主题

1222

帖子

8127

积分

版主

Rank: 7Rank: 7Rank: 7

积分
8127
板凳
发表于 2016-12-14 23:27:08 | 只看该作者
也就是说你的APP想在APPStore上架,就必须支持HTTPS协议。

1、机智云QQ群: 287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits /   机智云智能宠物屋go-kit
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息

1

主题

25

帖子

72

积分

注册会员

Rank: 2

积分
72
地板
发表于 2016-12-21 01:40:34 | 只看该作者
SDK for iOS 2.05.05.21618 已经支持了全https,可以保证苹果审核通过,可以替换一下。

27

主题

235

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

积分
1053
5#
发表于 2017-1-13 22:08:48 | 只看该作者
免费使用STM32、APP自动代码生成工具
上架一次就知道是否强制要求了

点评

不强制,需要特殊设置下  详情 回复 发表于 2017-12-13 12:05

6

主题

21

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
6#
 楼主| 发表于 2017-12-13 12:05:17 | 只看该作者
Tom 发表于 2017-1-13 22:08
上架一次就知道是否强制要求了

不强制,需要特殊设置下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表