zoukankan      html  css  js  c++  java
  • 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_MACHINESOFTWAREGoogleChromeNativeMessagingHostscom.my_company.my_application

    HKEY_CURRENT_USERSOFTWAREGoogleChromeNativeMessagingHostscom.my_company.my_application

    设置默认值Default为配置文件所在的绝对路径:

    C:path	o
    mh-manifest.json

    也可以直接创建注册表文件.reg如下,安装时执行即可:

    1 Windows Registry Editor Version 5.00
    2 [HKEY_CURRENT_USERSoftwareGoogleChromeNativeMessagingHostscom.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字节。

  • 相关阅读:
    eletron打包
    助力ASP.NET Core 2.1开发!Layx 企业级弹窗插件发布!
    springcloud 入门 3 (服务之间的调用)
    springcloud 入门 2 (Enreka的服务和注册)
    springcloud 入门 1 (浅谈版本关系)
    springboot 学习之路 18(webflux详细介绍(2))
    springboot 学习之路 17(webflux 入门 (1))
    springboot 学习之路 15(集成shiro)
    Mongodb的入门(6)副本集
    Mongodb的入门(4)mongodb3.6的索引
  • 原文地址:https://www.cnblogs.com/champagne/p/4861209.html
Copyright © 2011-2022 走看看