美文网首页iOS开发iOS 高级开发iOS调试技巧
正确适配苹果ATS审核要求的姿势

正确适配苹果ATS审核要求的姿势

作者: zyl04401 | 来源:发表于2016-11-20 16:56 被阅读3255次

    长期以来流传一则消息,苹果将于17年1月1日收紧ATS政策,强制接口使用HTTPS协议,据说是一位参加WWDC2016开发者大会的开发者在Twitter上发推文公布了这一消息。

    8C698265-695C-4AE4-A267-8ECE4ABFC674.png

    但是苹果真的这么激进吗?苹果开发者论坛里一名官方人员近日对此进行了澄清:

    FF19D433-D405-4FB7-ACD5-3886923AA26B.png

    首先,ATS的技术行为不会有任何变化(除了新增两个字段NSAllowsArbitraryLoadsInWebContent和NSRequiresCertificateTransparency,也就是更细分权限)。从技术角度来看,ATS在iOS10中和iOS9中的表现完全一致。
    那么到底是什么变化了呢?我们会收紧审核政策,即对于开发者添加的ATS例外(即HTTP接口),要求提供一个“合理的解释”。之所以要增加这么一个“麻烦”,是为了避免开发者们都无脑地全局关闭ATS,使得ATS偏离其初衷,形同虚设。开发者将无法再无脑地全局关闭ATS,并且添加例外时需要提供合理的解释。
    如此看来,苹果是想以这样的形式教育和促进HTTPS的普及,但也没有激进到一刀切的地步。一句话总结:你仍然可以在2017年之后使用HTTP​接口,但需要在ATS中添加例外,同时审核时多少说两句理由。更重要的是,你要知道这个政策会越来越紧。
    躲得过初一,躲不过十五。早点开始考虑向HTTPS迁移吧!

    针对 Info.plist

    iOS 10 在之前版本中,app都在 Info.plist 中添加 NSAppTransportSecurity
    字典并且将 NSAllowsArbitraryLoads
    设置为YES来禁用 ATS。iOS 10中又添加了 NSAllowsArbitraryLoadsInWebContent 字典,这会对迁移方案产生什么影响呢?根据苹果要求,app 已经不能再使用之前的方式来禁用 ATS,也就意味着 NSAllowsArbitraryLoads 只能设置为 NO,否则就需要在审核时说明 app 不支持ATS的原因。
    业内大神王巍已经总结了一幅非常直观的ATS对HTTP影响图表,如下:
    1、NSAllowsArbitraryLoads 设置为 YES 似乎可以解决问题,但这不符合苹果ATS要求。


    Paste_Image.png

    2、NSAllowsArbitraryLoads 设置为 NO,NSAllowsArbitraryLoadsInWebContent 设置为 YES,HTTP只有在iOS 10下的 WKWebview可用。

    E1AA34EA-640E-4F79-8BEF-7990BA8777C0.png

    3、NSAllowsArbitraryLoads ,NSAllowsArbitraryLoadsInWebContent 都设置为 NO,HTTP全部不可用。

    8C850327-049F-4004-BF9A-4CC9529AA242.png

    4、NSAllowsArbitraryLoads 设置为 YES,NSAllowsArbitraryLoadsInWebContent 设置为 NO,HTTP只支持iOS 9但不符合ATS要求,而且iOS 10下的 WKWebview也不可用。

    1FDB664B-FC60-47C1-888C-92F9E6D21700.png

    5、NSAllowsArbitraryLoads ,NSAllowsArbitraryLoadsInWebContent 都设置为 YES,HTTP只有 WKWebView 支持。

    9DBACE6B-7E3B-467F-B09B-E62E1785A0A3.png

    综合苹果要求,与实际产品业务需求,选择使用 NSAllowsArbitraryLoads 设置为 NO (避免审核风险),NSAllowsArbitraryLoadsInWebContent 设置为 YES(允许链接HTTP),设置HTTP域名访问白名单,使用WKWebView作为Web容器的技术方案。

    针对NSURLSession API

    只需将网络库更新至最新版的AFNetworking,即可完美支持HTTP、HTTPS的API请求。

    41EB44A0-4BB0-4614-B56C-D5C5453D9304.png

    针对Web容器

    使用 WKWebView 替换 UIWebView,业务对接采用Web与Native交互协议来解决兼容问题。iOS 10 中 WKWebView 完美支持HTTP、HTTPS的链接浏览(包括在线视频播放)。

    887917D7-858D-4004-B495-6E7FDE2873B1.png

    针对网络图片下载库SDWebImage

    测试环境下将会使用自签名的SLL证书,需要修改一些代码才能支持,生产环境下使用商业签名证书无需做修改。

    9DF0B1D0-4C03-4BC5-B6BB-61456DDC58D4.png

    针对第三方HTTP链接

    可以设置 NSExceptionDomains 属性来将需要排除强制验证的域名写进来。 也就是说我如果我们的 app 只访问我们自己的服务器, 我们可以将我们服务器的域名添加进来,依然可以继续使用 HTTP。但我们不能像之前那样简单粗暴的直接把所有的请求都通过。NSExceptionDomains 的设置方法如下, 比如我们要将 campus.chinahr.com 这个域名排除在 ATS 验证之外,就可以这样:

    WechatIMG36.jpeg

    不过苹果建议如果要提供浏览器类的服务,请使用SFSafariViewController(UI不可定制),优于WKWebView,后者更适用于对用户访问web内容更有把控的情况。

    相关文章

      网友评论

      • Dove_iOS:解决我的问题,NSAllowsArbitraryLoads,NSAllowsArbitraryLoadsInWebContent并用果然有坑!
      • 小唐羽锋:测试环境下将会使用自签名的SLL证书,需要修改一些代码才能支持,生产环境下使用商业签名证书无需做修改。 这句话当中是SSL证书,不是SLL证书。
      • 邦_:求助,ios11 添加白名单之后依旧无法访问,请问知道是哪里出了问题吗?
      • 流小星:老哥,ASIhttp怎么说?老项目
        流小星:@zyl04401 公司的老项目,网络请求一塌糊涂,真心乱,得花大量时间去改
        Alphts:@流小星 ASIHTTPRequest也是可以请求https的吧
        zyl04401:@流小星 要么改造ASI ,要么咬咬牙替换成AFN
      • xx明:你好,添加例外的时候,可以使用通配符么?例如,我项目中要排除 campus.chinahr.com,但是还有许多 r1.chinahr.com r2.chinahr.com , m1.chinahr.com , m2.chinahr.com等。。 我能否用 *.chinahr.com排除所有这样的情况。刚刚试了一下不行,有什么其他办法没。(就这个比方来说,我不能确定chinahr.com前到底有多少,一个个加的怕加不全)
        xx明:@zyl04401 谢谢,不过我找到了ATS中可以设置NSIncludesSubdomains 为YES则表明添加的该例外域名下的所有子域名也都允许http,默认为No。
        zyl04401:@xx明 不支持域名的通配符,只支持路径的通配。比如www.chinahr.cm/path/*。针对你的这种情况可以在加载web链接的时候判断是http就跳转到系统Safari,或者在提交审核的时候附上情况说明。比如浏览器类app 就只能说明情况了

      本文标题:正确适配苹果ATS审核要求的姿势

      本文链接:https://www.haomeiwen.com/subject/dwlypttx.html