问题比较简单。在应用程序中,我们希望跟踪显示的当前 url。为此,我们使用 shouldOverrideUrlLoading
来自 WebViewClient
的回调,方法是为每次更新将 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 也被过滤了,而且由于其受保护的代码,上游似乎没有可访问的。
阅读关于 WebView 的 android 文档我发现了这个:
https://developer.android.com/guide/webapps/migrating.html#URLs
在请求资源和解析使用自定义 URL 方案的链接时,新的 WebView 应用了额外的限制。例如,如果您实施诸如 shouldOverrideUrlLoading() 或 shouldInterceptRequest() 之类的回调,则 WebView 仅针对有效的 URL 调用它们。
但仍然没有意义,因为上面的 url 是通用的,应该符合标准。
有什么替代方案或解决方案吗?
原文由 SuppressWarnings 发布,翻译遵循 CC BY-SA 4.0 许可协议
当您单击该网页上的产品时,它会使用 JavaScript 加载新内容,并使用 HTML5 History APIs 更新地址栏中的可见 URL。
从上面的 MDN 文章:
这些有时称为 单页应用程序。由于实际加载的页面没有改变,因此不会调用页面加载的 WebView 回调。
如果您确切知道要拦截哪种 HTTP 请求,则可以使用
shouldInterceptRequest
为每个请求调用的回调。 Web 应用程序很可能会从 API 加载一些数据,例如在显示产品时,您随后可以检测到这些数据。如果无法检测到这一点,但您可以控制 Web 应用程序,则可以使用 Android JavaScript 接口 直接从网页调用 Android 应用程序中的方法。
如果您无法控制加载的页面,您仍然可以尝试 将本地 JavaScript 文件 注入网页并 观察何时使用历史 API ,然后通过 JS 接口调用 Android 应用程序中的方法。我尝试使用上一个链接中描述的方法在 Chrome 中观察这些事件,它似乎工作正常。