Проблема довольно проста.
В приложении мы хотим отслеживать текущий отображаемый 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 не обновляется.
URL: https://m.pandora.net/es-es/products/bracelets/556000
Последний обновленный url (shouldOverrideUrlLoading никогда не вызывается при нажатии на продукт): https://m.pandora.net/es-es/products/bracelets
Я пробовал с callbacks, например onPageStarted(), но URL-адрес также фильтруется и, похоже, не существует доступного вверх по течению с момента его защищенного кода.
Чтение документации по Android для WebView Я нашел это:
https://developer.android.com/guide/webapps/migrating.html#URLs
Новый WebView применяет дополнительные ограничения при запросе ресурсов и разрешении ссылок, использующих настраиваемую схему URL. Например, если вы реализуете обратные вызовы, такие как shouldOverrideUrlLoading() или shouldInterceptRequest(), то WebView вызывает их только для действительных URL-адресов.
Но все еще не имеет смысла, поскольку указанный выше URL-адрес является общим и должен соответствовать стандарту.
Любая альтернатива или решение этого?