關(guān)于 iOS 10 中 ATS 的問(wèn)題

WWDC 15 提出的 ATS (App Transport Security) 是 Apple 在推進(jìn)網(wǎng)絡(luò)通訊安全的一個(gè)重要方式巷挥。在 iOS 9 和 OS X 10.11 中桩卵,默認(rèn)情況下非 HTTPS 的網(wǎng)絡(luò)訪問(wèn)是被禁止的。當(dāng)然倍宾,因?yàn)檫@樣的推進(jìn)影響面非常廣雏节,作為緩沖,我們可以在 Info.plist 中添加NSAppTransportSecurity字典并且將NSAllowsArbitraryLoads設(shè)置為YES來(lái)禁用 ATS高职。相信大家都已經(jīng)對(duì)這個(gè)非常熟悉了钩乍,因?yàn)槲易约阂簿S護(hù)了一些網(wǎng)絡(luò)相關(guān)的框架,所以我還自己準(zhǔn)備了一個(gè)小腳本來(lái)快速關(guān)閉 ATS怔锌。

不過(guò)寥粹,WWDC 16 中,Apple 表示將繼續(xù)在 iOS 10 和 macOS 10.12 里收緊對(duì)普通 HTTP 的訪問(wèn)限制埃元。從 2017 年 1 月 1 日起涝涤,所有的新提交 app 默認(rèn)是不允許使用NSAllowsArbitraryLoads來(lái)繞過(guò) ATS 限制的,也就是說(shuō)岛杀,我們最好保證 app 的所有網(wǎng)絡(luò)請(qǐng)求都是 HTTPS 加密的阔拳,否則可能會(huì)在應(yīng)用審核時(shí)遇到麻煩。

本文寫(xiě)作的時(shí)間點(diǎn) (2016 年 6 月 17 日)类嗤,這方面的相關(guān)規(guī)定和幾個(gè)事實(shí)如下糊肠。但是似乎 Apple 安全部門對(duì)現(xiàn)在的情況也有些內(nèi)部沖突,所以不排除在正式版中發(fā)生改變的可能性遗锣。我也會(huì)對(duì)此繼續(xù)關(guān)注货裹,并在需要的時(shí)候?qū)Ρ疚倪M(jìn)行更新。如果您發(fā)現(xiàn)了下面所述和事實(shí)不符的話精偿,也歡迎留言提出泪酱,我會(huì)進(jìn)行修正。

默認(rèn)情況下你的 app 可以訪問(wèn)加密足夠強(qiáng) (TLSv1.2 以上,AES-128 和 SHA-2 以及 ECDHC 等) 的 HTTPS 內(nèi)容墓阀。這對(duì)所有的網(wǎng)絡(luò)請(qǐng)求都有效毡惜,包括NSURLSession,UIWebView以及WKWebView等斯撮。

你依然可以添加NSAllowsArbitraryLoads為YES來(lái)禁用 ATS经伙,不過(guò)如果你這么做的話,需要在提交 app 時(shí)進(jìn)行說(shuō)明勿锅,為什么需要訪問(wèn)非 HTTPS 內(nèi)容帕膜。一般來(lái)說(shuō),可能類似瀏覽器類的 app 比較容易能通過(guò)溢十。

相比于使用NSAllowsArbitraryLoads將全部 HTTP 內(nèi)容開(kāi)放垮刹,選擇使用NSExceptionDomains來(lái)針對(duì)特定的域名開(kāi)放 HTTP 應(yīng)該要相對(duì)容易過(guò)審核≌懦冢“需要訪問(wèn)的域名是第三方服務(wù)器荒典,他們沒(méi)有進(jìn)行 HTTPS 對(duì)應(yīng)”會(huì)是審核時(shí)的一個(gè)可選理由,但是這應(yīng)該只需要針對(duì)特定域名吞鸭,而非全面開(kāi)放寺董。如果訪問(wèn)的是自己的服務(wù)器的話,可能這個(gè)理由會(huì)無(wú)法通過(guò)刻剥。

對(duì)于網(wǎng)頁(yè)瀏覽和視頻播放的行為遮咖,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent鍵。通過(guò)將它設(shè)置為YES造虏,可以讓你的 app 中的WKWebView和使用AVFoundation播放的在線視頻不受 ATS 的限制御吞。這也應(yīng)該是絕大多數(shù)使用了相關(guān)特性的 app 的選擇。但是壞消息是這個(gè)鍵在 iOS 9 中并不會(huì)起作用漓藕。

