你不知道的 Cocoa key — ATS (App Transport Security) 配置

ATS 簡介

ATS 是 iOS 9 中引入的隱私設置功能。默認狀況下,系統會爲新應用啓用該功能,並強制實施安全鏈接。若是直接進行 HTTP 請求會收到錯誤提示html

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. 複製代碼

在 iOS9 及以上的系統,默認會打開ATS,因此須要在 info.plist 中關掉 ATS。 修改完成的 info.plist 大概是這個樣子:web

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
複製代碼

應用

在接入 GoogleAdMob 時,按照谷歌的要求,對於 ATS 有以下的配置。安全

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsArbitraryLoadsForMedia</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>
複製代碼

新增了兩個例外的狀況 NSAllowsArbitraryLoadsForMedia,NSAllowsArbitraryLoadsInWebContent。查看開發者文檔,這個兩個 subkey 是從 iOS 10 開始引入的,能夠更精細化的配置容許 HTTP 鏈接的例外狀況。 一同引入的還有 NSRequiresCertificateTransparency 和 NSAllowsLocalNetworking。bash

在這裏只簡單的介紹一下谷歌要求添加的兩個 key 的做用,其餘的細節參考官方文檔。app

  • NSAllowsArbitraryLoadsForMedia, 默認值是 NO。若是設置爲 YES,則會對於使用 AVFoundation 加載的媒體資源禁用 ATS 。ide

  • NSAllowsArbitraryLoadsInWebContent, 默認值爲 NO。若是設置爲 YES,則會對於使用 web view 發起的請求禁用 ATS。ui

這裏能夠看出谷歌的 ATS 配置是比較嚴謹的。對於iOS10及以上的系統,縮小了禁用 ATS 的範圍。spa

下面畫重點,在蘋果開發者文檔裏有這麼一段話code

Version-specific ATS behavior: In a current operating system, the presence of a fine-grained transport security key (NSAllowsArbitraryLoadsForMedia, NSAllowsArbitraryLoadsInWebContent, or NSAllowsLocalNetworking) overrides the value of the NSAllowsArbitraryLoads key to NO. This allows you to set NSAllowsArbitraryLoads to YES if needed for your app in older operating systems, without disabling ATS generally in current operating systems.htm

簡單的說就是,當你使用了這幾個細粒度的ATS配置時(iOS10及以上系統),就會關掉 NSAllowsArbitraryLoads 這個力度很粗的開關(至關於忽略了該配置)。這就使得你能夠在較老的系統上禁用 ATS(NSAllowsArbitraryLoads 設置爲 YES),而在 iOS10 以後的系統上,不會禁用 ATS,只按照幾個特例狀況停用。

總結

按照谷歌的推薦配置會遇到的小問題就是,若是在工程中還有其餘使用 HTTP 加載資源的狀況(除了 AVFoundation 加載的媒體資源和 web view 發起的請求),那麼就會收到最上面的錯誤提示。

解決辦法也很簡單,移除這兩個細粒度的 ATS 配置。只須要將 NSAllowsArbitraryLoads 設置爲 NO。

另外一個解決辦法,NSExceptionDomains 使用這個 key 來配置指定的域名,能夠不受 NSAllowsArbitraryLoads 的限制。

參考資料:

Cocoa Keys

相關文章
相關標籤/搜索