Le problème est assez simple. Dans l'application, nous voulons garder la trace de l'url actuelle affichée. Pour cela, nous utilisons shouldOverrideUrlLoading
de l'appel de la WebViewClient
en sauvegardant l'url dans un champ de classe pour chaque mise à jour. Voici le code correspondant :
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);
Toutefois, il existe au moins un scénario dans lequel la fonction de rappel n'est jamais déclenchée et le champ mCurrentUrl n'est pas mis à jour.
L'url : https://m.pandora.net/es-es/products/bracelets/556000
Dernière url mise à jour (shouldOverrideUrlLoading n'est jamais appelé lorsque l'on clique sur le produit) : https://m.pandora.net/es-es/products/bracelets
J'ai essayé avec des callbacks comme onPageStarted(), mais l'url est aussi filtrée et il ne semble pas y avoir d'url accessible en amont puisque c'est du code protégé.
En lisant la documentation Android sur WebView, j'ai trouvé ceci :
https://developer.Android.com/guide/webapps/migrating.html#URLs
Le nouveau WebView applique des restrictions supplémentaires lors de la demande de ressources et de la résolution de liens qui utilisent un schéma URL personnalisé. Par exemple, si vous implémentez des callbacks tels que shouldOverrideUrlLoading() ou shouldInterceptRequest(), le WebView ne les invoque que pour les URL valides.
Mais cela n'a toujours pas de sens puisque l'url ci-dessus est générique et devrait répondre à la norme.
Une alternative ou une solution à ce problème ?