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.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.