簡體   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