0

我正在開發使用原生消息傳送的Google Chrome擴展程序。
在一些測試(與本機主機已經手動安裝之前)我已經成功地連接並執行我需要的一切。一切都很好。

我需要在安裝後立即下載消息併發送給主機。

我可以在安裝擴展程序時自動下載它。如何檢查Native Host是否已安裝?

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


如何檢查安裝在主機的時候,然後用它連接?

+0

只需嘗試定期連接:當應用程序未安裝時,它會返回錯誤或未定義。 – wOxxOm

+0

@wOxxOm我實際上已經用'while(true)'試過了,但它崩潰了chrome =/ –

+2

'while(true)'永遠不是解決方案。 「定期」是指setInterval或setTimeout。 – wOxxOm

回答

0

感謝@ wOxxOm我可以解決這個問題。

解決方案是當內容腳本被注入時,頁面將消息發送到background.js腳本以嘗試連接到本地應用程序定期
這樣,只要它不返回錯誤,就表示主機已安裝。
最終的腳本是這樣的:

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); 
    } 
} 
相關問題