iOS適配ATS

iOS 10 適配 ATS

一. HTTPS其實(shí)HTTPS從最終的數(shù)據(jù)解析的角度虎忌,與HTTP沒有任何的區(qū)別僚匆,HTTPS就是將HTTP協(xié)議數(shù)據(jù)包放到SSL/TSL層加密后咏连,在TCP/IP層組成IP數(shù)據(jù)報(bào)去傳輸笛辟,以此保證傳輸數(shù)據(jù)的安全;而對(duì)于接收端宫患,在SSL/TSL將接收的數(shù)據(jù)包解密之后刊懈,將數(shù)據(jù)傳給HTTP協(xié)議層,就是普通的HTTP數(shù)據(jù)娃闲。HTTP和SSL/TSL都處于OSI模型的應(yīng)用層虚汛。從HTTP切換到HTTPS是一個(gè)非常簡(jiǎn)單的過程,在做具體的切換操作之前皇帮,我們需要了解幾個(gè)概念:SSL/TLS為了保證這些隱私數(shù)據(jù)能加密傳輸卷哩,于是網(wǎng)景公司設(shè)計(jì)了SSL(Secure Sockets Layer)協(xié)議用于對(duì)HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密,從而就誕生了HTTPS属拾。SSL目前的版本是3.0将谊,被IETF(Internet Engineering Task Force)定義在RFC 6101中,之后IETF對(duì)SSL 3.0進(jìn)行了升級(jí)渐白,于是出現(xiàn)了TLS(Transport Layer Security) 1.0尊浓,定義在RFC 2246。實(shí)際上我們現(xiàn)在的HTTPS都是用的TLS協(xié)議礼预,但是由于SSL出現(xiàn)的時(shí)間比較早眠砾,并且依舊被現(xiàn)在瀏覽器所支持虏劲,因此SSL依然是HTTPS的代名詞托酸,但無論是TLS還是SSL都是上個(gè)世紀(jì)的事情,SSL最后一個(gè)版本是3.0柒巫,今后TLS將會(huì)繼承SSL優(yōu)良血統(tǒng)繼續(xù)為我們進(jìn)行加密服務(wù)励堡。SSL/TLS協(xié)議運(yùn)行機(jī)制的概述圖解SSL/TLS協(xié)議簡(jiǎn)單的來說,SSL/TSL通過四次握手堡掏。SSL協(xié)議的工作流程:服務(wù)器認(rèn)證階段:客戶端向服務(wù)器發(fā)送一個(gè)開始信息“Hello”以便開始一個(gè)新的會(huì)話連接应结;服務(wù)器根據(jù)客戶的信息確定是否需要生成新的主密鑰,如需要?jiǎng)t服務(wù)器在響應(yīng)客戶的“Hello”信息時(shí)將包含生成主密鑰所需的信息;客戶根據(jù)收到的服務(wù)器響應(yīng)信息鹅龄,產(chǎn)生一個(gè)主密鑰揩慕,并用服務(wù)器的公開密鑰加密后傳給服務(wù)器;服務(wù)器恢復(fù)該主密鑰扮休,并返回給客戶一個(gè)用主密鑰認(rèn)證的信息迎卤,以此讓客戶認(rèn)證服務(wù)器。用戶認(rèn)證階段:在此之前玷坠,服務(wù)器已經(jīng)通過了客戶認(rèn)證蜗搔,這一階段主要完成對(duì)客戶的認(rèn)證。經(jīng)認(rèn)證的服務(wù)器發(fā)送一個(gè)提問給客戶八堡,客戶則返回(數(shù)字)簽名后的提問和其公開密鑰樟凄,從而向服務(wù)器提供認(rèn)證。

