博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android WebView打开网页一片空白
阅读量:6859 次
发布时间:2019-06-26

本文共 2162 字,大约阅读时间需要 7 分钟。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

问题描述:

  • 网页链接是Https链接
  • 网页链接在电脑的Chrome浏览器中打开正常
  • 网页链接在手机的Chrome浏览器中打开正常
  • 网页链接在IOS的App上打开正常
  • 网页链接在Android App中打开一片空白,没有任何提示

问题原因

试了很多方法,最后发现是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在调用了上面的SslErrorHandlercancel方法以后,就马上会回调onPageFinished方法,不会回调onReceivedError,所以也就不会展示自定义的加载错误页面,结果就是一片空白了。

原因找到了,那怎么解决呢?

其实答案也已经在上面给出了。我们直接覆写WebViewClientonReceivedSslError方法,然后根据需要做些处理。比如弹出提示框告诉用户当前证书有问题,是否继续加载等。

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"啊!

而且对WebViewClientonReceivedSslError也不熟悉,没有想到这一层。现如今基本上所有的网页链接都是Https的了,我们以后在开发过程中还是要注意这个问题,在onReceivedSslError中提前做好处理。


欢迎关注我的微信公众号,和我一起每天进步一点点!

AntDream

转载地址:http://jaxyl.baihongyu.com/

你可能感兴趣的文章
菜鸟看Redis(一)
查看>>
matplotlib.pyplot.plot()参数详解
查看>>
||PHP||关于=>和->以及::的用法
查看>>
最短路径问题
查看>>
Yii2中定义自己的Widget
查看>>
Aforge.net识别简易数字验证码问题
查看>>
JVM系列二:GC策略&内存申请、对象衰老
查看>>
MySQL 数据库备份策略:全备与增量备份
查看>>
Springboot的热部署
查看>>
Thinking in UML-1-为什么需要UML
查看>>
vs编译obj给delphi用
查看>>
过游戏保护NP或TP的几种方法和思路
查看>>
equals和hashcode为什么要一起重写
查看>>
模态与非模态对话框的问题
查看>>
地对地导弹地对地导弹地对地导弹
查看>>
让div 充满整个body
查看>>
程序员保持快乐活跃的6个好习惯(转)
查看>>
找工作的一些感悟——前端小菜的成长
查看>>
jSON Call can throw but it is not marked with try
查看>>
用过的一些服务器集成软件
查看>>