يمكن للإضافات تبادل الرسائل مع التطبيقات الأصلية باستخدام واجهة برمجة تطبيقات مشابهة لواجهات برمجة تطبيقات تمرير الرسائل الأخرى. يجب أن تسجِّل التطبيقات الأصلية التي توفِّر هذه الميزة مضيف مراسلة أصلي يمكنه التواصل مع الإضافة. ويبدأ Chrome المضيف في عملية منفصلة ويتواصل معه باستخدام مصادر الإدخال والإخراج العادية.
مضيف المراسلة الأصلي
لتسجيل مضيف المراسلة الأصلية، يجب أن يحفظ التطبيق ملفًا يحدد إعدادات مضيف المراسلة الأصلية.
إليك مثال على الملف:
{
"name": "com.my_company.my_application",
"description": "My Application",
"path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
"type": "stdio",
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}
يجب أن يكون ملف بيان مضيف المراسلة الأصلية بتنسيق JSON صالحًا وأن يحتوي على الحقول التالية:
name
- اسم مضيف المراسلة مع التطبيقات الأصلية ويمرِّر العملاء هذه السلسلة إلى
runtime.connectNative()
أوruntime.sendNativeMessage()
. لا يمكن أن يحتوي هذا الاسم إلا على أحرف أبجدية رقمية صغيرة وشرطات سفلية ونقاط. لا يمكن أن يبدأ الاسم أو ينتهي بنقطة، ولا يمكن أن تتبع النقطة بنقطة أخرى. description
- وصف مختصر للتطبيق:
path
- المسار إلى البرنامج الثنائي لمضيف المراسلة مع التطبيقات الأصلية يجب أن يكون المسار مطلقًا على نظامَي التشغيل Linux وmacOS. في نظام التشغيل Windows، قد تكون مرتبطة بالدليل الذي يحتوي على ملف البيان. تبدأ عملية المضيف مع تعيين الدليل الحالي على الدليل الذي يحتوي على البرنامج الثنائي للمضيف. على سبيل المثال، إذا تم ضبط هذه المَعلمة على
C:\Application\nm_host.exe
، سيتم البدء باستخدام الدليل الحالي "C:\Application". type
- نوع الواجهة المُستخدَمة للتواصل مع مضيف المراسلة مع التطبيقات الأصلية لهذه المَعلمة قيمة محتملة واحدة:
stdio
. يشير هذا الرمز إلى أنّ Chrome يجب أن يستخدمstdin
وstdout
للتواصل مع المضيف. allowed_origins
- قائمة بالإضافات التي يمكنها الوصول إلى مضيف المراسلة مع التطبيقات الأصلية لا يمكن أن تحتوي قيم
allowed-origins
على أحرف بدل.
الموقع الجغرافي لمضيف المراسلة الأصلي
يعتمد موقع ملف البيان على النظام الأساسي.
في Windows، يمكن وضع ملف البيان في أي مكان في نظام الملفات. على أداة تثبيت التطبيقات إنشاء مفتاح سجلّ، إما HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.my_company.my_application
أو HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.my_company.my_application
، وأن تضبط القيمة التلقائية لهذا المفتاح على المسار الكامل لملف البيان. على سبيل المثال، باستخدام
الأمر التالي:
REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.my_company.my_application" /ve /t REG_SZ /d "C:\path\to\nmh-manifest.json" /f
أو باستخدام ملف .reg
التالي:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\com.my_company.my_application]
@="C:\\path\\to\\nmh-manifest.json"
عندما يبحث Chrome عن مضيفي الرسائل الأصلية، يتم أولاً الاستعلام عن قاعدة بيانات المسجّلين بإصدار 32 بت، ثم عن قاعدة بيانات المسجّلين 64 بت.
على نظامي التشغيل macOS وLinux، يختلف موقع ملف البيان لمضيف المراسلة الأصلي حسب المتصفح (Google Chrome أو Chromium). ويتم البحث عن مضيفي المراسلة الأصلية على مستوى النظام في موقع ثابت، بينما يتم البحث عن مضيفي الرسائل الأصلية على مستوى المستخدم في الدليل الفرعي NativeMessagingHosts/
من دليل الملف الشخصي للمستخدم.
- macOS (على مستوى النظام)
- Google Chrome:
/Library/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json
- Chromium:
/Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json
- نظام التشغيل macOS (المسار التلقائي الخاص بالمستخدم)
- Google Chrome:
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json
- Chromium:
~/Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json
- Linux (على مستوى النظام)
- Google Chrome:
/etc/opt/chrome/native-messaging-hosts/com.my_company.my_application.json
- Chromium:
/etc/chromium/native-messaging-hosts/com.my_company.my_application.json
- Linux (المسار الخاص بالمستخدم، المسار التلقائي)
- Google Chrome:
~/.config/google-chrome/NativeMessagingHosts/com.my_company.my_application.json
- Chromium:
~/.config/chromium/NativeMessagingHosts/com.my_company.my_application.json
بروتوكول المراسلة الأصلي
ويبدأ Chrome كل مضيف للمراسلة الأصلية في عملية منفصلة ويتواصل معه باستخدام الإدخال العادي (stdin
) والمخرجات العادية (stdout
). ويتم استخدام التنسيق نفسه لإرسال الرسائل في كلا الاتجاهين، ويتم وضع كل رسالة على شكل تسلسل باستخدام JSON بترميز UTF-8، وم يسبقها طول رسالة 32 بت بترتيب البايت الأصلي. ويبلغ الحد الأقصى لحجم الرسالة الواحدة من مضيف المراسلة الأصلي 1 ميغابايت، وذلك لحماية Chrome بشكل أساسي من حدوث خلل في أداء التطبيقات الأصلية. ويبلغ الحدّ الأقصى لحجم
الرسالة المُرسَلة إلى مضيف المراسلة الأصلية 4 غيغابايت.
إنّ الوسيطة الأولى لمضيف المراسلة الأصلية هي أصل المتصل، وعادةً ما يكون
chrome-extension://[ID of allowed extension]
. ويسمح ذلك لمضيفي الرسائل الأصلية بتحديد مصدر الرسالة عند تحديد إضافات متعدّدة في مفتاح allowed_origins
ضمن بيان مضيف المراسلة الأصلية.
على نظام التشغيل Windows، يتم أيضًا تمرير وسيطة سطر أوامر مع مقبض إلى نافذة Chrome الأصلية التي تُسمى --parent-window=<decimal handle value>
. يتيح ذلك لمضيف المراسلة الأصلي إنشاء نوافذ واجهة مستخدم أصلية يتم تنظيمها بشكلٍ صحيح. لاحظ أن هذه القيمة ستكون 0
إذا كان سياق الاتصال عامل خدمات.
عند إنشاء منفذ مراسلة باستخدام runtime.connectNative()
، يبدأ Chrome عملية مضيف المراسلة الأصلية ويحافظ على تشغيلها حتى يتم تدمير المنفذ. ومن ناحية أخرى، عند إرسال رسالة باستخدام runtime.sendNativeMessage()
بدون إنشاء منفذ مراسلة، يبدأ Chrome عملية مضيف مراسلة جديدة لكل رسالة. في هذه الحالة، يتم التعامل مع الرسالة الأولى التي تنشئها عملية المضيف كاستجابة للطلب الأصلي، وسيمرّرها Chrome إلى معاودة الاتصال بالاستجابة التي يتم تحديدها عند استدعاء runtime.sendNativeMessage()
. ويتم في هذه الحالة تجاهل جميع الرسائل الأخرى التي أنشأها مضيف المراسلة الأصلية.
الاتصال بتطبيق محلي
يشبه إرسال الرسائل واستلامها من تطبيق أصلي وإلى إرسال رسائل الإضافات المتبادلة إلى حدٍ كبير. يكمن الاختلاف الرئيسي في استخدام runtime.connectNative()
بدلاً من
runtime.connect()
، واستخدام runtime.sendNativeMessage()
بدلاً من
runtime.sendMessage()
.
لاستخدام هذه الطرق، يجب الإعلان عن إذن "NativeMessaging" في ملف بيان الإضافات.
لا تتوفر هذه الطرق في النصوص البرمجية للمحتوى، فقط داخل صفحات الإضافات ومشغّل الخدمات. إذا أردت إرسال الرسالة من نص برمجي للمحتوى إلى التطبيق الأصلي، فأرسِل الرسالة إلى مشغّل الخدمات لتمريرها إلى التطبيق الأصلي.
يؤدي المثال التالي إلى إنشاء كائن runtime.Port
متصل بمضيف المراسلة الأصلي
com.my_company.my_application
، ويبدأ في الاستماع إلى الرسائل من هذا المنفذ ويرسل
رسالة صادرة واحدة:
var port = chrome.runtime.connectNative('com.my_company.my_application');
port.onMessage.addListener(function (msg) {
console.log('Received' + msg);
});
port.onDisconnect.addListener(function () {
console.log('Disconnected');
});
port.postMessage({text: 'Hello, my_application'});
يمكنك استخدام runtime.sendNativeMessage
لإرسال رسالة إلى التطبيق الأصلي بدون
إنشاء منفذ، مثلاً:
chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);
تصحيح أخطاء المراسلة الأصلية
وعند حدوث إخفاقات معيّنة في المراسلة الأصلية، تتم كتابة النتائج في سجلّ الأخطاء في Chrome. ويشمل ذلك
عندما يتعذّر بدء تشغيل مضيف المراسلة الأصلية أو عندما يكتب رسالة إلى stderr
أو ينتهك بروتوكول الاتصال. على نظامَي التشغيل Linux وmacOS، يمكن الوصول إلى هذا السجلّ عن طريق بدء تشغيل Chrome من سطر الأوامر ومشاهدة مخرجاته في الوحدة الطرفية. على نظام التشغيل Windows، استخدِم --enable-logging
كما هو موضَّح في كيفية تفعيل تسجيل الدخول.
وإليك بعض الأخطاء الشائعة والنصائح لحلها:
تعذَّر بدء مضيف المراسلة مع التطبيقات الأصلية.
تحقَّق مما إذا كانت لديك أذونات كافية لتنفيذ ملف مضيف المراسلة الأصلية.
تم تحديد اسم مضيف المراسلة الأصلية غير صالح.
تحقَّق مما إذا كان الاسم يحتوي على أحرف غير صالحة. لا يُسمح إلا بالأحرف الأبجدية الرقمية الصغيرة والشرطة السفلية والنقاط. لا يمكن أن يبدأ الاسم أو ينتهي بنقطة، ولا يمكن أن تتبع النقطة نقطة أخرى.
تم الخروج من المضيف الأصلي.
تعطّل الممر المؤدي إلى مضيف المراسلة الأصلي قبل أن يقرأ Chrome الرسالة. ويبدأ هذا على الأرجح من مضيف المراسلة الأصلية.
لم يتم العثور على مضيف المراسلة الأصلية المحدّد.
يُرجى الاطّلاع على الروابط التالية:
- هل تمت كتابة الاسم بشكل صحيح في الإضافة وفي ملف البيان؟
- هل البيان في الدليل الصحيح وبالاسم الصحيح؟ راجِع موقع مضيف المراسلة الأصلي لمعرفة التنسيقات المتوقّعة.
- هل ملف البيان بالتنسيق الصحيح؟ وعلى وجه التحديد، هل JSON صالح ومنسّق بشكل جيد، وهل تتطابق القيم مع تعريف بيان مضيف المراسلة المدمجة مع المحتوى؟
- هل الملف المحدّد في
path
متوفّر؟ في نظام التشغيل Windows، قد تكون المسارات نسبية، ولكن في نظامي التشغيل macOS وLinux، يجب أن تكون المسارات مطلقة.
لم يتم تسجيل اسم مضيف المراسلة الأصلية. (نظام التشغيل Windows فقط)
لم يتم العثور على مضيف المراسلة الأصلية في سجلّ Windows. تحقّق جيدًا باستخدام regedit
ما إذا كان المفتاح قد تم إنشاؤه حقًا ويتطابق مع التنسيق المطلوب كما هو موثَّق في موقع مضيف المراسلة
الأصلي.
تم حظر الوصول إلى مضيف المراسلة مع التطبيقات الأصلية المحدّد.
هل مصدر الإضافة مدرَج في allowed_origins
؟
حدث خطأ عند الاتصال بمضيف المراسلة مع التطبيقات الأصلية.
يشير هذا إلى تنفيذ غير صحيح لبروتوكول الاتصال في مضيف المراسلة الأصلية.
- تأكَّد من أنّ جميع المخرجات في
stdout
تتوافق مع بروتوكول المراسلة الأصلي. إذا كنت تريد طباعة بعض البيانات لأغراض تصحيح الأخطاء، اكتب إلىstderr
. - احرص على أن يكون طول الرسالة 32 بت بتنسيق العدد الصحيح الأصلي للنظام الأساسي (Little-endian / big-endian).
- يجب ألا يتجاوز طول الرسالة 1024*1024.
- يجب أن يكون حجم الرسالة مساويًا لعدد وحدات البايت في الرسالة. وقد يختلف هذا عن "طول" السلسلة، لأنه قد يتم تمثيل الأحرف بعدة وحدات بايت.
- نظام التشغيل Windows فقط: احرص على ضبط وضع I/O للبرنامج على
O_BINARY
. يكون وضع الإدخال والإخراج هوO_TEXT
تلقائيًا، ما يؤدي إلى تلف تنسيق الرسالة عند استبدال فواصل الأسطر (\n
=0A
) بنهايات الأسطر في نمط Windows (\r\n
=0D 0A
). ويمكن ضبط وضع الإدخال والإخراج باستخدام__setmode
.