Android WebView打开网页一片空白
本文首发于公众号“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
的一个接口:
@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
在调用了上面的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
中提前做好处理。
欢迎关注我的微信公众号,和我一起每天进步一点点!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Flutter实战(二) 写一个天气查询的APP
前面一篇文章[Flutter实战1 写一个天气查询的APP]实现了一个显示城市、温度、天气、湿度的界面,但是这个界面只有一个显示的功能,没有任何可交互的地方,本篇文章继续完善查询天气的APP的功能。 先上效果图; 增加两个功能: 新增一个城市选择的页面 在城市选择页面,点击城市,跳转到对应城市天气的页面 1. 创建城市选择页面 在Android中新建一个页面,需要用Activity,在iOS中需要用ViewController,但在Flutter中,新建一个页面只需要用Widge就行,所以我们新建一个CityWidget.dart,CityWidget是一个ListView,从服务器拉取城市的列表并显示,我们用CityData.dart来存储城市的数据。代码如下: CityData.dart class CityData{ String cityName; CityData(this.cityName); } CityWidget.dart CityWidget是一个StatefulWidget,因为CityWidget里的数据是从服务器上拉的,是变的,所以需要用StatefulW...
- 下一篇
Swift 无限轮播图
ICycleView ICycleView是一个基于UICollectionView实现的轻量级无限轮播图 Content [Features]() [Requirements]() [CocoaPods]() [Usage]() [默认滚动视图]() [自定义图片宽度和指示器的位置和颜色]() [自定义Cell-纯代码和Xib创建都支持]() [Implementation]() [实现原理]() [主要代码]() [UICollectionView代理方法]() [循环轮播实现]() [Contact]() [Github]() Features 支持单张图片 支持滚动图片宽度设置 支持本地图片显示,网路图显示,本地图片和网路图混合显示 支持自定义图片展示Cell(纯代码和Xib创建都支持) 支持UIPageControl具体位置设置 支持UIPageControl显示颜色设置 支持图片点击回调 支持图片滚动回调 Requirements iOS 8.0+ Swift 4.0+ CocoaPods pod 'ICycleView', '~> 1.0.0' 在终端 pod se...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS关闭SELinux安全模块
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Linux系统CentOS6、CentOS7手动修改IP地址