ATS 全稱 App Transport Security,是 iOS 9 引入的一套安全機制,默認行為會強制保證所有的網(wǎng)絡(luò)請求都使用 HTTPS。相信這個大家都有所了解。 在 iOS 10 中蘋果對 ATS 的安全機制更加進步了一層,咱們來聊聊吧。
ATS 簡介
如果你在 iOS 9 以上平臺編譯項目后,你會發(fā)現(xiàn)無論你使用 NSURLSession 請求接口數(shù)據(jù),或者使用 WebView 打開網(wǎng)頁,只要不是 HTTPS 協(xié)議都會失敗。造成這個現(xiàn)象的原因就是 iOS 9 引入的 ATS 機制。
當(dāng)然,蘋果在引入這個特性的時候,也會考慮到開發(fā)者的過渡問題,所以還為我們留了一個開關(guān),只需要在 Info.plist 中加上這個節(jié)點即可關(guān)閉 ATS 的默認行為:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
其中 NSAppTransportSecurity 是 ATS 設(shè)置項的根節(jié)點, NSAllowsArbitraryLoads 代表是否允許訪問任意資源。 我們只需要將這個屬性設(shè)置為 true, 就可以關(guān)閉 ATS 的默認攔截行為,繼續(xù)使用 HTTP 了。
iOS 10 中的變化
iOS 10 依然延續(xù)了 ATS 機制。并且把它加強了。 從蘋果官方目前發(fā)布出來的消息上看, 在 2017 年一月份開始,就不再允許開發(fā)者打開 NSAllowsArbitraryLoads 設(shè)置了。
也就是說,這種將 ATS 全局關(guān)閉的能力不給我們了。 可見蘋果這次的決心。
那么,我們不能全局關(guān)閉 ATS 是否就意味著我們必須強制使用 HTTPS 呢? 下面咱們繼續(xù)討論。
ATS 除了提供一個 NSAllowsArbitraryLoads 屬性,其實還有另外的屬性。 可以設(shè)置 NSExceptionDomains 屬性來將需要排除強制驗證的域名寫進來。 也就是說我如果我們的 app 只訪問我們自己的服務(wù)器, 我們可以將我們服務(wù)器的域名添加進來,依然可以繼續(xù)使用 HTTP。但我們不能像之前那樣簡單粗暴的直接把所有的請求都通過。這樣就更加精確,其實對真正的用戶來說,這其實是一個好事。盡管他們或許感知不到,但這樣確實可以極大的減少用戶的安全風(fēng)險。