2016-09-25 3 views
6

Derzeit wird OnShouldStartLoadWithRequest nur unter iOS unterstützt. A PR to add support for this on Android wurde geschlossen. Wenn ein WebView unter Android versucht, ein benutzerdefiniertes URL-Schema zu öffnen, the app will crash - wodurch meine App ebenfalls abstürzt. Die App, an der ich gerade arbeite, muss ein WebView abfangen, das versucht, ein benutzerdefiniertes URL-Schema zu öffnen und es vor dem Öffnen dieser URL abzubrechen (was unter iOS false auf OnShouldStartLoadWithRequest ist eine großartige Möglichkeit, das zu tun).Verhindern, dass WebView URL in Android lädt (Reactive Native)

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

Ich möchte diesen Code arbeiten:

 <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 bin persönlich mit so ziemlich alles in Ordnung, das funktioniert - einschließlich ReactWebViewManager.java manuell ändern. Ich muss es nur aus der Tür holen.

Antwort

9

Sie können die onNavigationStateChange Eigenschaft verwenden, die das gleiche navigator Objekt erhält, wie 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; 
    }  
} 

hatte ich die gleiche Anforderung wie Sie, und das ist how've ich es gelöst.

+3

Nach dem Aufruf von 'stopLoading()' behandelt meine WebView Touch-Ereignisse nicht mehr. Wenn der Benutzer auf einen Link klickt und ihn in seinem Browser öffnet, kann er später meine App öffnen, die immer noch das WebView anzeigt. Wenn sie versuchen, auf einen anderen Link in diesem WebView zu klicken, wird nichts unternommen. Bist du dem begegnet? – ckeeney

0

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

Wie Sie wahrscheinlich in ReactWebViewManager sah

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

Wenn die URL mit http beginnt der Manager wird es als ein Schema nicht behandeln. Ich weiß, es ist ein hässlicher Workaround, aber hey, es macht den Job.

Verwandte Themen