長期以來流傳一則消息,蘋果將于17年1月1日收緊ATS政策,強制接口使用HTTPS協(xié)議,據(jù)說是一位參加WWDC2016開發(fā)者大會的開發(fā)者在Twitter上發(fā)推文公布了這一消息。

但是蘋果真的這么激進嗎?蘋果開發(fā)者論壇里一名官方人員近日對此進行了澄清:

首先,ATS的技術(shù)行為不會有任何變化(除了新增兩個字段NSAllowsArbitraryLoadsInWebContent和NSRequiresCertificateTransparency,也就是更細分權(quán)限)。從技術(shù)角度來看,ATS在iOS10中和iOS9中的表現(xiàn)完全一致。
那么到底是什么變化了呢?我們會收緊審核政策,即對于開發(fā)者添加的ATS例外(即HTTP接口),要求提供一個“合理的解釋”。之所以要增加這么一個“麻煩”,是為了避免開發(fā)者們都無腦地全局關(guān)閉ATS,使得ATS偏離其初衷,形同虛設(shè)。開發(fā)者將無法再無腦地全局關(guān)閉ATS,并且添加例外時需要提供合理的解釋。
如此看來,蘋果是想以這樣的形式教育和促進HTTPS的普及,但也沒有激進到一刀切的地步。一句話總結(jié):你仍然可以在2017年之后使用HTTP?接口,但需要在ATS中添加例外,同時審核時多少說兩句理由。更重要的是,你要知道這個政策會越來越緊。
躲得過初一,躲不過十五。早點開始考慮向HTTPS遷移吧!
針對 Info.plist
iOS 10 在之前版本中,app都在 Info.plist 中添加 NSAppTransportSecurity
字典并且將 NSAllowsArbitraryLoads
設(shè)置為YES來禁用 ATS。iOS 10中又添加了 NSAllowsArbitraryLoadsInWebContent 字典,這會對遷移方案產(chǎn)生什么影響呢?根據(jù)蘋果要求,app 已經(jīng)不能再使用之前的方式來禁用 ATS,也就意味著 NSAllowsArbitraryLoads 只能設(shè)置為 NO,否則就需要在審核時說明 app 不支持ATS的原因。
業(yè)內(nèi)大神王巍已經(jīng)總結(jié)了一幅非常直觀的ATS對HTTP影響圖表,如下:
1、NSAllowsArbitraryLoads 設(shè)置為 YES 似乎可以解決問題,但這不符合蘋果ATS要求。

2、NSAllowsArbitraryLoads 設(shè)置為 NO,NSAllowsArbitraryLoadsInWebContent 設(shè)置為 YES,HTTP只有在iOS 10下的 WKWebview可用。

3、NSAllowsArbitraryLoads ,NSAllowsArbitraryLoadsInWebContent 都設(shè)置為 NO,HTTP全部不可用。

4、NSAllowsArbitraryLoads 設(shè)置為 YES,NSAllowsArbitraryLoadsInWebContent 設(shè)置為 NO,HTTP只支持iOS 9但不符合ATS要求,而且iOS 10下的 WKWebview也不可用。

5、NSAllowsArbitraryLoads ,NSAllowsArbitraryLoadsInWebContent 都設(shè)置為 YES,HTTP只有 WKWebView 支持。

綜合蘋果要求,與實際產(chǎn)品業(yè)務(wù)需求,選擇使用 NSAllowsArbitraryLoads 設(shè)置為 NO (避免審核風險),NSAllowsArbitraryLoadsInWebContent 設(shè)置為 YES(允許鏈接HTTP),設(shè)置HTTP域名訪問白名單,使用WKWebView作為Web容器的技術(shù)方案。
針對NSURLSession API
只需將網(wǎng)絡(luò)庫更新至最新版的AFNetworking,即可完美支持HTTP、HTTPS的API請求。

針對Web容器
使用 WKWebView 替換 UIWebView,業(yè)務(wù)對接采用Web與Native交互協(xié)議來解決兼容問題。iOS 10 中 WKWebView 完美支持HTTP、HTTPS的鏈接瀏覽(包括在線視頻播放)。

針對網(wǎng)絡(luò)圖片下載庫SDWebImage
測試環(huán)境下將會使用自簽名的SLL證書,需要修改一些代碼才能支持,生產(chǎn)環(huán)境下使用商業(yè)簽名證書無需做修改。

針對第三方HTTP鏈接
可以設(shè)置 NSExceptionDomains 屬性來將需要排除強制驗證的域名寫進來。 也就是說我如果我們的 app 只訪問我們自己的服務(wù)器, 我們可以將我們服務(wù)器的域名添加進來,依然可以繼續(xù)使用 HTTP。但我們不能像之前那樣簡單粗暴的直接把所有的請求都通過。NSExceptionDomains 的設(shè)置方法如下, 比如我們要將 campus.chinahr.com 這個域名排除在 ATS 驗證之外,就可以這樣:

不過蘋果建議如果要提供瀏覽器類的服務(wù),請使用SFSafariViewController(UI不可定制),優(yōu)于WKWebView,后者更適用于對用戶訪問web內(nèi)容更有把控的情況。