6

如何修复我的 Mac 版 Chrome 浏览器扩展中的“本机主机已退出”错误?Native Messaging上的文档在底部特别提到了这个错误,并提出了一个可能的原因,但它的表述很笼统(“这很可能是从你的本地消息传递主机启动的”),并且不清楚要尝试做什么来解决这个。

终端中的日志输出(如果您从 Mac 终端启动 Chrome,则可以查看日志信息)使我相信本机主机应用程序的进程本身从未成功启动。我不断得到:

LaunchProcess: failed to execvp:
/Users/mycomputer1/Documents/myhost.app

但是,在后台 javascript 页面的控制台上打印“Native host has exited”的实际代码是:

function onDisconnected() {
  console.log("Inside onDisconnected(): " + chrome.runtime.lastError.message);
  port = null;
}

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");
    }
});

我知道 connectNative() 在某种程度上成功,因为它返回了一个有效的端口。但是,connectNative() 继续尝试定位本机主机应用程序并尝试启动它。文档表明主机应用程序是罪魁祸首,以某种方式启动了 Chrome 和本机应用程序之间的“管道”中断,尽管我的主机应用程序根本没有实现与 stdout 或 stdin 的通信。此外,Chrome 日志消息(“LaunchProcess: failed to execvp:”)似乎表明我的 Mac 应用程序甚至从未成功启动。

还有更多:我在网上找到的一些源代码(可能是过时的?源文件)揭示了这个“本机主机已退出”消息的确切来源,并且检查表明为什么 Google Chrome 的代码正在关闭。在 HandleReadResult() 中,调用 Close() 提供非常消息,然后关闭事物以响应 Posix read() 返回 0。但是在广泛的体育世界中,我做错了什么(或根本不做)在我的 Mac 应用程序中导致读取失败?我的 Mac 应用程序没有向标准输出写入任何内容,那么 not-writing-anything 是如何导致读取错误的?还是所有这些都在误导我,而 execvp 未能启动我的主机应用程序是更深层次的原因?如果是这样,为什么?这是一个简单的、准系统的 Mac 应用程序。

4

3 回答 3

2

在 Linux(RHEL 7.6)上发生在我身上。

要找到根本原因,您需要从控制台(命令行)运行 chrome,然后打开 gnome 扩展页面:

$ /opt/google/chrome/chrome "https://extensions.gnome.org"

然后查看控制台,是否有任何错误。

对我来说,由于缺少名为“gi”的python模块,这是“chrome-gnome-shell”错误:

Traceback (most recent call last):
Traceback (most recent call last):
  File "/usr/bin/chrome-gnome-shell", line 16, in <module>
    from gi.repository import GLib, Gio
ModuleNotFoundError: No module named 'gi'

要修复它,我必须安装PyGObject

$ sudo yum install python36-gobject.x86_64
# or directly with pip: pip3 install PyGObject

完成安装后,返回https://extensions.gnome.org(可能需要关闭并重新打开 Chrome) - 现在它没有显示错误,并且运行良好。

于 2019-07-04T08:47:06.363 回答
1

您的“myhost.app”不是二进制文件,而是一个目录(如您u+w,go-w,a+rX权限中的 X 所示)。

你有两个选择:

  1. 不要为你的命令行程序创建一个 App 包,而是一个普通的命令行应用程序(Xcode 中的文件 > 新建 > 项目 > 命令行工具(教程))。

  2. 指定应用程序包中二进制文件的路径,而不是包本身。您可以通过右键单击 .app 文件并选择“显示包内容”来列出应用程序包中的所有文件。或者从终端(控制台)运行以下命令以列出捆绑包中的所有文件:

    find /Users/mycomputer1/Documents/myhost.app -type f
    
于 2015-01-05T21:41:13.033 回答
1

您的本机应用程序和 chrome 通过控制台进行通信,在大多数情况下,控制台是隐藏的。如果您的应用程序使用控制台的目的不仅仅是与 chrome 通信(例如执行系统命令),那么 chrome 会捕捉到它并将其解释为来自您的应用程序的错误响应并关闭它们之间的连接。

因此,建议您使用以下解决方法之一:

  • 不要使用(相同的)控制台运行除了与 chrome 通信之外的任何东西
  • 缓冲您的控制台输出,而不是将其发送到标准输出

还要注意的另一件事是,在某些语言(例如 php)中,某些命令(例如 preg_match)似乎没有任何输出,因为它们根据参数操作数据,但它们确实返回结果(例如 true/false)和如果您不抑制该结果(@function() 在 php 中)或将其保存到变量中,则它会转到标准输出并导致 chrome 断开连接。

抱歉,如果与该问题不直接相关,但我希望这对某些人有所帮助,因为该问题会在搜索结果中显示。就我自己而言,我为这个问题苦苦挣扎了好几个小时。

于 2019-05-30T16:43:06.773 回答