عن المشروع
JsBridge هي مكتبة جسر للتواصل ثنائي الاتجاه بين Android WebView و JavaScript، مستوحاة من تنفيذ WebView JsBridge في WeChat. توفر آلية موثوقة وآمنة لتمرير الرسائل، وتدعم استدعاء Java لـ JavaScript واستدعاء JavaScript لـ Java.
الميزات الرئيسية
- تواصل ثنائي الاتجاه: يدعم الاستدعاء المتبادل بين Java و JavaScript مع آلية رد اتصال.
- قنوات تواصل متعددة: يدعم اعتراض URL Scheme، و @JavascriptInterface، و evaluateJavascript()، و loadUrl("javascript:")، مما يضمن التوافق مع إصدارات Android المختلفة.
- ردود اتصال مستمرة: تدعم ردود اتصال متعددة الاستجابة، مناسبة للتحديثات الفورية وتدفقات الأحداث.
- قائمة بيضاء للنطاقات: يمكن تقييد النطاقات المسموح لها باستدعاء الطرق الأصلية، مما يعزز الأمان.
- طابور الرسائل: يتم وضع الرسائل المرسلة قبل اكتمال حقن JS في طابور وتوزيعها تلقائياً بعد اكتمال الحقن، مما يمنع فقدان الرسائل.
- تكامل WebView مخصص: يمكن دمجها بسهولة في WebView مخصص عبر BridgeHelper.
التثبيت
أضف التبعية عبر مستودع JitPack:
repositories {
maven { url "https://jitpack.io" }
}
dependencies {
implementation 'com.github.happydog-intj:JsBridge:v2.1.0'
}
البدء السريع
استخدام BridgeWebView
أضف BridgeWebView في التخطيط، ثم قم بتهيئته في Activity:
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، ثم استدعِه من Java:
WebViewJavascriptBridge.registerHandler("functionInJs", function(data, responseCallback) {
document.getElementById("show").innerHTML = "data from Java: = " + data;
responseCallback("Javascript Says Right back aka!");
});
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 استدعاؤها:
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);
}
}
WebViewJavascriptBridge.callHandler(
'submitFromWeb',
{'param': 'value'},
function(responseData) {
document.getElementById("show").innerHTML = "response: " + responseData;
}
);
ردود اتصال مستمرة
الرد الافتراضي يُحذف بعد أول استدعاء. استخدم callHandlerPersistent() للحصول على استجابات متعددة:
webView.callHandlerPersistent("functionInJs", data, new OnBridgeCallback() {
@Override
public void onCallBack(String data) {
Log.d(TAG, "called again: " + data);
}
});
قائمة بيضاء للنطاقات
قيد النطاقات التي يمكنها استدعاء الطرق الأصلية:
webView.addAllowedHost("example.com");
webView.addAllowedHost("*.example.com");
إذا كانت القائمة البيضاء فارغة (افتراضياً)، يُسمح لجميع النطاقات.
تكامل WebView مخصص
يمكن دمج الجسر في WebView مخصص عبر BridgeHelper:
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+): مدعوم، يتم تعطيل الوصول إلى الملفات افتراضياً، وتحدد استراتيجية التخزين المؤقت من قبل التطبيق المضيف.
- HarmonyOS: يتوفر إصدار منقول من المجتمع @alvin917/jsbridge.
- الأجهزة المدمجة: في حال حدوث تعطل عند إنشاء WebView، تحقق من موفر WebView في الجهاز.
الترخيص
رخصة MIT.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.