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

时间:2017-04-05 12:12:40

标签: google-chrome google-chrome-extension native messaging host

我正在开发使用Native Messaging的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]
            });
        }   
    }


如何检查主机的安装时间,然后再与之连接?

1 个答案:

答案 0 :(得分:0)

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

解决方案是在注入内容脚本时,页面会向background.js脚本发送消息以尝试连接到本地应用定期
这样,无论什么时候都没有t返回错误,表示已安装主机。
最终的脚本如下:

<强> 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);
  }
}