chrome extension扩展程序可以与原生应用程序交换消息。支持该特性的原生应用程序必须注册一个了解如何与扩展程序通信的原生消息宿主,Chrome 浏览器将在单独的进程中启动宿主,并通过标准输入和标准输出流与之通信。在Chrome浏览器中,Native Messaging是唯一能让web page调用Native API的技术,这里记录要达到这个目的所要涉及到的知识。web page、extension和native messaging host三者之间用UTF-8编码的json字符串通讯。
为了注册一个原生消息通信宿主,应用程序必须安装一个清单文件,定义原生消息通信宿主的配置。如下是这一清单文件的例子:
{
"name": "com.my_company.my_application",
"description": "我的应用程序",
"path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
"type": "stdio",
"allowed_origins": [
"chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
]
}
消息通信宿主清单文件包含如下字段:
名称描述name
原生消息通信宿主的名称,客户端需要将该字符串传递给 runtime.connectNative 或 runtime.sendNativeMessage。description
应用程序的简短描述。path
原生消息通信宿主的二进制文件路径。在 Linux 和 OSX 上必须使用绝对路径,在 Windows 上可以使用相对于清单文件所在目录的路径。type
与原生消息通信宿主交流时所使用的接口类型。目前该参数只有一种可能的值:stdio
,它表示 Chrome 浏览器应该使用 stdin
(标准输入)和 stdout
(标准输出)与宿主通信。allowed_origins
允许访问原生消息通信宿主的扩展程序列表(可以是多个插件与宿主通信)。
清单文件的类型取决与平台:
Windows:
清单文件可以在文件系统中的任意位置,应用程序的安装程序必须创建如下注册表键 HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.my_company.my_application
,并将键的默认值设置为清单文件的完整路径。
OSX:
清单文件必须位于 /Library/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json
Linux:
清单文件必须位于 /etc/opt/chrome/native-messaging-hosts/com.my_company.my_application.json
Chrome 浏览器在单独的进程中启动每一个原生消息通信宿主,并使用标准输入(stdin
)与标准输出(stdout
)与之通信。向两个方向发送消息时使用相同的格式:每一条消息使用 JSON 序列化,以 UTF-8 编码,并在前面附加 32 位的消息长度(使用本机字节顺序)。
使用 runtime.connectNative 创建消息传递端口时,Chrome 浏览器会启动原生消息传递宿主进程,并让它一直运行,直到端口释放。如果消息是使用 runtime.sendNativeMessage 发送,没有创建消息传递端口,Chrome 浏览器会为每一条消息创建一个新的原生消息传递宿主进程。在这种情况下,宿主进程产生的第一条消息作为原始请求的响应处理,也就是说,Chrome 浏览器会将它传递给调用 runtime.sendNativeMessage 时指定的回调函数,而原生消息传递宿主产生的所有其他消息则会忽略。
连接到原生应用程序向原生应用程序发送和接收消息类似与跨扩展程序消息传递,主要的区别是用 runtime.connectNative 代替 runtime.connect,用 runtime.sendNativeMessage 代替 runtime.sendMessage。
以下例子创建一个 runtime.Port 对象,连接到原生消息通信宿主 com.my_company.my_application
,开始监听来自该端口的消息,并发送一条消息:
var port = chrome.runtime.connectNative('com.my_company.my_application');
port.onMessage.addListener(function(msg) {
console.log("收到 " + msg);
});
port.onDisconnect.addListener(function() {
console.log("已断开");
});
port.postMessage({ text: "我的应用程序,您好!" });
runtime.sendNativeMessage 可以用来向原生应用程序发送消息,而不用创建端口。例如:
chrome.runtime.sendNativeMessage('com.my_company.my_application',
{ text: "您好" },
function(response) {
console.log("收到 " + response);
});
chrome extension清单文件必须做如下授权:
"permissions": [
"nativeMessaging", "tabs", "http://*/*", "https://*/*"
],
创建一个名叫nativeMsgDemo的控制台程序
#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
void func()
{
string message="{\"text\": \"This is a response message\",\"num\": \"three\"}";
unsigned int len = message.length();
//先输出长度
cout >0) & 0xFF))
>8) & 0xFF))
>16) & 0xFF))
>24) & 0xFF));
//再输出内容并结束
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?