二. App Transport SecurityiOS9中新增App Transport Security(簡(jiǎn)稱ATS)特性, 主要使到原來請(qǐng)求的時(shí)候用到的HTTP兄渺,都轉(zhuǎn)向TLS1.2協(xié)議進(jìn)行傳輸缝龄。這也意味著所有的HTTP協(xié)議都強(qiáng)制使用了HTTPS協(xié)議進(jìn)行傳輸。在 iOS 9 和 OS X 10.11 中挂谍,默認(rèn)情況下非 HTTPS 的網(wǎng)絡(luò)訪問是被禁止的二拐。當(dāng)然,因?yàn)檫@樣的推進(jìn)影響面非常廣凳兵,作為緩沖百新,我們可以在 Info.plist 中添加 NSAppTransportSecurity 字典并且將 NSAllowsArbitraryLoads 設(shè)置為 YES 來禁用 ATS。不過庐扫,WWDC 16 中饭望,Apple 表示將繼續(xù)在 iOS 10 和 macOS 10.12 里收緊對(duì)普通 HTTP 的訪問限制。從 2017 年 1 月 1 日起形庭,所有的新提交 app 默認(rèn)是不允許使用 NSAllowsArbitraryLoads 來繞過 ATS 限制的铅辞,也就是說,我們最好保證 app 的所有網(wǎng)絡(luò)請(qǐng)求都是 HTTPS 加密的萨醒,否則可能會(huì)在應(yīng)用審核時(shí)遇到麻煩斟珊。

三. iOS10 NSAppTransportSecurity通過在info.plist中配置這個(gè)鍵,開發(fā)者可以自定義網(wǎng)絡(luò)安全策略富纸。

