android webview白屏_关于ios端webview加载白屏解决问题历程

a3ff3c4f2f5cb14771f0a6b3e7b4ccec.png

作者: 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浏览器里先加载网页,左上角会显示网站证书情况

如下图所示:

a6c97407c04dc913376ae9eeae03d326.png

图一(不能加载)

45ac2f38d09968e7a5129b8dd7d0032d.png

图二(能够加载)

题定位出来,那么,是如何造成的呢

原因就是:

原定于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 技术总结)

互联网产品研发管理 (我们公司对产品结构的管理思路)

我们是不一样的技术团队:

f882a4452140db2b778bd10fc8b87708.png

(我们认为:所有的企业行为,都解读为交易行为,无论是摩拜单车、外卖平台、自动售货机、招聘社区、家政服务,都用交易的语言来表达,我们专栏里面有很多实际案例和开发过程和交付流程)

9788d2373c26da0bf05ef7a5f91436b2.png

(类似于元素周期表,我们把交易拆解成元素级别,根据业务定制组装,完全复原个性化需求,我们专栏里面有很学术也很实际的介绍)

a2fa9f8930922968fb3c8fca0c710cbf.png

(每个项目设置: 导师成长基金、参与人员的奖励,全员股权池,创业氛围浓郁,我们专栏公开分享了我们的一些经验)

b28930e81583aa3a504818915f35f3be.png

(专治各种复杂的业务场景, 我们通过简洁的元素和分层组合,来完成复杂场景的业务定制,我们在这一块有非常多的案例,在互联网创业专栏里面有详细描述)

参考

  1. ^2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS https://www.jianshu.com/p/88d26c2cf8ca
  2. ^关于 iOS 10 中 ATS / HTTPS /2017 问题 https://www.cnblogs.com/fuunnyy/p/6140510.html?utm_source=itdadao&utm_medium=referral
  3. ^iOS中的Https安全问题 https://www.jianshu.com/p/038a4e70a15f
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值