android - WebViewClient 不调用 shouldOverrideUrlLoading

标签 android webview android-webview

问题很简单。 在应用程序中,我们希望跟踪显示的当前 url。为此,我们使用来自 WebViewClientshouldOverrideUrlLoading 回调,方法是在每次更新时将 url 保存到类字段中。相关代码如下:

    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setDomStorageEnabled(true); 
    mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            mCurrentUrl = url;

            // If we don't return false then any redirect (like redirecting to the mobile
            // version of the page) or any link click will open the web browser (like an
            // implicit intent).
            return false;
        }



        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            ...
        }
    });
    mWebView.loadUrl(mInitialUrl);

但是,至少存在一种情况,即永远不会触发回调并且不会更新 mCurrentUrl 字段。

网址:https://m.pandora.net/es-es/products/bracelets/556000

最后更新的 url(单击产品时永远不会调用 shouldOverrideUrlLoading):https://m.pandora.net/es-es/products/bracelets

我已经尝试过像 onPageStarted() 这样的回调,但是 url 也被过滤了,而且由于其 protected 代码,上游似乎没有可访问的。

阅读关于 WebView 的 android 文档我发现了这个:

https://developer.android.com/guide/webapps/migrating.html#URLs

在请求资源和解析使用自定义 URL 方案的链接时,新的 WebView 应用了额外的限制。例如,如果您实现诸如 shouldOverrideUrlLoading() 或 shouldInterceptRequest() 之类的回调,则 WebView 只会针对有效的 URL 调用它们。

但仍然没有意义,因为上面的 url 是通用的,应该符合标准。

有什么替代方案或解决方案吗?

最佳答案

当您单击该网页上的产品时,它会使用 JavaScript 加载新内容并使用 HTML5 History APIs 更新地址栏中的可见 URL。 .

来自上面的 MDN 文章:

This will cause the URL bar to display http://mozilla.org/bar.html, but won't cause the browser to load bar.html or even check that bar.html exists.

这些有时称为 single-page applications .由于实际加载的页面没有改变,因此不会调用页面加载的 WebView 回调。

如果您确切地知道要拦截哪种 HTTP 请求,则可以使用为每个请求调用的 shouldInterceptRequest 回调。 Web 应用程序很可能会从 API 加载一些数据,例如当产品显示时,您随后可以检测到这些数据。

如果无法检测到这一点,但您可以控制 Web 应用程序,则可以使用 Android JavaScript interface直接从网页调用 Android 应用程序中的方法。

如果您无法控制加载的页面,您仍然可以尝试 inject a local JavaScript file进入网页和observe when the history APIs are used ,然后通过 JS 接口(interface)调用 Android 应用程序中的方法。我尝试使用上一个链接中描述的方法在 Chrome 中观察这些事件,它似乎工作正常。

关于android - WebViewClient 不调用 shouldOverrideUrlLoading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39979950/

相关文章:

java - 在适配器内打开一个对话框返回空值

java - 找不到符号变量 main

android - Android fragment 底部的奇怪空白?

API 18 上未添加 JavaScriptInterface

javascript - 单击链接时从 Android WebView 中的 anchor 标记获取 href 值

android - 如何更改选项菜单的语言?

ios - 在 swift3 中加载 webview 时后退按钮卡住了?

javascript - 获取整型变量的值以进行动态加载

Android 排除一些相机 Intent