首页 > 解决方案 > Webview shouldOverrideUrlLoading 不捕获 URL 请求

问题描述

我正在尝试解析每个点击事件,拦截尝试加载到 webview 中的 http url,并根据 url 的解析方式决定是否应该根据一组逻辑显示它。我遵循了关于这 3 个 StackOverflow 链接的建议:

1)拦截并覆盖来自 WebView 的 HTTP 请求

2) Android Web-View shouldOverrideUrlLoading() 已弃用。(替代)

3) https://stackoverflow.com/a/32711309/2480714

没有它解决我的问题。主要问题是用户单击 web 视图以加载超链接,并且似乎没有调用shouldOverrideUrlLoading方法或每次都没有正确拦截 url。

我创建了我的自定义 WebViewClient 并首先覆盖它,目的是在未经我批准的情况下停止所有负载,但我遇到了障碍;一些url 正在加载和绕过我的覆盖方法,而有些则没有。我不知道为什么会这样。

这是我的 WebviewClient 类:

public class CustomWebViewClient2 extends WebViewClient {

    public CustomWebViewClient2(){

    }

    @Override
    public void onPageFinished(WebView view, String url) {
        Log.d("log", "(CustomWebViewClient) onPageFinished, URL == " + url);
    }


    @SuppressLint("NewApi")
    @Nullable
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        Log.d("log", "shouldInterceptRequest hit");
        return null;
    }

    @Nullable
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        Log.d("log", "shouldInterceptRequest hit");
        return null;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        Log.d("log", "(CustomWebViewClient) shouldOverrideUrlLoading");
        return true;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Log.d("log", "(CustomWebViewClient) shouldOverrideUrlLoading");
        return true;
    }


    @Override
    public void onLoadResource(WebView view, String url) {
        Log.d("log", "intercepting onLoadResource, url == " + url);
    }


    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        Log.d("log", "onPageStarted url == " + url);
    }
}

如您所见,它覆盖了正确的方法,并且(理论上)应该加载 URL,除非我将它传递给 webview 进行加载,但不幸的是,有些网站正在加载,而另一些则没有。

我还尝试根据答案之一中的此评论禁用缓存:

“请注意!如果您拦截了浏览器检索图像(或可能是任何资源)的尝试,然后返回 null(意味着让 WebView 继续检索图像),任何未来对该资源的请求都可能会转到缓存并且不会触发 shouldInterceptRequest()。如果要拦截每个图像请求,则需要禁用缓存或(我所做的)调用 WebView.clearCache(true)"

但无济于事。为什么某些 URL 会加载并绕过覆盖,而其他 URL 则不会?

更新 1:这是一个示例 URL https://cookpad.com/us,它反映了我所指的问题。它似乎与在服务器端实现的 Turbolinks 有关。

标签: androidcachingwebviewandroid-webviewwebviewclient

解决方案


推荐阅读