时间:2021-05-21
问题描述:
问题原因
试了很多方法,最后发现是Https的证书有问题,由于网页链接是客户提供的,不知道证书是如何生成的,导致不被Android系统信任
问题的发现之旅
网页链接在手机和电脑都能打开,所以想着网页链接本身应该没有问题。
debug网页加载的过程也没有发现问题
但是后来用UC浏览器打开以后发现加载的过程中会弹出提示:
出错的提示
根据弹出的提示知道很可能是证书的问题,于是重新开始debug项目中的WebView
一般我们在初始化一个 WebView 时都有几个固定的步骤,其中最重要的一步就是设置 WebViewClient
enWebview.setWebChromeClient(new WebChromeClient());enWebview.setWebViewClient(new WebViewClient());如果WebView加载因为证书的问题失败,就会回调 WebViewClient 的一个接口:
@Overridepublic void onReceivedSslError(final WebView view, final SslErrorHandler handler, SslError error) {}而 WebViewClient 默认会终止加载
public class WebViewClient { public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) { //终止加载 handler.cancel(); } ...}这个 handler 是一个 SslErrorHandler 接口
public class SslErrorHandler extends Handler { /** * @hide Only for use by WebViewProvider implementations. */ @SystemApi public SslErrorHandler() {} /** * Proceed with the SSL certificate. */ public void proceed() {} /** * Cancel this request and all pending requests for the WebView that had * the error. */ public void cancel() {}}通过上面的注释我们可以知道,调用 proceed 就是继续利用当前证书加载,而 cancel 就是终止本次的所有请求。而上面 WebViewClient 显然默认是终止所有请求了。
通过debug发现, WebViewClient 在调用了上面的 SslErrorHandler 的 cancel 方法以后,就马上会回调 onPageFinished 方法,不会回调 onReceivedError ,所以也就不会展示自定义的加载错误页面,结果就是一片空白了。
原因找到了,那怎么解决呢?
其实答案也已经在上面给出了。我们直接覆写 WebViewClient 的 onReceivedSslError 方法,然后根据需要做些处理。比如弹出提示框告诉用户当前证书有问题,是否继续加载等。
public class MyWebViewClient { public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) { //弹出提示框,让用户决定是否继续加载 //1.用户选择继续加载 // handler.proceed(); //2.用户取消 //handler.cancel() } ...}总结
这个问题困扰了很久,刚刚开始想到可能是WebView兼容问题,因为印象里WebView有很多坑。但是同一个客户提供的另一个Https的链接是正常的,而且之前没有出现过这种情况,于是debug进去发现网页链接正常传入了就没多想,就认为是没问题了。还是"too young, too simple"啊!
而且对 WebViewClient 的 onReceivedSslError 也不熟悉,没有想到这一层。现如今基本上所有的网页链接都是 Https 的了,我们以后在开发过程中还是要注意这个问题,在 onReceivedSslError 中提前做好处理。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
ios8appstore空白怎么办?小编带来了更新ios8appstore打开空白解决方法。有的小伙伴在升级iOS8正式版之后打开AppStore一片空白,
当你打开IE浏览器时,IE窗口显示为一片空白,这种情况发生的原因是,有关IE浏览器的动态链接库没有被正确的注册,解决方法就是:单击“开始&rdquo
VideoScribe打开一片空白怎么办?VideoScrib最近打开以后一直是空白没法编辑这个现象,该怎么解决这个问题呢?下面我们就来看看详细的教程。软件名称
win10桌面一片空白的解决方法: 1、系统图标消失 桌面右键进入个性化窗口,在主题选项找到桌面图标设置,在桌面图标设置中找到你想要显示的系统图标。 2、
4月21日消息,近日有不少网友在网上反映,打开苹果AppStore经常会出现乱码情况,要不就是一片空白或者504错误。实际上,近几天还有类似iTunesStor