这个项目能做什么
JsBridge 是一个用于 Android WebView 与 JavaScript 双向通信的桥接库,灵感来源于微信的 WebView JsBridge 实现。它提供了安全、可靠的消息传递机制,支持 Java 调用 JavaScript 和 JavaScript 调用 Java 两种方向。
## 主要特性
- **双向通信**:支持 Java 与 JavaScript 之间的双向调用,并带有回调机制。
- **多种通信通道**:支持 URL Scheme 拦截、@JavascriptInterface、evaluateJavascript() 和 loadUrl("javascript:") 四种通道,兼容不同 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 许可证。
评论
0 评分人数达到10人后显示
登录后参与讨论。