如何检查是否安装了 Native Host?

How do I check if Native Host was installed?

我正在开发一个 Google Chrome 使用本地消息传递的扩展。
在一些测试中 (之前已经手动安装了本地主机) 我已经成功连接并执行了我需要的一切。一切顺利。

我需要安装后立即下载并发送消息给主机。

我可以在扩展时自动下载它已安装。

var downloadItem = function(){
  chrome.downloads.download({
      url: "http://example.net/downloads/host.exe"
    }, insertContentScripts);
}

chrome.runtime.onInstalled.addListener(downloadItem);

下载开始后,内容脚本会注入特定的选项卡。

var insertContentScripts = 
    chrome.windows.getAll({
        populate: true
    }, function (windows) {
        var i = 0, w = windows.length, currentWindow;
        for ( ; i < w; i++ ) {
            currentWindow = windows[i];
            var j = 0, t = currentWindow.tabs.length, currentTab;
            for ( ; j < t; j++ ) {
                currentTab = currentWindow.tabs[j];
                // load just on example.com pages
                if (currentTab.url.match(regex)) {
                    injectIntoTab(currentTab);
                }
            }
        }
    });
}

var injectIntoTab = function (tab) {
        // You could iterate through the content scripts here
        var scripts = chrome.manifest.content_scripts[0].js;
        var i = 0, s = scripts.length;
        for( ; i < s; i++ ) {
            console.debug("Inserting script '" + scripts[i] + "' to tab " + tab.url);
            chrome.tabs.executeScript(tab.id, {
                file: scripts[i]
            });
        }   
    }


如何查看主机何时安装,然后连接?

感谢@wOxxOm 我可以解决问题。

解决方案是在注入内容脚本时,页面向 background.js 脚本发送消息以尝试 定期 .
连接到本机应用程序,这样,每当它没有 returns 错误时,就意味着主机已安装。
最终脚本如下所示:

content.js

chrome.runtime.sendMessage({funcao: "testExtension"}, function(response) {
    console.log(response);
});

background.js

if (request.funcao == "testExtension"){
    var timerId = 0;
    timerId = setInterval(function () {
      message(timerId);
    }, 1000);
}  

消息(id)函数

function message(timerId){
  var success = false;
  chrome.runtime.sendNativeMessage('com.pany.app', {"funcao": "testExtension"},
        function(response) {    
          if (typeof chrome.runtime.lastError === "undefined" || chrome.runtime.lastError.message.indexOf("not found") === -1) {
            success = true;
          }
      });
  if(success){
    clearInterval(timerId);
  }
}