当前位置: 移动技术网 > IT编程>移动开发>Android > Android WebView打开网页一片空白的解决方法

Android WebView打开网页一片空白的解决方法

2019年07月30日  | 移动技术网IT编程  | 我要评论

杨培安图片,电脑报合订本,歌手突围赛排名

问题描述:

  • 网页链接是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 的一个接口:

@override
public 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 中提前做好处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网