我正在使用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会将扩展程序地址作为参数发送的文档,或者是否可以阻止它。
答案 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,,原点作为第二个参数而不是第一个参数传递。