स्थानीय मैसेज सेवा

एक्सटेंशन और ऐप्लिकेशन, इससे मिलते-जुलते एपीआई का इस्तेमाल करके, स्थानीय ऐप्लिकेशन के साथ मैसेज भेज सकते हैं मैसेज पास करने वाले दूसरे एपीआई. इस सुविधा का समर्थन करने वाले स्थानीय ऐप्लिकेशन को नेटिव मैसेजिंग होस्ट, जिसे एक्सटेंशन से संपर्क करने का तरीका पता हो. 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 और OSX पर पाथ बिलकुल सटीक होना चाहिए. Windows पर यह उस डायरेक्ट्री के हिसाब से हो सकता है जिसमें मेनिफ़ेस्ट फ़ाइल मौजूद है. होस्ट की प्रोसेस शुरू होती है, तो मौजूदा डायरेक्ट्री को उस डायरेक्ट्री पर सेट किया जाता है जिसमें होस्ट बाइनरी होती है. उदाहरण के लिए, अगर इस पैरामीटर को C:\Application\nm_host.exe पर सेट किया जाता है, तो इसे मौजूदा डायरेक्ट्री C:\Application\ से शुरू किया जाएगा.
typeनेटिव मैसेजिंग होस्ट से संपर्क करने के लिए इस्तेमाल किए जाने वाले इंटरफ़ेस का टाइप. फ़िलहाल, इस पैरामीटर के लिए सिर्फ़ एक संभावित वैल्यू है: stdio. इससे पता चलता है कि होस्ट से संपर्क करने के लिए, Chrome को stdin और stdout का इस्तेमाल करना चाहिए.
allowed_originsऐसे एक्सटेंशन की सूची जिनके पास नेटिव मैसेजिंग होस्ट का ऐक्सेस होना चाहिए. chrome-extension://*/* जैसे वाइल्डकार्ड का इस्तेमाल करने की अनुमति नहीं है.

नेटिव मैसेजिंग होस्ट की जगह

मेनिफ़ेस्ट फ़ाइल की जगह की जानकारी प्लैटफ़ॉर्म के हिसाब से तय होती है.

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-बिट से क्वेरी की जाती है रजिस्ट्री.

OS X और Linux पर, नेटिव मैसेजिंग होस्ट की मेनिफ़ेस्ट फ़ाइल की जगह, (Google Chrome या Chromium). पूरे सिस्टम में मौजूद नेटिव मैसेजिंग होस्ट को एक तय संख्या में जगह है, जबकि उपयोगकर्ता-लेवल के नेटिव मैसेजिंग होस्ट, उपयोगकर्ता प्रोफ़ाइल डायरेक्ट्री NativeMessagingHosts कहा जाता है.

  • OS X (पूरे सिस्टम में)
    • Google Chrome: /Library/Google/Chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • क्रोमियम: /Library/Application Support/Chromium/NativeMessagingHosts/_com.my_company.my_application_.json
  • OS X (उपयोगकर्ता के लिए, डिफ़ॉल्ट पाथ)
    • Google Chrome: ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • क्रोमियम: ~/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
    • क्रोमियम: /etc/chromium/native-messaging-hosts/_com.my_company.my_application_.json
  • Linux (उपयोगकर्ता के लिए, डिफ़ॉल्ट पाथ)
    • Google Chrome: ~/.config/google-chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • क्रोमियम: ~/.config/chromium/NativeMessagingHosts/_com.my_company.my_application_.json

नेटिव मैसेजिंग प्रोटोकॉल

Chrome हर नेटिव मैसेजिंग होस्ट को एक अलग प्रोसेस से शुरू करता है और स्टैंडर्ड इनपुट (stdin) और स्टैंडर्ड आउटपुट (stdout). इसमें मैसेज भेजने के लिए इसी फ़ॉर्मैट का इस्तेमाल किया जाता है दोनों दिशा-निर्देश: हर मैसेज को JSON कोड में बदला गया है और इसे UTF-8 कोड में बदला गया है. इससे पहले मैसेज में 32-बिट का इस्तेमाल किया जाता है मैसेज की लंबाई नेटिव बाइट के क्रम में. मूल मैसेज से मिलने वाले किसी एक मैसेज का ज़्यादा से ज़्यादा साइज़ होस्ट 1 MB का है, जो मुख्य रूप से Chrome को स्थानीय ऐप्लिकेशन से दुर्व्यवहार से बचाने के लिए है. ज़्यादा से ज़्यादा नेटिव मैसेजिंग होस्ट को भेजा जाने वाला मैसेज 4 जीबी का है.

