经过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机(native messaging host)”,Chrome浏览器扩展还能够与客户端本地应用之间收发消息。chrome
客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机”以后,Chrome浏览器会在独立的进程中启动该本地应用,并经过标准输入/输出流(stdin/stdout)进行消息通讯。json
1) 本地应用的配置文件的内容浏览器
本地应用要可以成为“本地消息主机”,必须有一个manifest.json配置文件(文件名任意),该文件是一个有效的JSON文件,示例以下。app
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 }
其中的属性含义及用法以下。函数
属性名post |
含义google |
name编码 |
标识名称。chrome-extension 只能由小写字母、数字、_和.组成;首尾不能是.且不能有. 连续出现spa |
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字节。