عن المشروع

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.