このプロジェクトについて

JsBridge は Android WebView と JavaScript の双方向通信に使用するブリッジライブラリであり、WeChat の WebView JsBridge 実装に着想を得ている。安全で信頼性の高いメッセージ伝達メカニズムを提供し、Java から JavaScript への呼び出しと JavaScript から Java への呼び出しの両方向をサポートする。 ## 主な特徴 - **双方向通信**:Java と JavaScript の間の双方向呼び出しをサポートし、コールバックメカニズムを備えている。 - **多様な通信チャネル**:URL Scheme インターセプト、@JavascriptInterface、evaluateJavascript()、loadUrl("javascript:") の4つのチャネルをサポートし、異なる Android バージョンに対応する。 - **永続コールバック**:複数回の応答に対応するコールバックをサポートし、リアルタイム更新やイベントストリームなどのシナリオに適している。 - **ドメインホワイトリスト**:ネイティブメソッドを呼び出せるドメインを制限でき、セキュリティを強化する。 - **メッセージキュー**:JS 注入完了前に送信されたメッセージは自動的にキューイングされ、注入完了後に一括でディスパッチされるため、メッセージの喪失を回避できる。 - **カスタム WebView 統合**:BridgeHelper を通じてカスタム WebView に簡単に統合できる。 ## インストール JitPack リポジトリから依存関係を追加する: ```groovy repositories { maven { url "https://jitpack.io" } } dependencies { implementation 'com.github.happydog-intj:JsBridge:v2.1.0' } ``` ## クイックスタート ### BridgeWebView の使用 レイアウトに BridgeWebView を追加し、Activity で初期化する: ```java BridgeWebView webView = findViewById(R.id.webView); webView.setGson(new Gson()); webView.addJavascriptInterface( new MainJavascriptInterface( webView.getCallbacks(), webView.getPersistentCallbacks(), webView), "WebViewJavascriptBridge"); webView.loadUrl("file:///android_asset/demo.html"); ``` ### Java から JavaScript を呼び出す JS 側で handler を登録し、Java から呼び出す: ```javascript WebViewJavascriptBridge.registerHandler("functionInJs", function(data, responseCallback) { document.getElementById("show").innerHTML = "data from Java: = " + data; responseCallback("Javascript Says Right back aka!"); }); ``` ```java webView.callHandler("functionInJs", new Gson().toJson(user), new OnBridgeCallback() { @Override public void onCallBack(String data) { Log.d(TAG, "response from JS: " + data); } }); ``` ### JavaScript から Java を呼び出す @JavascriptInterface クラスを作成すると、JS 側から呼び出せる: ```java public class MainJavascriptInterface extends BridgeWebView.BaseJavascriptInterface { @JavascriptInterface public void submitFromWeb(String data, String callbackId) { Log.d("JSInterface", "data from web: " + data); mWebView.responseFromWeb("response from Java", callbackId); } } ``` ```javascript WebViewJavascriptBridge.callHandler( 'submitFromWeb', {'param': 'value'}, function(responseData) { document.getElementById("show").innerHTML = "response: " + responseData; } ); ``` ### 永続コールバック デフォルトのコールバックは初回呼び出し後に自動的に削除される。`callHandlerPersistent()` を使用すると複数回の応答を実現できる: ```java webView.callHandlerPersistent("functionInJs", data, new OnBridgeCallback() { @Override public void onCallBack(String data) { Log.d(TAG, "called again: " + data); } }); ``` ### ドメインホワイトリスト ネイティブメソッドを呼び出せるドメインを制限する: ```java webView.addAllowedHost("example.com"); webView.addAllowedHost("*.example.com"); ``` ホワイトリストが空の場合(デフォルト)、すべてのドメインが許可される。 ## カスタム WebView への統合 BridgeHelper を通じてカスタム WebView に統合できる: ```java public class CustomWebView extends WebView implements WebViewJavascriptBridge, IWebView { private BridgeHelper bridgeHelper; private void init() { getSettings().setJavaScriptEnabled(true); bridgeHelper = new BridgeHelper(this); setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { bridgeHelper.onPageStarted(); } @Override public void onPageFinished(WebView view, String url) { bridgeHelper.onPageFinished(); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return bridgeHelper.shouldOverrideUrlLoading(url); } }); } } ``` ## 互換性 - **Android 11+ (API 30+)**:対応済み。デフォルトでファイルアクセス権限は無効化され、キャッシュ戦略はホスト App が決定する。 - **HarmonyOS**:コミュニティが移植版 `@alvin917/jsbridge` を提供している。 - **組み込みデバイス**:WebView 作成時のクラッシュが発生する場合は、デバイスの WebView プロバイダを確認すること。 ## ライセンス MIT ライセンス。