作者: xteamer成员: 清泓
【摘要】这个问题,虽然比较简单,但是也很复杂。简单在于其实涉及的并非功能和逻辑性的问题,但是为什么遭到如此困扰,花费了我大部分精力研究,而其他代码所花费的时间其实相比而来却小于牛毛。这其实是一个android端和ios端共同存在的问题,都涉及到一个安全证书问题。
白屏情况有一种可能性就是在第一次加载完成之后,到第二次白屏如下解决办法:
尝试在每次请求Webview前清理缓存 /** 清理缓存 */ - (void)clearWbCache { [[NSURLCache sharedURLCache] removeAllCachedResponses]; [[NSURLCache sharedURLCache] setDiskCapacity:0]; [[NSURLCache sharedURLCache] setMemoryCapacity:0]; }
重点在于证书问题,这个问题测试出来我是根据连续加载几个网址得出的结论
百度能加载出来
https://www.baidu.com/
http开头的百度也能加载出来
http://www.baidu.com/
x-team不能加载
http://shupai.downline.cn/
简书能加载
https://www.jianshu.com
https://www.jianshu.com/p/1f33b6da658a
绿色巴士下载网(显示无安全证书)不能加载
http://www.greenxf.com/android/270488.html
所有显示无安全证书的网站都不能够加载成功,直接白屏
不一一上图,把所能发现的安全问题的图给截图出来
通过Chrome浏览器里先加载网页,左上角会显示网站证书情况
如下图所示:
图一(不能加载)
图二(能够加载)
题定位出来,那么,是如何造成的呢
原因就是:
原定于2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS[1],需要配置Https。但是现在不需要了,无固定期限的往后延期了,但是这个还是得弄明白下为好,说不定哪天突然就让弄了。
一、 2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS。
就是要求去掉 Info.plist 的 NSAllowsArbitraryLoads
1.这要求所有通过APP发送的网络请求都需要https
2.开启ATS,图片(例如图像的URL)等静态文件的url需要用https,否则会无法加载;
3.对于H5,网页浏览和视频播放的行为,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent 键。通过将它设置为 YES ,
可以让你的 app 中的 WKWebView 和使用 AVFoundation 播放的在线视频不受 ATS 的限制[2]。
这也应该是绝大多数使用了相关特性的 app 的选择。但是坏消息是这个键在 iOS 9 中并不会起作用.
4.iOS9中可以选择使用 NSExceptionDomains 来针对特定的域名开放 HTTP 应该要相对容易过审核。“需要访问的域名是第三方服务器,他们没有进行 HTTPS 对应”会是审核时的一个可选理由,但是这应该只需要针对特定域名,而非全面开放。如果访问的是自己的服务器的话,可能这个理由会无法通过。是需要在Info.plist 配置中的XML源码
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>http://XXX.com</key> <dict> <!--适用于这个特定域名下的所有子域--> <key>NSIncludesSubdomains</key> <true/> <!--扩展可接受的密码列表:这个域名可以使用不支持 forward secrecy 协议的密码--> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <!--允许App进行不安全的HTTP请求--> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <!--在这里声明所支持的 TLS 最低版本--> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> </dict> </dict> </dict>
App Transport Security(简称ATS)特性, 主要使到原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输。这也意味着所有的HTTP协议都强制使用了HTTPS协议进行传输关闭很简单,打开项目中的info.plist文件,在其中添加一个字典类型的项目App Transport Security Settings,然后在其中添加一个key:Allow Arbitrary Loads,其值为YES.如下所示:这段配置中的NSAppTransportSecurity是ATS配置的根节点,配置了节点表示告诉系统要走自定义的ATS设置。而NSAllowsAritraryLoads节点则是控制是否禁用ATS特性,设置YES就是禁用ATS功能。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
-- 服从代理协议并实现代理方法
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler { // 判断服务器采用的验证方法 if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) { // 如果没有错误的情况下 创建一个凭证,并使用证书 if (challenge.previousFailureCount == 0) { NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential, credential); }else { // 验证失败,取消本次验证 completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); } }else { completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); } }
UIwebview(初始化记载)
UIWebView *webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view = webView;
NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
安全证书问题[3]
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
NSURLCredential *card = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential,card)
}
欢迎关注 技术团队的知乎账号 我们凭团队实例运作以下专栏, 必须干货!
互联网创业专栏 (我们小伙伴的创业历程)
与您一起聊技术 (APP、微信公众号、小程序、H5 技术总结)
互联网产品研发管理 (我们公司对产品结构的管理思路)
我们是不一样的技术团队:
(我们认为:所有的企业行为,都解读为交易行为,无论是摩拜单车、外卖平台、自动售货机、招聘社区、家政服务,都用交易的语言来表达,我们专栏里面有很多实际案例和开发过程和交付流程)
(类似于元素周期表,我们把交易拆解成元素级别,根据业务定制组装,完全复原个性化需求,我们专栏里面有很学术也很实际的介绍)
(每个项目设置: 导师成长基金、参与人员的奖励,全员股权池,创业氛围浓郁,我们专栏公开分享了我们的一些经验)
(专治各种复杂的业务场景, 我们通过简洁的元素和分层组合,来完成复杂场景的业务定制,我们在这一块有非常多的案例,在互联网创业专栏里面有详细描述)
参考
- ^2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS https://www.jianshu.com/p/88d26c2cf8ca
- ^关于 iOS 10 中 ATS / HTTPS /2017 问题 https://www.cnblogs.com/fuunnyy/p/6140510.html?utm_source=itdadao&utm_medium=referral
- ^iOS中的Https安全问题 https://www.jianshu.com/p/038a4e70a15f