Actuellement, OnShouldStartLoadWithRequest est uniquement pris en charge sur iOS. Un PR pour ajouter le support pour cela sur Android était fermé. Si une WebView sur Android essaie d'ouvrir un schéma d'URL personnalisé, l'application va planter -, ce qui provoque également le blocage de mon application.
L'application sur laquelle je travaille doit intercepter une WebView qui tente d'ouvrir un schéma d'URL personnalisé et de l'annuler avant d'ouvrir cette URL (qui, sur iOS, renvoyer false
sur OnShouldStartLoadWithRequest
est un excellent moyen de le faire).
Quelle est la meilleure façon de faire cela sur Android?
Je veux que ce code fonctionne:
<WebView
ref={WEBVIEW_REF}
source={{uri: INITIAL_URI}}
onShouldStartLoadWithRequest={this.onShouldStartLoadWithRequest}
style={{width, height: height - navBarHeight, backgroundColor: "#fff"}}
/>
onShouldStartLoadWithRequest(navigator) {
if (navigator.url.indexOf(INTERCEPT_URL) === -1) {
return true;
}
return false;
}
Personnellement, je suis d'accord avec pratiquement tout ce qui fonctionne, y compris la modification manuelle de ReactWebViewManager.Java
. J'ai juste besoin de sortir ceci de la porte.
Vous pouvez utiliser la propriété onNavigationStateChange
, qui aura le même objet navigator
que dans votre fonction onShouldStartLoadWithRequest
.
<WebView
ref={WEBVIEW_REF}
source={{uri: INITIAL_URI}}
onShouldStartLoadWithRequest={this.onShouldStartLoadWithRequest} //for iOS
onNavigationStateChange ={this.onShouldStartLoadWithRequest} //for Android
style={{width, height: height - navBarHeight, backgroundColor: "#fff"}}
/>
Et puis dans la fonction
onShouldStartLoadWithRequest(navigator) {
if (navigator.url.indexOf(INTERCEPT_URL) === -1) {
return true;
} else {
this.refs[WEBVIEW_REF].stopLoading(); //Some reference to your WebView to make it stop loading that URL
return false;
}
}
J'avais les mêmes exigences que vous et c'est comme ça que j'ai résolu le problème.
Si vous pouvez modifier le schéma, vous pouvez ajouter le suffixe http
afin que le WebViewManager
n'essaie pas de créer une intention avec ce schéma ni de le résoudre.
Comme vous l'avez probablement vu dans ReactWebViewManager
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("http://") || url.startsWith("https://")) {
return
}
...
}
Si l'URL commence par http, le gestionnaire ne le traitera pas comme un schéma. Je sais que c'est une solution de contournement moche, mais bon, ça fait le travail.