Chrome本地应用扩展分为两个部分:
1、用本地语言编写的本地应用,即Native Messaging模式下的本地消息主机。
2、Chrome里的扩展程序,这个是用JS,HTML写的。
Native Messaging是用管道阻塞式的读写,这不太方便,
我用多线程封装了一下,一个读,一个写,接口做成了单线程异步回调的方式,
类似WebSocket那样的事件回调,非常方便。
首先看一下使用aardio实现的本地消息主机源代码:
import win.ui;
/*DSG{{*/
var winform = win.form(text="Chrome本地应用插件测试程序";right=759;bottom=469)
winform.add(
edit={cls="edit";left=24;top=15;right=726;bottom=428;edge=1;multiline=1;z=1}
)
/*}}*/
//创建本地应用消息主机
import web.nativeMessaging;
var host = web.nativeMessaging();
//如果不是在Native Messaging管道中启动host返回nul值
if( !host ){
//安装chrome本地应用
import web.nativeMessaging.install;
//aardio会自动生成配置文件,并在注册表中写入此应用让chrome扩展可以找到这个主机
var json = web.nativeMessaging.install(
//这是本地应用的名字,命名规则与代码中的变量命名规则基本一致,只能使用字母数字中间可以用圆点连接
name = "com.my_company.my_application";
//这个是描述,其实没什么用
description = "My Application";
//这是你允许他调用你的消息主机的chrome扩展ID,这个值是一个数组 可以有多个,
allowed_origins = {
"agnhjnpjidnjcppanhimaidodnbnhhbp";
}
//另外可以用path指定消息主机的路径,这里不用指定,自动注册为当前EXE文件
)
winform.edit.print("本地应用服务端已注册成功")
winform.edit.print(json);
}
else{
//在Native Messaging管道中启动,客户端已连交接触发此事件
host.onOpen = function(extension,parentWindow){
winform.edit.print("客户端已连接:",extension)
//不能使用 win.setParent()把chrome搞成父窗口,这样chrome会崩溃
win.setOwner(winform.hwnd,parentWindow);
}
//客户端关闭时触发此事件
host.onClose = function(){
winform.edit.print("客户端已断开,即将退出")
win.quitMessage();//必须及时退出
}
//客户端发了JSON对象过来,注意data是一个经过JSON解析得到的对象,不是JSON字符串
host.onMessage = function(data){
winform.edit.print("收到数据",data);
host.send("这是来自aardio的数据");
}
//遇到错误了
host.onError = function(err){
winform.edit.print(err);
}
//运行消息主机,这个函数只是启动监听线程,不会阻塞
host.run();
}
winform.show();
win.loopMessage();
关键代码实际上就是下面这几句: //创建本地应用消息主机
import web.nativeMessaging;
var host = web.nativeMessaging()
//在Native Messaging管道中启动,客户端已连交接触发此事件
host.onOpen = function(extension,parentWindow){
winform.edit.print("客户端已连接:",extension)
//不能使用 win.setParent()把chrome搞成父窗口,这样chrome会崩溃
win.setOwner(winform.hwnd,parentWindow);
}
//客户端关闭时触发此事件
host.onClose = function(){
winform.edit.print("客户端已断开,即将退出")
win.quitMessage();//必须及时退出
}
//客户端发了JSON对象过来,注意data是一个经过JSON解析得到的对象,不是JSON字符串
host.onMessage = function(data){
winform.edit.print("收到数据",data);
host.send("这是来自aardio的数据");
}
//遇到错误了
host.onError = function(err){
winform.edit.print(err);
}
//运行消息主机,这个函数只是启动监听线程,不会阻塞
host.run(); 至于Chrome扩展的写网上教程很多,这里就不多讲了。 比较重要的一点是在扩展的配置文件中要加上下面这句才能连接本地消息主机: "permissions":[
"nativeMessaging"
], 完整范例源码(包含一个简单的Chrome扩展源码例子)
nativeMessaging.7z
(39.79 KB, 下载次数: 1273)
注意在Chrome中打开chrome://extensions/,并启用开发者模式,调试扩展程序时必须联网,不然扩展运行不起来。
|