这个项目能做什么

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 许可证。