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)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,714評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,776評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,210評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,654評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

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