नेटिव मैसेजिंग होस्ट का पहला तर्क, कॉलर का ऑरिजिन होता है. आम तौर पर, chrome-extension://[ID of allowed extension]. इससे नेटिव मैसेजिंग होस्ट को, मैसेज का सोर्स जब allowed_origins कुंजी में कई एक्सटेंशन के बारे में नेटिव मैसेजिंग होस्ट मेनिफ़ेस्ट. चेतावनी: Windows में, Chrome 54 और उससे पहले के वर्शन में, ऑरिजिन को दूसरे पैरामीटर के तौर पर पास किया गया था का इस्तेमाल करें.

जब runtime.connectNative का इस्तेमाल करके मैसेजिंग पोर्ट बनाया जाता है, तो Chrome नेटिव मैसेजिंग शुरू करता है होस्ट प्रोसेस शामिल होती है और पोर्ट के खत्म होने तक उसे चालू रखती है. दूसरी ओर, जब कोई मैसेज runtime.sendNativeMessage का इस्तेमाल करके भेजा जाता है. इसके लिए, Chrome मैसेजिंग पोर्ट बनाए बिना नया पोर्ट शुरू करता है हर मैसेज को लागू करने के लिए नेटिव मैसेजिंग होस्ट की प्रोसेस. ऐसे में, होस्ट का जनरेट किया गया पहला मैसेज का इस्तेमाल, ओरिजनल अनुरोध के रिस्पॉन्स के तौर पर किया जाता है. इसका मतलब है कि Chrome इसे रिस्पॉन्स के तौर पर पास कर देगा कॉलबैक यह तब तय किया जाता है, जब runtime.sendNativeMessage को कॉल किया जाता है. इसके ज़रिए जनरेट किए गए अन्य सभी मैसेज ऐसे मामले में, नेटिव मैसेजिंग होस्ट को अनदेखा कर दिया जाता है.

Windows पर, नेटिव मैसेजिंग होस्ट को Chrome नेटिव विंडो को कॉल किया जा रहा है: --parent-window=<decimal handle value>. इससे नेटिव विज्ञापन मैसेजिंग होस्ट, ऐसी नेटिव यूज़र इंटरफ़ेस (यूआई) विंडो बनाता है जिन्हें सही तरीके से पैरंट किया जाता है. ध्यान दें कि यह मान 0, अगर कॉल करने का कॉन्टेक्स्ट बैकग्राउंड स्क्रिप्ट पेज है.

स्थानीय ऐप्लिकेशन से कनेक्ट करना

किसी स्थानीय ऐप्लिकेशन पर संदेश भेजना और उससे संदेश भेजना बहुत क्रॉस-एक्सटेंशन के समान है को बढ़ावा देते हैं. दोनों में मुख्य अंतर यह है कि इसके बजाय 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);
  });

नेटिव मैसेज को डीबग करना

जब नेटिव मैसेजिंग होस्ट चालू नहीं हो पाता है, तो वह stderr को लिखता है या जब वह कम्यूनिकेशन प्रोटोकॉल, आउटपुट को Chrome के गड़बड़ी लॉग में लिखा जाता है. Linux और OS X पर, यह लॉग कमांड लाइन से Chrome को शुरू करके और टर्मिनल. Windows पर, लॉग इन करने का तरीका बताने वाले लेख के मुताबिक --enable-logging का इस्तेमाल करें.

