通過將瀏覽器所在客戶端的本地應用註冊為Chrome瀏覽器擴充套件的“本地訊息主機(native messaging host)”,Chrome瀏覽器擴充套件還可以與客戶端本地應用之間收發訊息。
客戶端的本地應用註冊為Chrome瀏覽器擴充套件的“本地訊息主機”之後,Chrome瀏覽器會在獨立的程式中啟動該本地應用,並通過標準輸入/輸出流(stdin/stdout)進行訊息通訊。
1) 本地應用的配置檔案的內容
本地應用要能夠成為“本地訊息主機”,必須有一個manifest.json配置檔案(檔名任意),該檔案是一個有效的JSON檔案,示例如下。
1 { 2 "name": "com.my_company.my_application", 3 "description": "My Application", 4 "path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe", 5 "type": "stdio", 6 "allowed_origins": [ 7 "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/" 8 ] 9 }
其中的屬性含義及用法如下。
屬性名 |
含義 |
name |
標識名稱。 只能由小寫字母、數字、_和.組成;首尾不能是.且不能有. 連續出現 |
description |
描述 |
path |
本地應用的完整路徑,Linux和OS X上必須是絕對路徑,Windows上可以是基於配置檔案所在位置的相對路徑 |
type |
與本地訊息主機進行通訊的介面型別。 目前只支援stdio,表示Chrome瀏覽器通過stdin和stdout與本地訊息主機通訊 |
allowed_origins |
授權與本地訊息主機進行通訊的Chrome瀏覽器擴充套件。 不能使用萬用字元 |
2) 本地應用的配置檔案的路徑
配置檔案的具體位置與作業系統有關。在Windows作業系統上,配置檔案可以位於任何路徑,只需在安裝本地應用時修改登錄檔指明其位置即可。
建立key:
HKEY_LOCAL_MACHINE
\SOFTWARE\Google\Chrome\NativeMessagingHosts\
com.my_company.my_application
或
HKEY_CURRENT_USER
\SOFTWARE\Google\Chrome\NativeMessagingHosts\
com.my_company.my_application
設定預設值Default為配置檔案所在的絕對路徑:
C:\path\to\nmh-manifest.json
也可以直接建立登錄檔檔案.reg如下,安裝時執行即可:
1 Windows Registry Editor Version 5.00 2 [HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\com.my_company.my_application] 3 @="C:\\path\\to\\nmh-manifest.json"
對於Linux和OS X作業系統,本地應用的配置檔案的位置首先與安裝的Chrome瀏覽器(Google Chrome或Chromium)有關。其次,如果是系統級別的本地應用,其配置檔案應該位於固定位置。如果是使用者級別的本地應用,則其配置檔案位於使用者主目錄下的名為NativeMessagingHosts的子目錄中。具體位置如下表所示。
|
Google Chrome |
Chromium |
Linux系統應用 |
/etc/opt/chrome/native-messaging-hosts/com.my_company.my_application.json |
/etc/chromium/native-messaging-hosts/com.my_company.my_application.json |
Linux使用者應用 |
~/.config/google-chrome/NativeMessagingHosts/com.my_company.my_application.json |
~/.config/chromium/NativeMessagingHosts/com.my_company.my_application.json |
OS X系統應用 |
/Library/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json |
/Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json |
OS X使用者應用 |
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json |
~/Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json |
3) Chrome瀏覽器擴充套件與本地應用之間的訊息通訊
Chrome瀏覽器擴充套件要與客戶端本地應用進行通訊,首先必須在Chrome瀏覽器擴充套件的manifest.json配置檔案中宣告許可權如下:
1 { 2 "permissions": [ 3 "nativeMessaging" 4 ], 5 }
Chrome瀏覽器擴充套件與客戶端本地應用之間的訊息通訊非常類似於不同Chrome瀏覽器擴充套件之間的通訊,示例如下。
在Chrome瀏覽器擴充套件中建立埠,監聽來自本地應用的多個訊息:
1 var port = chrome.runtime.connectNative('com.my_company.my_application'); 2 //引數為本地應用在其配置檔案中宣告的標識名稱 3 4 port.onMessage.addListener(function(msg) {//收到訊息後的處理函式 5 console.log("Received" + msg); 6 }); 7 port.onDisconnect.addListener(function() { 8 console.log("Disconnected"); 9 }); 10 11 port.postMessage({ text: "Hello, my_application" }); //傳送一條訊息
在Chrome瀏覽器擴充套件中也可以不開啟埠,傳送一次性訊息如下:
1 chrome.runtime.sendNativeMessage( 2 'com.my_company.my_application', 3 { text: "Hello" }, 4 function(response) {//收到返回訊息後的處理函式 5 console.log("Received " + response); 6 });
如果Chrome瀏覽器擴充套件在呼叫本地應用時發生異常,將會在stderr輸出錯誤資訊。如果因違反了本地訊息的協議約束而出錯,將會在Chrome瀏覽器的錯誤日誌檔案輸出錯誤資訊。Linux和OS X作業系統上,通過命令列啟動Chrome瀏覽器,就可以在命令列視窗看到錯誤資訊。Windows作業系統上,啟動Chrome瀏覽器時帶上--enable-logging引數(在chrome.exe的右鍵屬性選單中,General皮膚頂部的文字框中,chrome.exe後面直接跟上引數即可),就可以在Chrome瀏覽器的日誌檔案中看到錯誤資訊。
4) 本地訊息的協議約束
客戶端的本地應用註冊為Chrome瀏覽器擴充套件的“本地訊息主機”之後,Chrome瀏覽器會在獨立的程式中啟動該本地應用,並通過標準輸入/輸出流(stdin/stdout)進行訊息通訊。
Chrome瀏覽器擴充套件與客戶端的本地應用之間的雙向通訊採用訊息機制,該訊息以JSON格式,UTF-8編碼,帶32位(作業系統本地位元組序)的訊息長度作為字首。從本地應用傳送到Chrome瀏覽器擴充套件的訊息,最大尺寸是1M位元組。從Chrome瀏覽器擴充套件傳送到本地應用的訊息,最大尺寸是4G位元組。