このプロジェクトについて
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 ライセンス。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.