web-dev-qa-db-ja.com

Android(React Native)でWebViewがURLをロードしないようにする

現在、 OnShouldStartLoadWithRequest はiOSでのみサポートされています。 これをAndroidでサポートするためのPR は終了しました。 Android=上のWebViewがカスタムURLスキームを開こうとすると、 アプリがクラッシュします -これにより、アプリもクラッシュします。

私が取り組んでいるアプリは、カスタム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]を手動で変更することを含め、機能するほとんどすべてのもので大丈夫です。これをドアから出す必要があります。

11
Jarred Sumner

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

私はあなたと同じ要件を持っていました、そしてそれが私がそれを解決した方法です。

17
maha_funk

スキームを変更できる場合は、httpサフィックスを追加して、WebViewManagerがそのスキームでインテントを作成して解決しようとしないようにすることができます。

あなたがおそらくReactWebViewManagerで見たように

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

URLがhttpで始まる場合、マネージャーはそれをスキームとして扱いません。私はそれが醜い回避策であることを知っていますが、ちょっと、それは仕事をします。

0
guy.gc