通过将浏览器所在客户端的本地应用注册为 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\
或
- HKEY_CURRENT_USER
- \SOFTWARE\Google\Chrome\NativeMessagingHosts\
设置默认值 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/.json |
/etc/chromium/native-messaging-hosts/.json |
Linux 用户应用 |
~/.config/google-chrome/NativeMessagingHosts/.json |
~/.config/chromium/NativeMessagingHosts/.json |
OS X 系统应用 |
/Library/Google/Chrome/NativeMessagingHosts/.json |
/Library/Application Support/Chromium/NativeMessagingHosts/.json |
OS X 用户应用 |
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/.json |
~/Library/Application Support/Chromium/NativeMessagingHosts/.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 字节。
来源: