Проблема довольно проста. В приложении мы хотим отслеживать отображение текущего URL-адреса. Для этого мы используем обратный вызов shouldOverrideUrlLoading
из WebViewClient
, сохраняя URL-адрес в поле класса для каждого обновления. Вот соответствующий код:WebViewClient не вызывает shouldOverrideUrlLoading
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
Я попытался с обратными вызовами, как onPageStarted(), но URL также фильтруется и там Безразлично Кажется, что он является доступным вверх по течению после его защищенного кода.
Чтение андроида документации о WebView я нашел это:
https://developer.android.com/guide/webapps/migrating.html#URLs
Новый WebView применяет дополнительные ограничения при запросе ресурсов и разрешения ссылок, которые используют пользовательскую схему URL. Например, если вы выполняете обратные вызовы, такие как shouldOverrideUrlLoading() или shouldInterceptRequest(), то WebView вызывает их только для действительных URL-адресов.
Но все еще не имеет смысла, поскольку вышеуказанный URL-адрес является общим и должен соответствовать стандарту.
Любая альтернатива или решение этой проблемы?
ничего особенного в URL, как это запрос с использованием 'Post' метод? – Swordsman
Вы пытались переопределить метод onReceivedError в своем пользовательском WebViewClient? Возможно, вы можете проверить параметры запроса и ошибки из этого обратного вызова, чтобы узнать, что происходит. Кроме того, попробуйте ввести этот URL-адрес в браузер своего устройства, чтобы убедиться, что что-то не так с фактической загрузкой веб-страницы. – w3bshark
Эта страница работает нормально, и ошибки не получено. Я думаю, что ответ лежит в API истории HTML5, который может изменить URL-адрес, отображаемый в браузере, без фактического запуска запроса (поскольку контент работает в рамке сценария) – SuppressWarnings