如何修复Chrome浏览器扩展中的Native Host Has Exited错误 - Native Messaging

时间:2015-01-05 17:59:22

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

如何修复"本机主机已退出"我的Chrome浏览器扩展程序中出现错误?这里的文档Native Messaging特别提到了底层的这个错误,并提出了一个可能的原因,但它的说法很普遍("这很可能是从您的本机消息主机发起的#34;) #39;不清楚该怎么做才能解决这个问题。

终端中的日志记录输出(如果您从Mac终端启动Chrome,您可以查看日志记录信息)让我相信本机主机应用程序本身的过程永远不会成功启动。我一直在说:

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

但是,打印" Native主机的实际代码已退出"到后台javascript页面的控制台是:

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()在某个级别成功bc它返回一个有效的端口。但是,connectNative()继续尝试找到本机主机应用程序并尝试启动它。文档建议主机应用程序是罪魁祸首,以某种方式启动了管道的破坏"在Chrome和本机应用之间,虽然我的主机应用程序根本没有实现与stdout或stdin的通信。此外,Chrome日志消息(" LaunchProcess:无法执行:")似乎表明我的Mac应用程序甚至从未成功启动过。

还有更多:我在网上找到的一些源代码(可能已过时了?source file)显示了这个" Native主机退出的确切位置" msg起源,并且检查表明为什么谷歌Chrome的代码正在关闭。在HandleReadResult()中,调用一个Close()来提供非常的消息,然后关闭一些东西以响应一个返回0的Posix read()但是在广泛的体育世界中我做错了什么(或者根本不做)在我的Mac应用程序中导致读取失败?我的Mac应用程序没有写任何东西到stdout,那么怎么不写 - 任何导致读取错误的东西?或者是所有这些误导我,并且execvp未能启动我的主机应用程序更深层次的原因?如果是这样,为什么?它是一款普通的,简单的Mac应用程序。

3 个答案:

答案 0 :(得分:1)

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

您有两种选择:

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

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

    find /Users/mycomputer1/Documents/myhost.app -type f
    

答案 1 :(得分:0)

您的本机应用程序和chrome通过控制台进行通信,该控制台在大多数情况下是隐藏的。如果您的应用将控制台用于与chrome通信(例如执行系统命令)以外的其他操作,则chrome会捕获该错误并将其解释为来自您的应用的错误响应,并关闭它们之间的连接。

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

  • 除了使用chrome进行通信外,请勿使用(相同)控制台运行其他任何操作
  • 缓冲您的控制台输出,而不是将其发送到stdout

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

很抱歉,如果与该问题没有直接关系,但我希望这对某些人有所帮助,因为该问题在搜索结果中的位置越来越高。我自己,在这个问题上挣扎了好几个小时。

答案 2 :(得分:0)

在Linux(RHEL 7.6)上发生了。

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

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

如果有任何错误,请在控制台中查找。

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

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)-现在它没有显示错误,并且运行良好。