WebView网页打不开原因之一(及自己遇到的一些WebView问题记录)

前瞻

WebView在loadUrl的时候,可能会出现网页打不开的问题,这种问题网上一搜一大把,但是可能看了一圈下来没有你想要的答案,或许有一种可能是你平时OkHttp请求没有忽略却在配置WebView的时候忽略了,急性子请直接看文末。

起因

本人在替换x5WebView的时候遇到了这个问题,其中这是第二次替换了,第一次替换完全没有遇到任何阻碍,如果有同学在遇到了一些配置上的问题,可以去腾讯浏览服务查看步骤传送门

本人遇到的问题如图所示,并且本人试了直接加载百度首页,也是打不开的

在这里插入图片描述

过程

网上有人说是android:networkSecurityConfig=""没有配置的问题,那当然不是,因为这些配置都是之前就配好的,并不是我从头开始写的这个项目,只是拿过来维护修改而已。循着这个思路,我仔细对比了网上说的一些WebView配置问题,这些大差不差,domStorageEnabled = true是肯定设置了的,那些关键配置一个没少,那可能是什么原因呢?

我在替换过程中是自己重新写了一个WebView基类,也没有看以前的代码,索性拿过来翻了翻,发现自己少重写了一个方法,这个方法在替换x5WebView已经WebView基本设置里都没有看到啊,但是自己想了想,发送网络请求的过程中确实会遇到这个问题,就是onReceivedSslError()方法,新建WebViewClient没有重写这个方法!可能我们在做demo的时候也没有重写但是并没有问题,但是对于成品项目中,这个方法不重写处理一下的话,应该都是通过不了的吧。

Android应用中WebView访问https SSL证书网页时,Google Play 总是报 WebView 的 onReceivedSslError 错误(ERR_SSL_PROTOCOL_ERROR )。为避免谷歌安全警告,要重写WebView的onReceivedSslError方法,此时要弹框提示用户,是否忽略SSL错误,继续访问网页。

百度如是说。

具体做法可见这位老哥写的,还是很清楚的传送门

具体自己怎么做就看各位的做法了,我这里肯定是直接SslErrorHandler.proceed了,没有什么其他要处理的地方了

处理办法

重写WebView中设置的WebViewClient的onReceivedSslError()方法。忽略ssl证书错误,继续执行,

		webViewClient = object : WebViewClient() {

                override fun onReceivedSslError(p0: WebView?, p1: SslErrorHandler?, p2: SslError?) {
                    p1?.proceed()
                }

                override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                    // 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
                   
                }
            }

其他遇到的一些问题

搜索框光标丢失问题
替换好了之后有个搜索页面,跳转进去之后理应弹出键盘,搜索框内显示光标,可是理想总是美好的,显示并不是这样。检查,mWebView.requestFocus()已设置,再检查

	android:focusable="true"
    android:focusableInTouchMode="true"

WebView已设置改属性。奇了怪了,没生效?
不是,键盘弹出来了,但是光标没有显示,大概率是焦点聚焦问题,还好这个问题不是很麻烦,比较百度前几条就有一个解决的案例,传送门!就是将上面xml中设置焦点的可用的代码放在WebView的父布局中,比如FrameLayout中,再次运行,解决问题。

滑动压缩问题
这个问题困扰了我半年之余,因为该问题,已经被领导催了两次,这次机缘巧合给解决了,也幸好web端人员积极配合。
就是加载本地静态列表页面或者部分网络请求的列表页,滑动会被压缩,是很严重的那种,真机上也会出现。
出现问题之后,网上说是开启硬件加速的问题,但是我明确表示,没有开!各种配置下都没有开,app到Activity到view。我对比了不压缩的WebView设置,进行了两种对比,其实并没有太大的问题,复制过来之后依旧会压缩,然后第一次换了x5之后,还是会压缩,但是没那么厉害了。后来我将静态列表页面中的html内容复制出来,自己写了一个html,没有任何样式和js,再次放入WebView,神奇的一幕出现了,没有压缩,不管是原生的还是x5,都顺畅运行!
随后web端进行了样式修改,他取消了某种样式之后,确实不再压缩,但是不行,这个样式全局都有使用,一时半会取消不了(如果有类似的问题,可以让web先排查,毕竟WebView的设置只有那些,可能不是Native的问题)。
这次解决也是巧合,替换了最新的x5之后,我按照文档取消了加速相关的所有设置,都是默认的,使用了会导致压缩的样式,模拟器会轻微压缩,但是真机不会,具体的配置我发在下面,也算稀里糊涂解决这个问题了吧。总结:html样式背一部分的锅,另一部分,应该还是和WebView有关。目前我是app开启硬件加速了,但是view层不设置了,具体这部分我都有对比设置过,这不是解决问题的关键。发出来只是供大家参考一下,具体什么原因造成设置怎么解决的,本人也处于丈二和尚摸不着头脑的状态。
冲冲冲!

	init {
        //WebSettings设置
        settings.apply {
            //设置默认编码格式为“UTF-8”
            defaultTextEncodingName = "UTF-8"
            //设置DOM存储可用
            domStorageEnabled = true
            //js可用
            javaScriptEnabled = true
            //支持js打开新窗口
            javaScriptCanOpenWindowsAutomatically = true
            //支持自动加载图片
            loadsImagesAutomatically = true
            //设置数据库存储可用
            databaseEnabled = true
            //在File域下,能够执行任意的JavaScript代码,同源策略跨域访问能够对私有目录文件进行访问等
            allowFileAccess = true
            blockNetworkImage = false
            blockNetworkLoads = false
            //设置应用缓存可用
            setAppCacheEnabled(true)
            //设置缓存路径
            setAppCachePath(context.applicationContext.getDir("cache", Context.MODE_PRIVATE).path)
            //缓存模式:不使用缓存
            cacheMode = WebSettings.LOAD_NO_CACHE
            //支持页面缩放
            setSupportZoom(true)
            //缩放使用放大放小按钮控制
            builtInZoomControls = true
            //不显示边界滑动条
            displayZoomControls = false
            //使用浏览器组件,建议使用
            useWideViewPort = true
            loadWithOverviewMode = true
            //启用地理定位
            setGeolocationEnabled(true)
            //支持Http与Https混合模式
            mixedContentMode = 0
            //设置是否允许通过 file url 加载的 Js代码读取其他的本地文件(有风险,非内部网页建议关闭)
            setAllowFileAccessFromFileURLs(true)
            //设置是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源)(有风险,非内部网页建议关闭)
            setAllowUniversalAccessFromFileURLs(true)
            //调整线程优先级(一般不建议调整,默认normal)
            setRenderPriority(WebSettings.RenderPriority.HIGH)
            //取消垂直和水平方向的滑动栏
            isVerticalScrollBarEnabled = false
            isHorizontalScrollBarEnabled = false
            //不允许弹性滑动
            overScrollMode = View.OVER_SCROLL_NEVER
            //硬件加速
            //setLayerType(View.LAYER_TYPE_HARDWARE, null)
            webViewClient = object : WebViewClient() {

                override fun onReceivedSslError(p0: WebView?, p1: SslErrorHandler?, p2: SslError?) {
                    p1?.proceed()
                }

                override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                    // 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
                    return super.shouldOverrideUrlLoading(view, url)
                }
            }
            addJavascriptInterface(javascriptInterface, JS_OBJ_NAME)
        }
    }
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KIDD-4869

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值