Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging

通过将浏览器所在客户端的本地应用注册为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字节。

时间: 2024-08-06 03:43:33

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging的相关文章

Chrome浏览器扩展开发系列之十四:本地消息机制Native messagin

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 2016-11-24 09:36 114人阅读 评论(0) 收藏 举报  分类: PPAPI(27)  通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机(native messaging host)",Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机"之后,Chrome浏览器会在独立的

Chrome浏览器扩展开发系列之十四

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59      阅读:1361      评论:0      收藏:0      [点我收藏+] 通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机(native messaging host)",Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机"

Chrome浏览器扩展开发系列之十九:扩展开发示例

翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深股票价格变化实时追踪提醒”软件能够实时获取用户指定的股票的价格等参数,并根据用户设置的价格区间进行越界提醒.该软件目前只实现了两部分,一个是options页面,用以配置用户要监听的股票及股票的价格区间.另一个是browser action类型的popup页面,供用户查看股票当前价格,并通过图标的Ba

Chrome浏览器扩展开发系列之十八:扩展的软件国际化chrome.i18n API

i18n是internationalization 的简写,这里将讨论软件国际化的问题.熟悉软件国际化的朋友应该知道,软件国际化要求,页面中所有用户可见的字符串都必须置于资源属性文件中.资源属性文件中的资源是形如“key=value”的键值对,一行一个.其中key为资源的标识符,用于HTML页面中,根据当前页面的Locale确定要使用的资源.value是资源的值,不同的Locale对应的资源值不同,在资源文件中统一用Unicode编码. 通过chrome.i18n API和相关的资源配置文件,可

Chrome浏览器扩展开发系列之十二:Content Scripts

Content Scripts是运行在Web页面的上下文的JavaScript文件.通过标准的DOM,Content Scripts 可以操作(读取并修改)浏览器当前访问的Web页面的内容. Content Scripts通常用于如下场景: 找到Web页面中的无效链接并修复 增大字体以突出显示 查找并处理DOM中的microformat Content Scripts的使用限制条件: 不能访问如下chrome.* API chrome.extension API chrome.i18n API

Chrome浏览器扩展开发系列之十:桌面通知Notification

Desktop Notification也称为Web Notification,是在Web页面之外,以弹出桌面对话框的形式通知用户发生了某事件.Web Notification于2015.9.10成为W3C推荐标准,网址https://www.w3.org/TR/notifications/.每个通知对话框都包括title, direction, language和origin.通知对话框还可以有body, tag, icon URL和icon image. 通知必须获得用户的授权才能够显示,从

Chrome浏览器扩展开发系列之八:Chrome扩展的数据存储

Google Chrome浏览器扩展可以使用如下任何一种存储机制: HTML5的localStorage API实现的本地存储(此处略) Google的chrome.storage.* API实现的浏览器存储 Google的chrome.cookies.* API实现的cookie存储 1) chrome.storage API实现的浏览器存储 Chrome浏览器扩展通过chrome.storage.* API,可以存取数据或监听数据的变化. 在manifest.json文件中注册storage

Chrome浏览器扩展开发系列之十七:扩展中可用的chrome.events API

chrome.events中定义了一些常见的事件类型,可以供Chrome浏览器扩展程序发出对应的事件对象. 对于关注的事件,首先要通过addListener()在对应的事件上注册监听器,示例如下: 1 chrome.alarms.onAlarm.addListener(function(alarm) { 2 appendToLog('alarms.onAlarm --' 3 + ' name: ' + alarm.name 4 + ' scheduledTime: ' + alarm.sched

Chrome浏览器扩展开发系列之九:Chrome浏览器的chrome.alarms.* API

Chrome浏览器扩展程序通过chrome.alarms.* API,可以制定计划周期性地执行代码,或在指定时间执行代码. 要使用chrome.alarms.* API,首先需要在manifest.json文件中声明alarms授权如下: { "permissions": [ "alarms" ], } chrome.alarms.Alarm对象的属性如下: 属性名 类型 必选/可选 注释 name string 必选 alarm的名字 scheduledTime