1.在iOS 9的時候,默認(rèn)非HTTS的網(wǎng)絡(luò)是被禁止的,我們可以在info.plist文件中添加NSAppTransportSecurity字典,將NSAllowsArbitraryLoads設(shè)置為YES來禁用ATS;

2.添加代碼
在AppDelegate中實(shí)現(xiàn)以下方法
(1)swift下
extensionNSURLRequest{
static funcallowsAnyHTTPSCertificateForH
ost(host:String) ->Bool{
return true
}
}
(2)Objective-C下
@implementationNSURLRequest(NSURLRequestWithIgnoreSSL)
+(BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host
{
returnYES;
}
@end
但是從2017年1月1日起,所有新提交的 app 默認(rèn)不允許使用NSAllowsArbitraryLoads來繞過ATS的限制,也就是說強(qiáng)制我們用HTTPS,如果不這樣的話提交App可能會被拒絕。
當(dāng)然為了方便程序員的開發(fā),前兩種方法在開發(fā)階段我們還是可以使用的,正式上線的話是不支持的,建議還是搭建滿足ATS條件的https服務(wù)器。
3.我們可以通過NSExceptionDomains設(shè)置白名單的方式來針對特定的域名開放HTTP內(nèi)容來通過審核??梢院唵卫斫獬桑巡恢С謍ttps協(xié)議的接口設(shè)置成http的接口。
第三方SDK(幾乎都是訪問http),合作伙伴接入(不能要求它們一定要支持https)第三方sdk,同樣需要遵守ATS規(guī)則,即第三方sdk也有被ATS過濾的風(fēng)險,微信,qq,分享,登陸功能都能正常,微博登陸不能正常通過。另在網(wǎng)上找到了一些可能存在有問題的sdk,目前已知的有:
友盟 (已經(jīng)有最新的v1.4.0版本sdk,支持https,待驗(yàn)證)
百度地圖
這時我們可以設(shè)置 NSExceptionDomains屬性來將需要排除強(qiáng)制驗(yàn)證的域名寫進(jìn)來:
操作:
1)在項(xiàng)目info.plist中添加一個Key:App Transport Security Settings,類型為
Dictionary;
2)在其內(nèi)添加一個Key: Exception Domains,類型為Dictionary;
3)在Exception Domains內(nèi)添加要支持的域,其中域作為Key,類型為Dictionary;
4)每個域下面需要設(shè)置3個屬性:類型為Boolean;
NSIncludesSubdomains? YES
NSExceptionRequiresForwardSecrecy? NO
NSExceptionAllowsInsecureHTTPLoads? YES

注意:每個需添加的域都需要設(shè)置此三個屬性。如果請求的網(wǎng)絡(luò)圖片是HTTP,也是需要設(shè)置的圖片的域。
4.對于網(wǎng)頁瀏覽和視頻播放的行為,iOS 10 中新加入了 NSAllowsArbitraryLoadsInWebContent 鍵。通過將它設(shè)置為 YES,可以讓 app 中的 WKWebView 和使用 AVFoundation 播放的在線視頻不受 ATS 的限制。這也應(yīng)該是絕大多數(shù)使用了相關(guān)特性的 app 的選擇。但是壞消息是這個鍵在 iOS 9 中并不會起作用。
如果app只支持 iOS 10,并且有用戶可以自由輸入網(wǎng)址進(jìn)行瀏覽的功能,或者是在線視頻音頻播放功能的話,簡單地加入 NSAllowsArbitraryLoadsInWebContent,并且將組件換成 WKWebKit 或者 AVFoundation 就可以了。如果你還需要支持 iOS 9,并且需要訪問網(wǎng)頁和視頻的話,可能只能去開啟 NSAllowsArbitraryLoads 然后提交時進(jìn)行說明,并且看 Apple 審核員決定讓不讓通過了。
另外,當(dāng) NSAllowsArbitraryLoads 和 NSAllowsArbitraryLoadsInWebContent 同時存在時,根據(jù)系統(tǒng)不同,表現(xiàn)的行為也會不一樣。簡單說,iOS 9 只看 NSAllowsArbitraryLoads,而 iOS 10 會先看 NSAllowsArbitraryLoadsInWebContent。在 iOS 10 中,要是 NSAllowsArbitraryLoadsInWebContent 存在的話,就忽略掉 NSAllowsArbitraryLoads,如果它不存在,則遵循 NSAllowsArbitraryLoads 的設(shè)定
UIWebView 在 NSAllowsArbitraryLoadsInWebContent 為 YES 時訪問 HTTP,無效。WKWebView 在 NSAllowsArbitraryLoadsInWebContent 為 YES 時在iOS 10 中訪問 HTTP,有效,iOS 9無效。如果用WkWebView替換UIWebView,iOS 7 將無法使用WkWebView,可做適配加載,沒有特殊的什么需求的話,盡早將 UIWebView 全部換為 WkWebView 會比較好。所以為了能讓W(xué)ebView在所有版本都能訪問非https內(nèi)容,只能把NSAllowsArbitraryLoads設(shè)置為YES。
總結(jié):
解決方案一:
開啟 NSAllowsArbitraryLoads 為 YES,然后提交時進(jìn)行說明
解決方案二:
設(shè)置 NSExceptionDomains 屬性來訪問指定域名,然后提交時進(jìn)行說明
解決方案三:
只針對網(wǎng)頁瀏覽和視頻播放的行為且為iOS 10及以上,設(shè)置NSAllowsArbitraryLoadsInWebContent為Yes。