例如:允許針對(duì)個(gè)別服務(wù)器的不安全訪問囤踩。允許不安全的 web 或媒體內(nèi)容訪問,但不影響整個(gè)app的ATS策略晓褪。啟用新的安全特性堵漱,例如Certificate Transparency。對(duì)NSAppTransportSecurity的支持自 iOS9.0涣仿,OS X v10.11 開始勤庐,適用于 app 和 app extension示惊。自 iOS10.0,macOS 10.12 開始愉镰,增加了對(duì)下列子鍵的支持:NSAllowsArbitraryLoadsInMediaNSAllowsArbitraryLoadsInWebContentNSRequiresCertificateTransparencyNSAllowsLocalNetworkingATS Configuration Basics / ATS 配置基礎(chǔ)知識(shí)對(duì)于使用 iOS9.0米罚, OS X v10.11 SDK 及以上的 app 來說,ATS(App Transport Security)默認(rèn)開啟丈探,NSAllowsArbitraryLoads是字典NSAppTransportSecurity的根鍵阔拳,默認(rèn)值NO。在啟用 ATS 的情況下类嗤,所有的 HTTP 請(qǐng)求必須為 HTTPS(RFC 2818) 連接糊肠。任何不安全的 HTTP 請(qǐng)求都將失敗。ATS 使用 TLS(Transport Layer Security)v1.2(RFC 5246)遗锣。下面是字典NSAppTransportSecurity的總體結(jié)構(gòu)货裹,所有鍵都是非必填項(xiàng):NSAppTransportSecurity : Dictionary { ?

??NSAllowsArbitraryLoads : Boolean? ?

?NSAllowsArbitraryLoadsInMedia : Boolean?

?? NSAllowsArbitraryLoadsInWebContent : Boolean? ?

?NSAllowsLocalNetworking : Boolean? ??

NSExceptionDomains : Dictionary {: Dictionary {? ? ??

? NSIncludesSubdomains : Boolean? ? ? ? ?

?NSExceptionAllowsInsecureHTTPLoads : Boolean ? ? ? ? ? ? ?NSExceptionMinimumTLSVersion : String? ? ??

?NSExceptionRequiresForwardSecrecy : Boolean? // Default value is YES? ? ? ? ? ? NSRequiresCertificateTransparency : Boolean? ? ? ? }? ? }}

可以看出,所有鍵可以分為兩類:主鍵精偿,這些鍵用來定義 app 的總體 ATS 策略弧圆;子鍵,即NSExceptionDomains下面的鍵笔咽,使用這些鍵針對(duì)某個(gè)域名單獨(dú)配置搔预。主鍵包括:NSAllowsArbitraryLoads設(shè)置為 YES,解除整個(gè) app 的 ATS 限制叶组;但是拯田,通過NSExceptionDomains進(jìn) 行的配置依然有效。默認(rèn)值為 NO甩十。

注意:設(shè)置為 YES船庇,會(huì)引發(fā) App Stroe 的審查,開發(fā)者必須說明原因侣监。NSAllowsArbitraryLoadsInMedia設(shè)置為 YES鸭轮,解除通過 AV Foundation 框架訪問媒體內(nèi)容時(shí)的 ATS 限制;啟用這個(gè) 鍵橄霉,務(wù)必確保載入的媒體內(nèi)容已經(jīng)被加密窃爷,例如受FairPlay保護(hù)的文件,或者是安全的 HLS流媒姓蜂,其中不包含敏感的個(gè)人信息按厘。默認(rèn)為 NO。NSAllowsArbitraryLoadsInWebContent設(shè)置為 YES覆糟,解除通過 web view 發(fā)出的網(wǎng)絡(luò)請(qǐng)求的 ATS 限制刻剥。啟用這個(gè)鍵,可以使 app 訪問任意網(wǎng)頁內(nèi)容滩字,但不影響 app 的總體 ATS 策略。此鍵值默認(rèn)為 NO。NSAllowsLocalNetworking設(shè)置為 YES麦箍,使得 app 可以載入任意本地資源漓藕,但不影響 app 的總體 ATS 策略。默 認(rèn)為 NO挟裂。NSExceptionDomains為一個(gè)或多個(gè)域名單獨(dú)配置 ATS享钞。被單獨(dú)配置的域名,默認(rèn)受到完全的 ATS 限制诀蓉,不管NSAllowsArbitraryLoads的值 如何栗竖;需要通過子鍵,進(jìn)一步配置所有的子鍵都屬于NSExceptionDomain渠啤。向Info.plist中添加這一主鍵:創(chuàng)建字典狐肢,針對(duì)一個(gè)或多個(gè)域名,以便進(jìn)行 ATS 配置沥曹。這意味著之前使用主鍵所做的設(shè)置份名,對(duì)于這個(gè)域名來說,已經(jīng)無效妓美。例如僵腺,及時(shí)之前設(shè)置NSAllowsArbitraryLoadsInMedia為 YES,然而NSExceptionDomain所代表的域名依然不能訪問不安全的媒體內(nèi)容壶栋〕饺纾基于這樣的設(shè)定,可以針對(duì)域名進(jìn)行 ATS 配置贵试,增加或減少安全措施丧没。例如:將NSExceptionAllowsInsecureHTTPLoads設(shè)置為 YES,就 锡移;這樣做會(huì)引發(fā) App Store 的審查呕童,詳情見App Store Review for ATS。通過配置NSExceptionRequiresForwardSecrecy為 NO淆珊,取消正向保密夺饲。通過配置NSExceptionMinimumTLSVersion,更改 TLS 最低版本施符。NSExceptionDomains字典構(gòu)成:<域名字符串>代表想要配置的特定域名往声。可以添加多個(gè)域名(即添加多個(gè)這樣的鍵)戳吝,為它們統(tǒng)一配置 ATS 策略浩销。這個(gè)鍵對(duì)應(yīng)一個(gè)字典,包含以下子鍵:NSIncludesSubdomains* 設(shè)置為 YES听哭,當(dāng)前域名的 ATS 策略適用于其所有子域名慢洋。默認(rèn)為 NO塘雳。NSExceptionAllowsInsecureHTTPLoads* 設(shè)置為 YES,可以同時(shí)通過 HTTP 和 HTTPS 訪問當(dāng)前域名普筹。默認(rèn)為 NO败明。注意,配置這個(gè)鍵值太防,將引發(fā) App Store 的審查妻顶,開發(fā)者必須說明原因。NSExceptionMinimumTLSVersion* 指定 TLS 的最低版本蜒车,因此可以使用版本較低讳嘱,有安全漏洞的 TLS 協(xié)議。注意酿愧,配置這個(gè)鍵值沥潭,將引發(fā) App Store 的審查,開發(fā)者必須說明原因寓娩。NSExceptionRequiresForwardSecrecy* 設(shè)置為 NO叛氨,允許針對(duì)當(dāng)前域名使用不支持正向保密的 TLS 加密算法。默認(rèn)為 YES棘伴。NSRequiresCertificateTransparency* 設(shè)置為 YES寞埠,將驗(yàn)證域名服務(wù)器證書的Certificate Transparency時(shí)間戳 。默認(rèn)為 NO焊夸。Requirements for Connecting Using ATS / 使用 ATS 的前提條件在 ATS 完全開啟的情況下仁连,系統(tǒng)要求 app 的 HTTPS 連接必須滿足以下要求:X.509 數(shù)字證書必須滿足下列標(biāo)準(zhǔn)中的一項(xiàng):由操作系統(tǒng)內(nèi)嵌的根證書頒發(fā)機(jī)構(gòu)簽發(fā)由通過操作系統(tǒng)管理員或用戶主動(dòng)安裝的根證書頒發(fā)機(jī)構(gòu)簽發(fā)TLS 版本必須為1.2,任何不使用或使用較低版本 TLS / SSL 的連接阱穗,都將失敗饭冬。連接必須使用 AES-128 或 AES-256 對(duì)稱加密算法。 TLS 算法套裝必須以 ECDSA 密鑰交換的形式支持正向保密揪阶,加密算法必須為下面之一:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHATLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHATLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA服務(wù)端的葉證書簽名密鑰必須為下面之一:至少2048位的 RSA 密鑰至少256位的 ECC 密鑰此外昌抠,服務(wù)器證書的哈希算法必須為 SHA-2,其摘要長(zhǎng)度至少位256位(即 SHA-256 及以上)鲁僚。上面的標(biāo)準(zhǔn)炊苫,未來可能會(huì)發(fā)生變化。但不會(huì)影響到 app 二進(jìn)制包的兼容性冰沙。App Store Review for ATS / App Store 對(duì)于 ATS 相關(guān)項(xiàng)的審核某些對(duì) ATS 的配置會(huì)引發(fā) App Store 的審核侨艾,開發(fā)者必須說明原因。這些鍵有:NSAllowsArbitraryLoadsNSExceptionAllowsInsecureHTTPLoadsNSExceptionMinimumTLSVersion以下是一些原因說明例子拓挥,供參考:必須連接由其他機(jī)構(gòu)控制的服務(wù)器唠梨,其還不支持安全連接。必須支持那些還未升級(jí)至可使用安全連接侥啤,不得不通過公共域名訪問網(wǎng)絡(luò)的設(shè)備当叭。必須通過 web 展示來源不一的各種網(wǎng)絡(luò)內(nèi)容茬故,但又不能完全使用NSAllowsArbitraryLoadsInWebContent所管理的類。向 App Store 提交審核時(shí)科展,開發(fā)者應(yīng)主動(dòng)提供足夠的信息均牢,以便解釋 app 無法使用安全連接的原因糠雨。四. 實(shí)現(xiàn)支持安全ATS策略ATS相關(guān)設(shè)置對(duì)iOS8及以下系統(tǒng)無效需要解決的問題(iOS 9才睹、iOS10及以上)1、app內(nèi)服務(wù)器網(wǎng)絡(luò)請(qǐng)求訪問支持https(即一般的請(qǐng)求)2甘邀、webview內(nèi)支持任意http訪問3琅攘、第三方sdk接入與支持http訪問主要是圍繞info.pilst配置文件作相關(guān)的安全ATS策略Info.plist文件是向操作系統(tǒng)描述應(yīng)用程序的XML屬性列表,是iPhone應(yīng)用程序文件夾包含所有重要的Info.plist文件你可能注意到一些關(guān)鍵字像是使用了一些其他關(guān)鍵字中的詞但是在前面加上了"ThirdParty"字樣,在功能上松邪,這些關(guān)鍵字與不含有"ThirdParty"的關(guān)鍵字有同樣的效果坞琴。而且實(shí)際運(yùn)行中所調(diào)用的代碼將會(huì)完全忽略是否使用"ThirdParty"關(guān)鍵字。簡(jiǎn)單粗暴的方案:--------------------------------------------NSExceptionDomains 的設(shè)置方法如下, 比如我們要將 weibo.com 這個(gè)域名排除在 ATS 驗(yàn)證之外逗抑,就可以這樣:key>NSAppTransportSecurityNSExceptionDomainsweibo.comNSIncludesSubdomainsNSExceptionRequiresForwardSecrecyNSExceptionAllowsInsecureHTTPLoadsNSAllowsArbitraryLoads注意:每個(gè)需添加的域都需要設(shè)置此三個(gè)屬性剧辐。如果請(qǐng)求的網(wǎng)絡(luò)圖片是HTTP,也是需要設(shè)置的圖片的域邮府。注意??這個(gè)方案風(fēng)險(xiǎn)較大荧关,有可能被拒絕」涌“需要訪問的域名是第三方服務(wù)器忍啤,他們沒有進(jìn)行 HTTPS 對(duì)應(yīng)”會(huì)是審核時(shí)的一個(gè)可選理由,但是這應(yīng)該只需要針對(duì)特定域名仙辟,而非全面開放同波。如果訪問的是自己的服務(wù)器的話,可能這個(gè)理由會(huì)無法通過叠国。------------------------------------------------實(shí)現(xiàn)方案1未檩、app內(nèi)服務(wù)器網(wǎng)絡(luò)請(qǐng)求訪問支持https解決方案:搭建https服務(wù)器搭建https服務(wù)器需要ssl證書ssl自制證書:稱自簽名ssl證書,容易被假冒偽造粟焊,瀏覽器不信任冤狡。(審核不通過)免費(fèi)CA證書:部分CA機(jī)構(gòu)提供免費(fèi)的SSL證書,如wosign吆玖,starts等(App Store pass掉不通過)付費(fèi)CA證書:多指企業(yè)級(jí)及以上的數(shù)字證書筒溃。HTTPS服務(wù)器滿足ATS默認(rèn)的條件,而且SSL證書是通過權(quán)威的CA機(jī)構(gòu)認(rèn)證過的沾乘,那么我們?cè)谑褂肵code開發(fā)的時(shí)候怜奖,對(duì)網(wǎng)絡(luò)的適配什么都不用做,我們也能正常與服務(wù)器通信翅阵。但是歪玲,當(dāng)我們對(duì)安全性有更高的要求時(shí)或者我們自建證書時(shí)迁央,我們需要本地導(dǎo)入證書來進(jìn)行驗(yàn)證。使用AFNetworking來支持httpsAFNetworking是iOS/OSX開發(fā)最流行的第三方開源庫(kù)之一,現(xiàn)在iOS oc 代碼90%以上都是用這個(gè)框架網(wǎng)絡(luò)請(qǐng)求滥崩。AFNetworking已經(jīng)將上面的邏輯代碼封裝好岖圈,甚至更完善,在AFSecurityPolicy文件中钙皮,有興趣可以閱讀這個(gè)模塊的代碼蜂科;以下就是在AFNetworking 2.6.0以前版本和3.0.0版本基于支持https的驗(yàn)證方式步驟:新建一個(gè)manager在mainBundle中尋找我們剛才拖進(jìn)項(xiàng)目中的https.cer, 并且將相關(guān)的數(shù)據(jù)讀取出來新建一個(gè)AFSecurityPolicy,并進(jìn)行相應(yīng)的配置將這個(gè)AFSecurityPolicy 實(shí)例賦值給manager代碼實(shí)現(xiàn):NSURL * url = [NSURL URLWithString:@"https://www.google.com"];AFHTTPRequestOperationManager * requestOperationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];dispatch_queue_t requestQueue = dispatch_create_serial_queue_for_name("kRequestCompletionQueue");requestOperationManager.completionQueue = requestQueue;AFSecurityPolicy * securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];//allowInvalidCertificates 是否允許無效證書(也就是自建的證書)短条,默認(rèn)為NO//如果是需要驗(yàn)證自建證書导匣,需要設(shè)置為YESsecurityPolicy.allowInvalidCertificates = YES;//validatesDomainName 是否需要驗(yàn)證域名,默認(rèn)為YES茸时;//假如證書的域名與你請(qǐng)求的域名不一致贡定,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話可都,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書缓待,也可以建立連接,這個(gè)非常危險(xiǎn)渠牲,建議打開旋炒。//置為NO,主要用于這種情況:客戶端請(qǐng)求的是子域名嘱兼,而證書上的是另外一個(gè)域名国葬。因?yàn)镾SL證書上的域名是獨(dú)立的,假如證書上注冊(cè)的域名是www.google.com芹壕,那么mail.google.com是無法驗(yàn)證通過的汇四;當(dāng)然,有錢可以注冊(cè)通配符的域名*.google.com踢涌,但這個(gè)還是比較貴的通孽。//如置為NO,建議自己添加對(duì)應(yīng)域名的校驗(yàn)邏輯睁壁。securityPolicy.validatesDomainName = YES;//validatesCertificateChain 是否驗(yàn)證整個(gè)證書鏈背苦,默認(rèn)為YES//設(shè)置為YES,會(huì)將服務(wù)器返回的Trust Object上的證書鏈與本地導(dǎo)入的證書進(jìn)行對(duì)比潘明,這就意味著行剂,假如你的證書鏈?zhǔn)沁@樣的://GeoTrust Global CA //? ? Google Internet Authority G2//? ? ? ? *.google.com//那么,除了導(dǎo)入*.google.com之外钳降,還需要導(dǎo)入證書鏈上所有的CA證書(GeoTrust Global CA, Google Internet Authority G2)厚宰;//如是自建證書的時(shí)候,可以設(shè)置為YES,增強(qiáng)安全性铲觉;假如是信任的CA所簽發(fā)的證書澈蝙,則建議關(guān)閉該驗(yàn)證,因?yàn)檎麄€(gè)證書鏈一一比對(duì)是完全沒有必要(請(qǐng)查看源代碼)撵幽;securityPolicy.validatesCertificateChain = NO;requestOperationManager.securityPolicy = securityPolicy;另afnetworking 3.0.0以上版本用的是AFHTTPSessionManager AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];? ? NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"cer"];? ? NSData * cerData = [NSData dataWithContentsOfFile:cerPath];? ? NSLog(@"%@", cerData);? ? manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSArray alloc] initWithObjects:cerData, nil]];? ? manager.securityPolicy.allowInvalidCertificates = YES;? ? [manager.securityPolicy setValidatesDomainName:NO];? ? manager.requestSerializer = [AFJSONRequestSerializer serializer];? ? manager.responseSerializer = [AFJSONResponseSerializer serializer];? ? NSDictionary * parameter = @{@"username":self.username, @"password":self.password};? ? [manager POST:@"https://192.168.1.4:9777" parameters:parameter success:^(NSURLSessionDataTask * task, id responseObject) {? ? ? ? NSLog(@"success %@", responseObject);? ? ? ? }? ? ? ? failure:^(NSURLSessionDataTask * task, NSError * error) {? ? ? ? ? ? NSLog(@"failure %@", error);? ? ? ? }]NSAppTransportSecurityNSAllowsArbitraryLoads//設(shè)置為 YES灯荧,解除整個(gè)app的ATS限制;但是通過NSExceptionDomains進(jìn)行的配置依然有效NSAllowsArbitraryLoadsInMedia//設(shè)置為 YES盐杂,解除通過AVFoundation框架訪問媒體內(nèi)容時(shí)的 ATS 限制NSAllowsArbitraryLoadsInWebContent//設(shè)置為 YES逗载,解除通過webview發(fā)出的網(wǎng)絡(luò)請(qǐng)求的ATS限制NSAllowsLocalNetworking//設(shè)置為 YES,使得app可以載入任意本地資源况褪,但不影響app的總體 ATS 策略2撕贞、webview內(nèi)支持任意http訪問對(duì)于網(wǎng)頁瀏覽和視頻播放的行為更耻,iOS 10 中新加入了 NSAllowsArbitraryLoadsInWebContent 鍵测垛。通過將它設(shè)置為 YES,可以讓 app 中的 WKWebView 和使用 AVFoundation 播放的在線視頻不受 ATS 的限制秧均。這也應(yīng)該是絕大多數(shù)使用了相關(guān)特性的 app 的選擇食侮。但是壞消息是這個(gè)鍵在 iOS 9 中并不會(huì)起作用。如果app只支持 iOS 10目胡,并且有用戶可以自由輸入網(wǎng)址進(jìn)行瀏覽的功能锯七,或者是在線視頻音頻播放功能的話,簡(jiǎn)單地加入 NSAllowsArbitraryLoadsInWebContent誉己,并且將組件換成 WKWebKit 或者 AVFoundation 就可以了眉尸。如果你還需要支持 iOS 9,并且需要訪問網(wǎng)頁和視頻的話巨双,可能只能去開啟 NSAllowsArbitraryLoads 然后提交時(shí)進(jìn)行說明噪猾,并且看 Apple 審核員決定讓不讓通過了。另外筑累,當(dāng) NSAllowsArbitraryLoads 和 NSAllowsArbitraryLoadsInWebContent 同時(shí)存在時(shí)袱蜡,根據(jù)系統(tǒng)不同,表現(xiàn)的行為也會(huì)不一樣慢宗。簡(jiǎn)單說坪蚁,iOS 9 只看 NSAllowsArbitraryLoads,而 iOS 10 會(huì)先看 NSAllowsArbitraryLoadsInWebContent镜沽。在 iOS 10 中敏晤,要是 NSAllowsArbitraryLoadsInWebContent 存在的話,就忽略掉 NSAllowsArbitraryLoads缅茉,如果它不存在嘴脾,則遵循 NSAllowsArbitraryLoads 的設(shè)定UIWebView 在 NSAllowsArbitraryLoadsInWebContent 為 YES 時(shí)訪問 HTTP,無效宾舅。WKWebView 在 NSAllowsArbitraryLoadsInWebContent 為 YES 時(shí)在iOS 10 中訪問 HTTP统阿,有效彩倚,iOS 9無效。如果用WkWebView替換UIWebView扶平,iOS 7 將無法使用WkWebView帆离,可做適配加載,沒有特殊的什么需求的話结澄,盡早將 UIWebView 全部換為 WkWebView 會(huì)比較好哥谷。所以為了能讓W(xué)ebView在所有版本都能訪問非https內(nèi)容,只能把NSAllowsArbitraryLoads設(shè)置為YES麻献。

