Aly*_*hak 5 javascript macos google-chrome google-chrome-extension chrome-native-messaging
如何修复 Mac 版 Chrome 浏览器扩展中的“本机主机已退出”错误?Native Messaging上的文档在底部特别提到了这个错误,并提出了一个可能的原因,但它的陈述很笼统(“这很可能是从你的本地消息传递主机发起的”),目前还不清楚尝试做什么来解决这个。
终端中的日志输出(如果您从 Mac 终端启动 Chrome,您可以查看日志信息)让我相信本机主机应用程序的进程本身从未成功启动。我不断得到:
LaunchProcess: failed to execvp:
/Users/mycomputer1/Documents/myhost.app
Run Code Online (Sandbox Code Playgroud)
但是,将“本机主机已退出”打印到后台javascript页面的控制台的实际代码是:
function onDisconnected() {
console.log("Inside onDisconnected(): " + chrome.runtime.lastError.message);
port = null;
}
Run Code Online (Sandbox Code Playgroud)
onDisconnected() 侦听器实际上是作为调用 connectNative() 的结果而调用的,我根据文档在这里完成了该操作:
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
//var imgdata = JSON.stringify(request.imgdata);
//process it somehow here
port = chrome.runtime.connectNative("com.allinlearning.ailhost");
if (port)
{
console.log("connectNative() returned a non-null port");
}
});
Run Code Online (Sandbox Code Playgroud)
我知道 connectNative() 在某个级别上成功,因为它返回一个有效的端口。但是,connectNative() 继续尝试定位本机主机应用程序并尝试启动它。文档表明主机应用程序是罪魁祸首,以某种方式启动了 Chrome 和本机应用程序之间的“管道”中断,尽管我的主机应用程序根本没有实现与 stdout 或 stdin 的通信。此外,Chrome 日志消息(“LaunchProcess: failed to execvp:”)似乎表明我的 Mac 应用程序从未成功启动。
还有更多:我在网上找到的一些源代码(可能是过时的?源文件)准确地揭示了这个“本机主机已经退出”消息的来源,并且一项检查表明了为什么谷歌浏览器的代码正在关闭。在 HandleReadResult() 中,调用 Close() 提供非常 msg,然后关闭事物以响应 Posix read() 返回 0。但是在广阔的体育世界中,我做错了什么(或根本不做)在我的 Mac 应用程序中导致读取失败?我的 Mac 应用程序没有向标准输出写入任何内容,那么不写入任何内容是如何导致读取错误的?还是所有这些都误导了我,而 execvp 未能启动我的主机应用程序是更深层次的原因?如果是这样,为什么?这是一个简单的、准系统的 Mac 应用程序。
您的“myhost.app”不是二进制文件,而是一个目录(如u+w,go-w,a+rX
权限中的 X 所示)。
您有两个选择:
不要为命令行程序创建应用程序包,而是创建一个普通的命令行应用程序(Xcode 中的文件 > 新建 > 项目 > 命令行工具(教程))。
指定应用程序包中二进制文件的路径,而不是包本身的路径。您可以通过右键单击 .app 文件并选择“显示包内容”来列出应用程序包中的所有文件。或者从终端(控制台)运行以下命令以列出捆绑包中的所有文件:
find /Users/mycomputer1/Documents/myhost.app -type f
Run Code Online (Sandbox Code Playgroud)