總結(jié)一下就是魄藕,對(duì)于 API 請(qǐng)求,基本上是必須使用 HTTPS 的撵术,特別是如果你們自己可以管理服務(wù)器的話背率。可能需要后端的同學(xué)盡快升級(jí)到 HTTPS (不過(guò)話說(shuō)雖然是用 Let's Encrypt 的嫩与,我一個(gè)個(gè)人博客都啟用 HTTPS 了寝姿,作為 API 的用戶服務(wù)器,還不開(kāi) HTTPS 真有點(diǎn)說(shuō)不過(guò)去)划滋。如果你的 app 只支持 iOS 10饵筑,并且有用戶可以自由輸入網(wǎng)址進(jìn)行瀏覽的功能,或者是在線視頻音頻播放功能的話处坪,簡(jiǎn)單地加入NSAllowsArbitraryLoadsInWebContent根资,并且將組件換成WKWebKit或者AVFoundation就可以了架专。如果你還需要支持 iOS 9,并且需要訪問(wèn)網(wǎng)頁(yè)和視頻的話玄帕,可能只能去開(kāi)啟NSAllowsArbitraryLoads然后提交時(shí)進(jìn)行說(shuō)明部脚,并且看 Apple 審核員的臉色決定讓不讓通過(guò)了。除了WKWebKit以外裤纹,另外一個(gè)訪問(wèn)網(wǎng)頁(yè)的選擇是使用SFSafariViewController委刘。因?yàn)槠鋵?shí)SFSafariViewController就是一個(gè)獨(dú)立于 app 的 Safari 進(jìn)程,所以它完全不受 ATS 的限制鹰椒。

另外锡移,當(dāng)NSAllowsArbitraryLoads和NSAllowsArbitraryLoadsInWebContent同時(shí)存在時(shí),根據(jù)系統(tǒng)不同漆际,表現(xiàn)的行為也會(huì)不一樣淆珊。簡(jiǎn)單說(shuō),iOS 9 只看NSAllowsArbitraryLoads奸汇,而 iOS 10 會(huì)先看NSAllowsArbitraryLoadsInWebContent施符。在 iOS 10 中,要是NSAllowsArbitraryLoadsInWebContent存在的話茫蛹,就忽略掉NSAllowsArbitraryLoads操刀,如果它不存在烁挟,則遵循NSAllowsArbitraryLoads的設(shè)定婴洼。說(shuō)起來(lái)可能有點(diǎn)復(fù)雜,我在這里總結(jié)了一下根據(jù)NSAppTransportSecurity中設(shè)定條件不同撼嗓,所對(duì)應(yīng)的系統(tǒng)版本和請(qǐng)求組件的行為的不同柬采,可以作為你設(shè)置這個(gè)字典時(shí)的參考。


該列表是根據(jù) Apple prerelease 的文檔中關(guān)于NSAppTransportSecurity和NSAllowsArbitraryLoadsInWebContent部分的描述作出的且警。如果您發(fā)現(xiàn)這個(gè)行為發(fā)生了變化粉捻,或者上面的列表存在問(wèn)題,歡迎留言斑芜,我會(huì)進(jìn)行更正肩刃。

關(guān)于UIWebView是否也可以在NSAllowsArbitraryLoadsInWebContent為YES時(shí)訪問(wèn) HTTP,Apple 內(nèi)部似乎也在爭(zhēng)論杏头,但是個(gè)人認(rèn)為是時(shí)候淘汰UIWebView了盈包。如果沒(méi)有特殊的什么需求的話,盡早將UIWebView全部換為WkWebView會(huì)是明智的選擇醇王。

不得不說(shuō)呢燥,Apple 使用自己現(xiàn)在的強(qiáng)勢(shì)地位,在推動(dòng)技術(shù)進(jìn)步上的做的努力是有目共睹的寓娩。不論是前幾天強(qiáng)制支持 IPv6叛氨,還是現(xiàn)在的 HTTPS呼渣,其實(shí)都不是很容易就能作出的決定。而為用戶構(gòu)建一個(gè)更安全的使用環(huán)境寞埠,可能不僅是 Apple 單方面可以做的屁置,也是需要開(kāi)發(fā)者來(lái)配合的一件事情。盡快適配更進(jìn)步和安全的使用方式畸裳,會(huì)是一件雙贏的事情缰犁。

轉(zhuǎn)自?OneV`s Den


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怖糊,隨后出現(xiàn)的幾起案子帅容,更是在濱河造成了極大的恐慌,老刑警劉巖伍伤,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件并徘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扰魂,警方通過(guò)查閱死者的電腦和手機(jī)麦乞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)劝评,“玉大人姐直,你說(shuō)我怎么就攤上這事〗螅” “怎么了声畏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姻成。 經(jīng)常有香客問(wèn)我插龄,道長(zhǎng),這世上最難降的妖魔是什么科展? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任均牢,我火速辦了婚禮,結(jié)果婚禮上才睹,老公的妹妹穿的比我還像新娘徘跪。我一直安慰自己,他們只是感情好琅攘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布垮庐。 她就那樣靜靜地躺著,像睡著了一般乎澄。 火紅的嫁衣襯著肌膚如雪突硝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天置济,我揣著相機(jī)與錄音解恰,去河邊找鬼锋八。 笑死,一個(gè)胖子當(dāng)著我的面吹牛护盈,可吹牛的內(nèi)容都是我干的挟纱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腐宋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼紊服!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起胸竞,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤欺嗤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后卫枝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體煎饼,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年校赤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吆玖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡马篮,死狀恐怖沾乘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浑测,我是刑警寧澤翅阵,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站尽爆,受9級(jí)特大地震影響怎顾,放射性物質(zhì)發(fā)生泄漏读慎。R本人自食惡果不足惜漱贱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夭委。 院中可真熱鬧幅狮,春花似錦、人聲如沸株灸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)慌烧。三九已至逐抑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屹蚊,已是汗流浹背厕氨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工进每, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人命斧。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓田晚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親国葬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贤徒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容