1.在iOS 9的时候,默认非HTTS的网络是被禁止的,我们可以在info.plist文件中添加NSAppTransportSecurity字典,将NSAllowsArbitraryLoads设置为YES来禁用ATS;
2.添加代码
在AppDelegate中实现以下方法
(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 默认不允许使用NSAllowsArbitraryLoads来绕过ATS的限制,也就是说强制我们用HTTPS,如果不这样的话提交App可能会被拒绝。
当然为了方便程序员的开发,前两种方法在开发阶段我们还是可以使用的,正式上线的话是不支持的,建议还是搭建满足ATS条件的https服务器。
3.我们可以通过NSExceptionDomains设置白名单的方式来针对特定的域名开放HTTP内容来通过审核。可以简单理解成,把不支持https协议的接口设置成http的接口。
第三方SDK(几乎都是访问http),合作伙伴接入(不能要求它们一定要支持https)第三方sdk,同样需要遵守ATS规则,即第三方sdk也有被ATS过滤的风险,微信,qq,分享,登陆功能都能正常,微博登陆不能正常通过。另在网上找到了一些可能存在有问题的sdk,目前已知的有:
友盟 (已经有最新的v1.4.0版本sdk,支持https,待验证)
百度地图
这时我们可以设置 NSExceptionDomains属性来将需要排除强制验证的域名写进来:
操作:
1)在项目info.plist中添加一个Key:App Transport Security Settings,类型为
Dictionary;
2)在其内添加一个Key: Exception Domains,类型为Dictionary;
3)在Exception Domains内添加要支持的域,其中域作为Key,类型为Dictionary;
4)每个域下面需要设置3个属性:类型为Boolean;
NSIncludesSubdomains YES
NSExceptionRequiresForwardSecrecy NO
NSExceptionAllowsInsecureHTTPLoads YES
注意:每个需添加的域都需要设置此三个属性。如果请求的网络图片是HTTP,也是需要设置的图片的域。
4.对于网页浏览和视频播放的行为,iOS 10 中新加入了 NSAllowsArbitraryLoadsInWebContent 键。通过将它设置为 YES,可以让 app 中的 WKWebView 和使用 AVFoundation 播放的在线视频不受 ATS 的限制。这也应该是绝大多数使用了相关特性的 app 的选择。但是坏消息是这个键在 iOS 9 中并不会起作用。
如果app只支持 iOS 10,并且有用户可以自由输入网址进行浏览的功能,或者是在线视频音频播放功能的话,简单地加入 NSAllowsArbitraryLoadsInWebContent,并且将组件换成 WKWebKit 或者 AVFoundation 就可以了。如果你还需要支持 iOS 9,并且需要访问网页和视频的话,可能只能去开启 NSAllowsArbitraryLoads 然后提交时进行说明,并且看 Apple 审核员决定让不让通过了。
另外,当 NSAllowsArbitraryLoads 和 NSAllowsArbitraryLoadsInWebContent 同时存在时,根据系统不同,表现的行为也会不一样。简单说,iOS 9 只看 NSAllowsArbitraryLoads,而 iOS 10 会先看 NSAllowsArbitraryLoadsInWebContent。在 iOS 10 中,要是 NSAllowsArbitraryLoadsInWebContent 存在的话,就忽略掉 NSAllowsArbitraryLoads,如果它不存在,则遵循 NSAllowsArbitraryLoads 的设定
UIWebView 在 NSAllowsArbitraryLoadsInWebContent 为 YES 时访问 HTTP,无效。WKWebView 在 NSAllowsArbitraryLoadsInWebContent 为 YES 时在iOS 10 中访问 HTTP,有效,iOS 9无效。如果用WkWebView替换UIWebView,iOS 7 将无法使用WkWebView,可做适配加载,没有特殊的什么需求的话,尽早将 UIWebView 全部换为 WkWebView 会比较好。所以为了能让WebView在所有版本都能访问非https内容,只能把NSAllowsArbitraryLoads设置为YES。
总结:
解决方案一:
开启 NSAllowsArbitraryLoads 为 YES,然后提交时进行说明
解决方案二:
设置 NSExceptionDomains 属性来访问指定域名,然后提交时进行说明
解决方案三:
只针对网页浏览和视频播放的行为且为iOS 10及以上,设置NSAllowsArbitraryLoadsInWebContent为Yes。