यहां कुछ गड़बड़ियां और समस्याएं हल करने के लिए सलाह दी गई है:

  • नेटिव मैसेजिंग होस्ट को शुरू नहीं किया जा सका.
    • देखें कि आपके पास फ़ाइल को एक्ज़ीक्यूट करने के लिए ज़रूरी अनुमतियां हैं या नहीं.
  • नेटिव मैसेजिंग होस्ट का नाम अमान्य है.
    • जांच लें कि नाम में कोई अमान्य वर्ण तो नहीं है. सिर्फ़ अंग्रेज़ी के छोटे अक्षरों में, अक्षर और अंक, अंडरस्कोर और बिंदुओं की अनुमति है. नाम, बिंदु से शुरू या खत्म नहीं हो सकता. साथ ही, बिंदु नहीं हो सकता उसके बाद एक और बिंदु.
  • नेटिव होस्ट अब बंद हो गया है.
    • Chrome के मैसेज पढ़ने से पहले, स्थानीय मैसेजिंग होस्ट का पाइप ठीक नहीं हो सका. यह ज़्यादातर आपके नेटिव मैसेजिंग होस्ट से शुरू होने की संभावना होती है.
  • बताया गया नेटिव मैसेजिंग होस्ट नहीं मिला.
    • क्या एक्सटेंशन और मेनिफ़ेस्ट फ़ाइल में नाम की स्पेलिंग सही है?
    • क्या मेनिफ़ेस्ट को सही डायरेक्ट्री में सही नाम के साथ रखा गया है? नेटिव मैसेजिंग होस्ट की जानकारी देखें जगह की जानकारी सबमिट करें.
    • क्या मेनिफ़ेस्ट फ़ाइल सही फ़ॉर्मैट में है? खास तौर पर, क्या JSON सिंटैक्स सही है और वैल्यू, नेटिव मैसेजिंग होस्ट मेनिफ़ेस्ट की परिभाषा से मेल खाती हैं?
    • क्या path में दी गई फ़ाइल मौजूद है? Windows पर, पाथ एक-दूसरे से मिलते-जुलते हो सकते हैं. हालांकि, OS X और Linux पर, पाथ पूरे होने चाहिए.
  • नेटिव मैसेजिंग होस्ट का होस्ट नेम रजिस्टर नहीं है. (सिर्फ़ Windows में)
  • बताए गए नेटिव मैसेजिंग होस्ट का ऐक्सेस नहीं है.
    • क्या एक्सटेंशन का ऑरिजिन, allowed_origins में शामिल किया गया है?
  • नेटिव मैसेजिंग होस्ट से संपर्क करते समय गड़बड़ी हुई.
    • यह एक आम गड़बड़ी है और यह बताता है कि कम्यूनिकेशन प्रोटोकॉल को गलत तरीके से लागू किया गया है नेटिव मैसेजिंग होस्ट में मिलेगी.
    • पक्का करें कि stdout के सभी आउटपुट, नेटिव मैसेजिंग प्रोटोकॉल के मुताबिक हों. अगर आपको डीबग करने के मकसद से कुछ डेटा प्रिंट करने के लिए, stderr पर लिखें.
    • पक्का करें कि 32-बिट मैसेज की लंबाई, प्लैटफ़ॉर्म के नेटिव पूर्णांक फ़ॉर्मैट (little-endian) में हो / बिग-एंडियन).
    • मैसेज की लंबाई 1024*1024 से ज़्यादा नहीं होनी चाहिए.
    • मैसेज का साइज़, मैसेज में मौजूद बाइट की संख्या के बराबर होना चाहिए. यह सुविधा, "अवधि" स्ट्रिंग की एक बड़ी संख्या डालें, क्योंकि हो सकता है कि वर्णों को कई बाइट से दिखाया जाए.
    • सिर्फ़ Windows के लिए: पक्का करें कि प्रोग्राम का I/O मोड O_BINARY पर सेट हो. डिफ़ॉल्ट रूप से, I/O मोड O_TEXT है, जो मैसेज फ़ॉर्मैट को खराब कर देता है. ऐसा इसलिए होता है, क्योंकि लाइन ब्रेक (\n = 0A) को इससे बदल दिया जाता है Windows-स्टाइल लाइन के आखिरी हिस्से (\r\n = 0D 0A). I/O मोड को __setmode का इस्तेमाल करके सेट किया जा सकता है.