2016-09-25 208 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开头的管理者不会把它作为一个方案。我知道这是一个丑陋的解决方法,但嘿,它可以完成这项工作。