Sobre el proyecto

JsBridge es una biblioteca diseñada para facilitar la comunicación bidireccional entre el WebView de Android y JavaScript, inspirada en la implementación de JsBridge de WeChat. Proporciona un mecanismo de transmisión de mensajes seguro y confiable, soportando llamadas desde Java a JavaScript y viceversa. ## Características principales - **Comunicación bidireccional**: Permite llamadas mutuas entre Java y JavaScript con soporte para callbacks. - **Múltiples canales de comunicación**: Compatible con diferentes versiones de Android mediante cuatro métodos: interceptación de URL Scheme, @JavascriptInterface, evaluateJavascript() y loadUrl("javascript:"). - **Callbacks persistentes**: Soporta respuestas múltiples, ideal para actualizaciones en tiempo real o flujos de eventos. - **Lista blanca de dominios**: Restringe qué dominios pueden invocar métodos nativos, mejorando la seguridad. - **Cola de mensajes**: Las mensajes enviados antes de que se complete la inyección de JS se almacenan en cola y se despachan una vez completada, evitando pérdidas. - **Integración personalizada**: Facilita la integración en WebViews personalizados mediante BridgeHelper. ## Instalación Agregue la dependencia a través del repositorio JitPack: ```groovy repositories { maven { url "https://jitpack.io" } } dependencies { implementation 'com.github.happydog-intj:JsBridge:v2.1.0' } ``` ## Inicio rápido ### Uso de BridgeWebView Añada BridgeWebView al diseño e inicialícelo en la 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 llamando a JavaScript Registre un handler en el lado JS y llámelo desde 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 llamando a Java Cree una clase @JavascriptInterface para que el JS pueda invocarla: ```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; } ); ``` ### Callbacks persistentes Los callbacks por defecto se eliminan tras la primera llamada. Use `callHandlerPersistent()` para respuestas múltiples: ```java webView.callHandlerPersistent("functionInJs", data, new OnBridgeCallback() { @Override public void onCallBack(String data) { Log.d(TAG, "called again: " + data); } }); ``` ### Lista blanca de dominios Restrinja los dominios permitidos para llamar a métodos nativos: ```java webView.addAllowedHost("example.com"); webView.addAllowedHost("*.example.com"); ``` Si la lista está vacía (por defecto), todos los dominios están permitidos. ## Integración personalizada Utilice BridgeHelper para integrar la biblioteca en un WebView personalizado: ```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); } }); } } ``` ## Compatibilidad - **Android 11+ (API 30+)**: Adaptado; el acceso a archivos está desactivado por defecto y la estrategia de caché depende de la aplicación huésped. - **HarmonyOS**: Existe una versión portada por la comunidad `@alvin917/jsbridge`. - **Dispositivos embebidos**: Si ocurre un fallo al crear el WebView, verifique el proveedor de WebView del dispositivo. ## Licencia Licencia MIT.