alertを使ってjavascriptからJavaへイベントの通知を行う
webview側からAndroid側へ通知を行いたいとき、以下のような方法があります
- JavascriptInterface
- Android側から一定間隔でWebView側を監視
- onJsAlert
JavascriptInterfaceが正攻法で、指定したメソッドをJS側へ公開します しかし、JavascriptInterfaceはv4.2以前だと任意のメソッドが実行可能な脆弱性を持っています
AndroidのWebViewの脆弱性についての私的なまとめ - 金利0無利息キャッシング – キャッシングできます - subtech
古いバージョンをサポートしているといった状況だと使うことが難しくなります
かんたんに連携を行いたい!セキュリティを意識したくないと行ったときにalert
を使った方法が使えます
実装方法
WebChromeClientを継承したクラスでonJSAlert
をoverrideします
@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を実行しましょう (余計なお世話でしょうか)