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在调用了上面的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

目录
相关文章
|
2月前
|
程序员 开发工具 Android开发
Android|WebView 禁止长按,限制非白名单域名的跳转层级
如何限制 WebView 仅域名白名单网址能随意跳转,并禁用长按选择文字。
44 2
|
2月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
387 0
|
6月前
|
Android开发 UED Kotlin
kotlin webview 加载网页失败后如何再次重试
在Kotlin中,当使用WebView加载网页失败时,可通过设置WebViewClient并覆盖`onReceivedError`方法来捕获失败事件。在该回调中,可以显示错误信息或尝试使用`reload()`重试加载。以下是一个简要示例展示如何处理加载失败
|
6月前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
6月前
|
JavaScript 前端开发 Android开发
kotlin安卓在Jetpack Compose 框架下使用webview , 网页中的JavaScript代码如何与native交互
在Jetpack Compose中使用Kotlin创建Webview组件,设置JavaScript交互:`@Composable`函数`ComposableWebView`加载网页并启用JavaScript。通过`addJavascriptInterface`添加`WebAppInterface`类,允许JavaScript调用Android方法如播放音频。当页面加载完成时,执行`onWebViewReady`回调。
|
5月前
|
Web App开发 JavaScript 前端开发
Android端使用WebView注入一段js代码实现js调用android
Android端使用WebView注入一段js代码实现js调用android
142 0
|
5月前
|
Android开发
【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk
【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk
155 0
|
19天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
40 19
|
19天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
45 14