Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何修复Chrome浏览器扩展中的本机主机已退出错误--本机消息传递_Javascript_Macos_Google Chrome_Google Chrome Extension_Chrome Native Messaging - Fatal编程技术网

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

Javascript 如何修复Chrome浏览器扩展中的本机主机已退出错误--本机消息传递,javascript,macos,google-chrome,google-chrome-extension,chrome-native-messaging,Javascript,Macos,Google Chrome,Google Chrome Extension,Chrome Native Messaging,如何修复Mac版Chrome浏览器扩展中的“本机主机已退出”错误?这里的文档在底部特别提到了这个错误,并提出了一个可能的原因,但这是非常笼统的陈述(“这很可能是从您的本机消息主机发起的”),不清楚如何尝试解决这个问题 终端中的日志输出(如果您从Mac终端启动Chrome,您可以查看日志信息)让我相信,本机主机应用程序本身的进程从未成功启动。我不断得到: LaunchProcess: failed to execvp: /Users/mycomputer1/Documents/myhost.app

如何修复Mac版Chrome浏览器扩展中的“本机主机已退出”错误?这里的文档在底部特别提到了这个错误,并提出了一个可能的原因,但这是非常笼统的陈述(“这很可能是从您的本机消息主机发起的”),不清楚如何尝试解决这个问题

终端中的日志输出(如果您从Mac终端启动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()继续尝试定位本机主机应用程序并尝试启动它。文档表明,主机应用程序是罪魁祸首,不知何故导致Chrome和本机应用程序之间的“管道”破裂,尽管我的主机应用程序根本没有实现与stdout或stdin的通信。此外,Chrome日志消息(“LaunchProcess:failed to execvp:”)似乎表明我的Mac应用程序从未成功启动

还有更多:我在网上找到的一些源代码(可能是过时的?)准确地揭示了这个“本机主机已退出”消息的来源,一项调查表明,谷歌Chrome的代码为什么会关闭。在HandleReadResult()中,调用Close()提供消息,然后关闭内容以响应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
    

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

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

    • 除了与chrome的通信,不要使用(同一)控制台运行任何东西
    • 缓冲控制台输出,而不是将其发送到标准输出
    还有一点需要注意的是,在某些语言(例如php)中,一些命令(例如preg_match)似乎没有任何输出,因为它们根据参数操作数据,但它们确实返回一个结果(例如true/false),如果您不抑制该结果(@function(),在php中)或者将其保存到一个变量,然后转到标准输出并导致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'
    

    安装完成后,返回(可能需要关闭并重新打开Chrome)-现在它没有显示任何错误,并且工作正常。

    您的二进制文件是否具有运行的正确权限?即,由您和可执行位集所有(
    chmod u+x myhost.app
    )。如果只是从命令行运行程序,会发生什么?(是的,您的链接已过期。SVN repo不再更新,请查看git repo:)根据Xcode,“安装权限”为u+w、go-w、a+rX。备选权限相同。顺便说一句,我如何确认它是属于我的?是的,我用一个简单的opencmd从终端成功地启动了这个应用程序。你有任何Xcode创建的应用程序可以工作吗?如果是这样的话,也许你可以把它寄给我,我可以试试。我用了选项2,效果很好。要为其他可能需要详细信息的人指定,我只需修改清单的路径部分,使其指向捆绑包中的二进制文件,如:“../myhost.app/Contents/MacOS/myhost”
    $ sudo yum install python36-gobject.x86_64
    # or directly with pip: pip3 install PyGObject