您当前的位置: 首页 >  chrome

顺其自然~

暂无认证

  • 1浏览

    0关注

    1317博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ChromeNativeMessaging 原生消息通信

顺其自然~ 发布时间:2020-11-13 14:58:17 ,浏览量:1

原生消息通信

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             
关注
打赏
1662339380
查看更多评论
0.0429s