防止WebView在Android中加载URL(React Native)

时间:2016-09-25 01:01:25

标签: android networking webview react-native

目前,只有iOS支持OnShouldStartLoadWithRequestA PR to add support for this on Android已关闭。如果Android上的WebView尝试打开自定义网址方案the app will crash - 这也会导致我的应用崩溃。

我正在处理的应用程序需要拦截试图打开自定义URL方案的WebView并在打开该URL之前取消它(在iOS上,在false上返回OnShouldStartLoadWithRequest是一个很棒的这样做的方法)。

在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。我只需要把它拿出来。

2 个答案:

答案 0 :(得分:15)

您可以使用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;
    }    
}

我和你有同样的要求,这就是我如何解决它的。

答案 1 :(得分:0)

如果您可以修改方案,可以为其添加http后缀,以便WebViewManager不会尝试使用该方案创建意图并尝试解决它。​​

正如您在ReactWebViewManager

中看到的那样
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("http://") || url.startsWith("https://")) {
        return 
    }
    ...
}

如果网址以http开头,则管理员不会将其视为方案。我知道这是一个丑陋的解决方法,但嘿,它完成了这项工作。