現在、 OnShouldStartLoadWithRequest はiOSでのみサポートされています。 これをAndroidでサポートするためのPR は終了しました。 Android=上のWebViewがカスタムURLスキームを開こうとすると、 アプリがクラッシュします -これにより、アプリもクラッシュします。
私が取り組んでいるアプリは、カスタム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
]を手動で変更することを含め、機能するほとんどすべてのもので大丈夫です。これをドアから出す必要があります。
onNavigationStateChange
プロパティを使用できます。これは、関数で取得するのと同じnavigator
オブジェクトを取得します onShouldStartLoadWithRequest
。
<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;
}
}
私はあなたと同じ要件を持っていました、そしてそれが私がそれを解決した方法です。
スキームを変更できる場合は、http
サフィックスを追加して、WebViewManager
がそのスキームでインテントを作成して解決しようとしないようにすることができます。
あなたがおそらくReactWebViewManager
で見たように
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("http://") || url.startsWith("https://")) {
return
}
...
}
URLがhttpで始まる場合、マネージャーはそれをスキームとして扱いません。私はそれが醜い回避策であることを知っていますが、ちょっと、それは仕事をします。