美文网首页
Android——WebView常见问题

Android——WebView常见问题

作者: 得食猫 | 来源:发表于2019-06-28 08:40 被阅读0次

    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以下的解决方法暂时还未找到,有知道的小伙伴希望能留个言,谢谢。

    相关文章

      网友评论

          本文标题:Android——WebView常见问题

          本文链接:https://www.haomeiwen.com/subject/nemjcctx.html