長期以來流傳一則消息,蘋果將于17年1月1日收緊ATS政策,強制接口使用HTTPS協議,據說是一位參加WWDC2016開發者大會的開發者在Twitter上發推文公布了這一消息。
但是蘋果真的這么激進嗎?蘋果開發者論壇里一名官方人員近日對此進行了澄清:
首先,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要求。
2、NSAllowsArbitraryLoads 設置為 NO,NSAllowsArbitraryLoadsInWebContent 設置為 YES,HTTP只有在iOS 10下的 WKWebview可用。
3、NSAllowsArbitraryLoads ,NSAllowsArbitraryLoadsInWebContent 都設置為 NO,HTTP全部不可用。
4、NSAllowsArbitraryLoads 設置為 YES,NSAllowsArbitraryLoadsInWebContent 設置為 NO,HTTP只支持iOS 9但不符合ATS要求,而且iOS 10下的 WKWebview也不可用。
5、NSAllowsArbitraryLoads ,NSAllowsArbitraryLoadsInWebContent 都設置為 YES,HTTP只有 WKWebView 支持。
綜合蘋果要求,與實際產品業務需求,選擇使用 NSAllowsArbitraryLoads 設置為 NO (避免審核風險),NSAllowsArbitraryLoadsInWebContent 設置為 YES(允許鏈接HTTP),設置HTTP域名訪問白名單,使用WKWebView作為Web容器的技術方案。
針對NSURLSession API
只需將網絡庫更新至最新版的AFNetworking,即可完美支持HTTP、HTTPS的API請求。
針對Web容器
使用 WKWebView 替換 UIWebView,業務對接采用Web與Native交互協議來解決兼容問題。iOS 10 中 WKWebView 完美支持HTTP、HTTPS的鏈接瀏覽(包括在線視頻播放)。
針對網絡圖片下載庫SDWebImage
測試環境下將會使用自簽名的SLL證書,需要修改一些代碼才能支持,生產環境下使用商業簽名證書無需做修改。
針對第三方HTTP鏈接
可以設置 NSExceptionDomains 屬性來將需要排除強制驗證的域名寫進來。 也就是說我如果我們的 app 只訪問我們自己的服務器, 我們可以將我們服務器的域名添加進來,依然可以繼續使用 HTTP。但我們不能像之前那樣簡單粗暴的直接把所有的請求都通過。NSExceptionDomains 的設置方法如下, 比如我們要將 campus.chinahr.com 這個域名排除在 ATS 驗證之外,就可以這樣:
不過蘋果建議如果要提供瀏覽器類的服務,請使用SFSafariViewController(UI不可定制),優于WKWebView,后者更適用于對用戶訪問web內容更有把控的情況。