it-swarm.com.de

Verhindern, dass WebView URL in Android lädt (React Native)

Derzeit wird OnShouldStartLoadWithRequest nur unter iOS unterstützt. A PR, um Unterstützung auf Android hinzuzufügen, wurde geschlossen. Wenn ein WebView unter Android versucht, ein benutzerdefiniertes URL-Schema zu öffnen, wird die App zum Absturz bringen .

Die App, an der ich arbeite, muss ein WebView abfangen, das versucht, ein benutzerdefiniertes URL-Schema zu öffnen, und es abzubrechen, bevor diese URL geöffnet wird (was unter iOS false auf OnShouldStartLoadWithRequest zurückgegeben wird, ist eine gute Möglichkeit, dies zu tun).

Was ist der beste Weg, dies auf Android zu tun?

Ich möchte, dass dieser Code funktioniert:

        <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;
  }

Ich persönlich bin in Ordnung mit so ziemlich allem, was funktioniert - einschließlich der manuellen Änderung von ReactWebViewManager.Java. Ich muss das nur aus der Tür holen.

11
Jarred Sumner

Sie können die Eigenschaft onNavigationStateChange verwenden, die dasselbe navigator-Objekt erhält, das Sie in Ihrer Funktion onShouldStartLoadWithRequest erhalten. 

 <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"}}
    />

Und dann in der Funktion

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;
    }    
}

Ich hatte die gleiche Anforderung wie Sie, und so habe ich es gelöst. 

15
maha_funk

Wenn Sie das Schema ändern können, können Sie ein http-Suffix hinzufügen, damit die WebViewManager nicht versucht, eine Absicht mit diesem Schema zu erstellen und zu lösen.

Wie Sie wahrscheinlich in ReactWebViewManager gesehen haben

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("http://") || url.startsWith("https://")) {
        return 
    }
    ...
}

Wenn die URL mit http beginnt, wird sie vom Manager nicht als Schema behandelt. Ich weiß, es ist ein hässlicher Workaround, aber hey, es erledigt die Arbeit.

0
guy.gc