繁体   English   中英

如何修复Chrome浏览器扩展程序中的本机主机已退出错误-本机消息传递

[英]How to fix Native Host Has Exited error in Chrome browser extension — Native Messaging

如何修复Mac版Chrome浏览器扩展程序中的“本地主机已退出”错误? Native Messaging上的文档在底部特别提到了此错误,并提出了可能的原因,但是这种说法相当笼统(“这很可能是从您的本机消息传递主机发起的”),目前尚不清楚尝试解决什么问题这个。

Terminal中的日志记录输出(如果您从Mac Terminal启动Chrome,则可以查看日志记录信息)使我相信,本地主机应用程序本身的过程永远不会成功启动。 我不断得到:

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

但是,在后台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()在某种程度上成功了,它返回了一个有效的端口。 但是,connectNative()继续尝试查找本机主机应用程序并尝试启动它。 该文档表明,主机应用程序是罪魁祸首,尽管我的主机应用程序根本没有实现与stdout或stdin的通信,但它以某种方式引发了Chrome与本机应用程序之间的“管道”中断。 此外,Chrome日志消息(“ LaunchProcess:无法执行execvp:”)似乎表明我的Mac应用程序从未成功启动。

还有更多:我在网上找到的一些源代码(也许是已过时的日期? 源文件 )揭示了该“本机主机已退出”消息的确切来源,而一项检查则表明了为什么Google Chrome的代码会导致一切关闭。 在HandleReadResult()中,调用Close()来提供非常大的味精,然后响应Posix read()返回0来关闭内容。但是在广泛的体育世界中,我做错了(或根本没有做)在我的Mac应用程序中导致读取失败? 我的Mac应用程序未向stdout写入任何内容,那么什么都不写入会导致读取错误? 还是所有这些都误导了我,而execvp无法启动我的主机应用程序是更深层的原因? 如果是这样,为什么? 这是一个纯简陋的Mac应用程序。

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

您有两种选择:

  1. 请勿为您的命令行程序创建应用程序捆绑包,而不要为普通的命令行应用程序(Xcode中的File> New> Project> Command Line Tool( 教程 ))创建应用程序捆绑包。

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

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

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

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

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

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

抱歉,如果与该问题没有直接关系,但是希望此问题对搜索结果有所帮助,这对某些人有帮助。 我自己,在这个问题上挣扎了好几个小时。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM