前段时间,公司一哥们把他的手机拿给我看,问到公司的软件加载进去是空白页,等了好久也是空白。我也为是网络出现了问题,排查没问题啊。看看是不是缓存问题,又是清缓存,又是卸载重装。结果还是空白页面。想了一下是不是系统问题,问他有没有更新过系统。结果真的是,他刚更新了android7.0系统之后就出现了加载wenview是空白页的问题。
仔细查看资料,貌似android7.0对webview好像没什么限制问题。只是可能会有局部Api会改变。所以,我就一处处排查,打印各种error日志。最后发现,公司的数据都是用https去请求数据。那会不会是系统因为安全性问题,进行了部分限制?因为,之前知道,当我们https请求数据,系统日期不对,证书有问题,也会导致请求不成功。
所以,针对性的查看了webview关于SSL相关的Api。所以找到了这个方法
这是一个SSL失败时,都会回调的一个方法,所以,我就在这里打印了日志
Log.d("onReceivedSslError: ",""+error.getPrimaryError()); 日志结果是:onReceivedSslError: 3,所以我就找到问题了,就是Ssl关于证书的错误。但是,这个3啥意思啊? 当时,我一直不知道这个3是什么意思,所以查看了关于SslError的源码,发现它原来已经定义了几种错误,分别是:发现既有日期不对,又有对证书的不信任,所以也就知道这个3是什么了。SSL_UNTAUSTED,就是对证书丢失,接下来就要去处理它了。网上也有一种最暴力的做法,如果回调到这个public void onReceivedSslError(WebView view, android.webkit.SslErrorHandler handler, android.net.http.SslError error) { },就通过SslErrorHandler.process放过它,就是忽略它。虽然,这个方法简单粗暴,但是却忽略了SSL的作用,因为我们都不进行校验,很容易导致数据被窃取,数据不安全啊。所以我并不想这么做。![]()
我的做法就是全部去判断
if(error.getPrimaryError() == SslError.SSL_DATE_INVALID || error.getPrimaryError() == SslError.SSL_EXPIRED || error.getPrimaryError() == SslError.SSL_INVALID || error.getPrimaryError() == SslError.SSL_UNTRUSTED) { handler.proceed(); }else{ handler.cancel(); } 前两个是代表日期问题,第三个是webview的bug,最后一个是证书丢失,如果有这些问题,将忽略它,而不是什么情况都跳过SSL这一层,这样真的很不友好。所以 问题也就解决了。