解決方案一:開啟 NSAllowsArbitraryLoads 為 YES们妥,然后提交時(shí)進(jìn)行說明解決方案二:設(shè)置 NSExceptionDomains 屬性來訪問指定域名,然后提交時(shí)進(jìn)行說明3勉吻、第三方sdk接入與支持http訪問但是按照國(guó)內(nèi)的現(xiàn)狀监婶,關(guān)閉這個(gè)限制也許是更實(shí)際的做法。至于原因就太多了齿桃,第三方SDK(幾乎都是訪問http)惑惶,合作伙伴接入(不能要求它們一定要支持https)第三方sdk,同樣需要遵守ATS規(guī)則短纵,即第三方sdk也有被ATS過濾的風(fēng)險(xiǎn)带污,微信,qq香到,分享鱼冀,登陸功能都能正常,微博登陸不能正常通過悠就。另在網(wǎng)上找到了一些可能存在有問題的sdk千绪,目前已知的有:友盟 (已經(jīng)有最新的v1.4.0版本sdk,支持https理卑,待驗(yàn)證)百度地圖解決方案一:更新最新sdk翘紊,接入并測(cè)試解決方案二:可以設(shè)置 NSExceptionDomains屬性來將需要排除強(qiáng)制驗(yàn)證的域名寫進(jìn)來:五. 總結(jié)開啟 NSAllowsArbitraryLoads 為 YES對(duì)第三方訪問的服務(wù)器設(shè)置NSExceptionDomains方式添加白名單提交審核說明:必須連接由其他機(jī)構(gòu)控制的服務(wù)器,其還不支持安全連接藐唠。必須通過 web 展示來源不一的各種網(wǎng)絡(luò)內(nèi)容帆疟,但又不能完全使用NSAllowsArbitraryLoadsInWebContent所管理的類。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宇立,一起剝皮案震驚了整個(gè)濱河市踪宠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妈嘹,老刑警劉巖柳琢,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柬脸,警方通過查閱死者的電腦和手機(jī)他去,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倒堕,“玉大人灾测,你說我怎么就攤上這事】寻停” “怎么了媳搪?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)骤宣。 經(jīng)常有香客問我秦爆,道長(zhǎng),這世上最難降的妖魔是什么憔披? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任等限,我火速辦了婚禮,結(jié)果婚禮上活逆,老公的妹妹穿的比我還像新娘精刷。我一直安慰自己,他們只是感情好蔗候,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埂软,像睡著了一般锈遥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勘畔,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天所灸,我揣著相機(jī)與錄音,去河邊找鬼炫七。 笑死爬立,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的万哪。 我是一名探鬼主播侠驯,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼奕巍!你這毒婦竟也來了吟策?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤的止,失蹤者是張志新(化名)和其女友劉穎檩坚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匾委,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年拖叙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赂乐。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憋沿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沪猴,到底是詐尸還是另有隱情辐啄,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布运嗜,位于F島的核電站壶辜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏担租。R本人自食惡果不足惜砸民,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奋救。 院中可真熱鬧岭参,春花似錦、人聲如沸尝艘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽背亥。三九已至秒际,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狡汉,已是汗流浹背娄徊。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盾戴,地道東北人寄锐。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像尖啡,于是被迫代替她去往敵國(guó)和親橄仆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • iOS 10 適配 ATS 一. HTTPS 其實(shí)HTTPS從最終的數(shù)據(jù)解析的角度可婶,與HTTP沒有任何的區(qū)別沿癞,HT...
    made_China閱讀 1,702評(píng)論 0 12
  • SSL/TLS協(xié)議運(yùn)行機(jī)制的概述:http://blog.csdn.net/xiaofei125145/artic...
    zfl1024閱讀 2,255評(píng)論 0 5
  • 一. HTTPS 其實(shí)HTTPS從最終的數(shù)據(jù)解析的角度,與HTTP沒有任何的區(qū)別矛渴,HTTPS就是將HTTP協(xié)議數(shù)據(jù)...
    獨(dú)酌丿紅顏閱讀 3,657評(píng)論 4 122
  • 0827(D42)親愛的金祿:感恩無非椎扬,讓你準(zhǔn)時(shí)和自己對(duì)話惫搏,贊賞自己,反省自己蚕涤,你今天過的好嗎筐赔。 1坐在健身房角落...
    胡金祿閱讀 205評(píng)論 0 0
  • 超新星幸存者 一 死寂。 比死亡更象死亡的死寂揖铜。 除了自己幾近絕望的心跳聲和呼吸聲茴丰,貨車司機(jī)李無法感受到任何生的氣...
    憑虛御風(fēng)憑虛御風(fēng)閱讀 725評(píng)論 2 1