目前,只有iOS支持OnShouldStartLoadWithRequest。 A 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
。我只需要把它拿出来。
答案 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开头,则管理员不会将其视为方案。我知道这是一个丑陋的解决方法,但嘿,它完成了这项工作。