web-dev-qa-db-fra.com

Empêcher WebView de charger l'URL dans Android (React Native)

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.

11
Jarred Sumner

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. 

15
maha_funk

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.

0
guy.gc