WebView常见问题

1. 添加https的证书验证

需要重写WebViewClient中的shouldInterceptRequest方法对请求进行拦截,而且只能对get请求进行验证,post在这里无法获取到请求参数,代码如下:

override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
                if (request == null || request.method != "GET") {
                    return null
                } else {
                    val uri = request.url              
                    val urlPath = URL(request.url.toString())
                    val urlConnection = urlPath.openConnection()
                    urlConnection as HttpsURLConnection
                    urlConnection.sslSocketFactory = HttpsUtils.getSSLSocketFactory(R.raw.test)
                    for (entry in request.requestHeaders.entries) {
                            urlConnection.setRequestProperty(entry.key, entry.value)
                        }
                    var contentType = urlConnection.contentType
                    var encoding = urlConnection.contentEncoding
                    val inputStream = urlConnection.getInputStream()
                    return WebResourceResponse(contentType, encoding, inputStream)
                }
            }

而关于

HttpsUtils.getSSLSocketFactory(R.raw.test)

这段代码参考Retrofit使用https

2. 加载url显示的是源代码而不是网页内容

很奇葩的问题,我这里出现这个问题的背景是由于使用了上面所说的https证书验证。去除证书验证一切OK,加上后就会只显示源代码了。通过与正常显示的html进行对比,最后定位到contentType的问题
正常的html:
contentType="text/html"
而显示不正常的html:
contentType="text/html;charset=UTF-8"
而contentEncoding获取的就是编码类型,但通过api获取的却是null,因此重新调整contentType和contentEncoding

var contentType = urlConnection.contentType
var encoding = urlConnection.contentEncoding
val inputStream = urlConnection.getInputStream()
if (contentType != null) {
    contentType = contentType.toLowerCase()
    if (contentType.contains("charset")) {
        if (encoding == null) {
            encoding = contentType.substringAfterLast("=")
            }
        contentType = contentType.substringBeforeLast(";")
     }
}
return WebResourceResponse(contentType, encoding, inputStream)
3. 不能弹出键盘

有些情况下h5的输入框点击后无法弹出键盘,而系统自带的WebView是没问题的。一般出现这种问题是由于系统的双参构造函数为

public WebView(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.webViewStyle);
    }

而我的是

public MyWebView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

设置defStyle为com.android.internal.R.attr.webViewStyle问题解决

4. 请求跨域问题

为加快h5的加载,将原本在服务端的h5放在了本地,因此造成了原本能正常发送的请求发不出去了,这是因为出现了跨域问题,原本www.xxx.com/index.html变成了file://xxxxx/index.html,而网络请求的域名依旧是www.xxx.com。为解决跨域问题需要添加如下配置,

webView.settings.allowUniversalAccessFromFileURLs = true
5. 本地html的cookie

与问题4一样,也是h5本地化后出现的问题,原本h5中的请求是有cookie的,本地化后木有了,需要添加如下配置

CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true)

该方法只有在Android 5.0及以上才有效,5.0以下的解决方法暂时还未找到,有知道的小伙伴希望能留个言,谢谢。

6.网页加载失败
6.1 NET::ERR_CACHE_MISS

缺少了网络权限

<uses-permission android:name="android.permission.INTERNET"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

得食猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值