2016-09-25 239 views
6

目前,OnShouldStartLoadWithRequest僅在iOS上受支持。 A PR to add support for this on Android已關閉。如果Android上的WebView嘗試打開自定義URL方案the app will crash - 這也會導致我的應用崩潰。防止WebView在Android中加載URL(React Native)

我正在處理的應用程序需要攔截試圖打開自定義URL方案的WebView並在打開該URL之前取消它(在iOS上,返回falseOnShouldStartLoadWithRequest上是一種很好的方法)。

在Android上這樣做的最好方法是什麼?

我想這個代碼工作:

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

我與幾乎任何工作親自好嗎 - 包括手動修改ReactWebViewManager.java。我只需要把它弄出門。

回答

9

您可以使用onNavigationStateChange屬性,該屬性將獲得與您的功能onShouldStartLoadWithRequest中相同的navigator對象。

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

然後在功能

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

我有同樣的要求,因爲你,這就是你過得我解決它。

+3

調用'stopLoading()'後,我的WebView不再處理觸摸事件。如果用戶點擊鏈接並在瀏覽器中打開鏈接,他們可能會打開我的應用程序,該應用程序仍然顯示WebView。如果他們嘗試點擊該WebView中的其他鏈接,它將不會執行任何操作。你有沒有遇到過這個? – ckeeney

0

如果您可以修改該方案,則可以向其添加http後綴,以便WebViewManager不會嘗試用該方案創建意圖並嘗試解決該問題。

正如你可能在ReactWebViewManager

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

看到如果網址以http開頭的管理者不會把它作爲一個方案。我知道這是一個醜陋的解決方法,但嘿,它可以完成這項工作。