如何在不带参数的情况下调用Chrome本机消息主机?

时间:2016-09-25 04:21:32

标签: google-chrome google-chrome-extension chrome-native-messaging

我正在使用Chrome的native messaging API连接到我正在Go中使用Cobra library开发的本机主机。本机应用程序有一个独立的CLI(用Cobra实现),而裸命令(没有任何参数)开始通过stdin监听JSON,这意味着它是Chrome与之交互的API。

但是,每次扩展程序向本机消息传递主机发出请求时,它都会失败(客户端只是立即断开与进程的连接)。当我使用--enable-logging标志启动Chrome时,我可以看到本机主机错误unknown command "chrome-extension://cnjopnegooahjdngnkhiokognkdjiioc/" for "--native-app-name--"。这是Cobra的错误消息,意思是“chrome-extension:// cnjopnegooahjdngnkhiokognkdjiioc /”被用作参数,这似乎意味着Chrome正在使用app-name chrome-extension://cnjopnegooahjdngnkhiokognkdjiioc/而不是app-name来调用本机主机。

这是我在扩展中使用的代码,用于调用本机主机:

var port = chrome.runtime.connectNative('app-name');
port.onMessage.addListener(function(msg) {
  console.log(msg);
});
port.onDisconnect.addListener(function() {
  console.log("disconnected");
});
port.postMessage({cmd:"ping"});

我找不到任何暗示Chrome会将扩展程序地址作为参数发送的文档,或者是否可以阻止它。

1 个答案:

答案 0 :(得分:3)

它是protocol的一部分,无法停用。 Windows上的命令行是这样的:

C:\Windows\system32\cmd.exe /c YOURHOSTAPP.exe chrome-extension://.................../  
--parent-window=6752474 < \\.\pipe\chrome.nativeMessaging.in.e11ed8be274e1a85 
> \\.\pipe\chrome.nativeMessaging.out.e11ed8be274e1a85
  

本机消息传递主机的第一个参数是调用者的来源,通常是fscanf。这允许本机消息传递主机在本机消息传递主机清单中的allowed_origins密钥中指定多个扩展时标识消息的来源。

  

在Windows上,本机消息传递主机还会传递一个命令行参数,其中包含调用chrome本机窗口的句柄:chrome-extension://[ID of whitelisted extension]。这使本机消息传递主机可以创建正确聚焦的本机UI窗口。

  

警告:在Windows中,in Chrome 54 and earlier,原点作为第二个参数而不是第一个参数传递。