搜索
查看: 2347|回复: 3

[web] 使用aardio编写Chrome本地应用扩展(Native Messaging)

[复制链接]

170

主题

2505

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13758
发表于 2018-1-2 14:02:21 | 显示全部楼层 |阅读模式
chrome.jpg
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, 下载次数: 154)
回复

使用道具 举报

34

主题

66

帖子

390

积分

新手入门

积分
390
发表于 2018-3-22 11:07:01 | 显示全部楼层
又多一种exe与chrome浏览器的双向通信互相控制的方式.看原理应该是和chrome库的远程调试协议差不多,应该都是基于ws协议进行的交互.
回复

使用道具 举报

8

主题

19

帖子

133

积分

一级会员

Rank: 2

积分
133
发表于 2018-3-22 16:34:59 | 显示全部楼层
还有重新打包你发的插件解包文件,安装成功后 ,你打包的可以正常连接,但是我打包的总是提示断开连接,希望能帮忙看看是什么原因造成的,一点都没改,就是用浏览器打包了一下
回复

使用道具 举报

2

主题

12

帖子

211

积分

二级会员

Rank: 3Rank: 3

积分
211
发表于 2018-3-24 22:57:22 | 显示全部楼层
重新打包就改变了消息主机的chrome扩展ID了 这个要对应起来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-7-17 21:54 , Processed in 0.078125 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表