alertを使ってjavascriptからJavaへイベントの通知を行う

webview側からAndroid側へ通知を行いたいとき、以下のような方法があります

  • JavascriptInterface
  • Android側から一定間隔でWebView側を監視
  • onJsAlert

JavascriptInterfaceが正攻法で、指定したメソッドをJS側へ公開します しかし、JavascriptInterfaceはv4.2以前だと任意のメソッドが実行可能な脆弱性を持っています

AndroidのWebViewの脆弱性についての私的なまとめ - 金利0無利息キャッシング – キャッシングできます - subtech

古いバージョンをサポートしているといった状況だと使うことが難しくなります

かんたんに連携を行いたい!セキュリティを意識したくないと行ったときにalertを使った方法が使えます

実装方法

WebChromeClientを継承したクラスでonJSAlertをoverrideします

Android

@Override
public boolean onJsAlert(WebView view, String url, final String message, JsResult result) { 
    if (message != null && message.length() > 0) {
        if (message.equals("click#button")) {
            onClickHogeHoge();
            result.confirm();
            return true;
        }
    }
}

JS側

$("#button").click(function() {
    alert("click#button");
});

解説

messageにalertのメッセージが渡ります この文字列を判定し、任意の処理に流します

result.confirmを実行することにより、アラートダイアログを終了させます

戻り値をtrueにすることで、JS側のアラート表示を抑制できます

注意事項

  • result.confirmは必ず実行する

これを実行しない場合、アラートが閉じられずアプリがフリーズします

  • JSのalertの実行はアプリからの

ブラウザでも同じアプリケーションを提供している場合、当然ながらこのjsをそのまま仕込むとボタンをクリックするたびにアラートが表示されます UA等でアプリからのアクセスかどうかをチェックしJSを実行しましょう (余計なお世話でしょうか)