2010-03-08 35 views
80

擴展如何才能發現它是第一次運行還是剛剛更新,以便擴展可以執行某些特定操作? (例如打開幫助頁面或更新設置)檢測Chrome擴展第一次運行/更新

+0

遷移到superuser.com – 2010-03-08 05:13:27

+25

不一定。我認爲這可能是一個編程問題,如果rack1正在編寫chrome擴展。 – 2010-03-08 05:20:53

+0

爲什麼你沒有選擇這個? http://stackoverflow.com/a/14957674/4548520它是正確的anwser - 第一次擴展安裝的正式活動 – user25 2016-08-04 20:21:08

回答

9

簡單。當擴展第一次運行時,localStorage是空的。在第一次運行時,您可以在那裏寫一個標記,將所有後續運行標記爲非第一次。

例,在background.htm:

var first_run = false; 
if (!localStorage['ran_before']) { 
    first_run = true; 
    localStorage['ran_before'] = '1'; 
} 

if (first_run) alert('This is the first run!'); 

編輯:要檢查是否延長剛剛更新,一個簡單的標誌的第一次運行,而不是存儲的版本,則在當前的擴展版本(通過XmlHttpRequest清單得到)不等於存儲在localStorage中的那個,擴展已更新。

+0

小心不要在內容腳本中這樣做。 localStorage與頁面上的其他代碼和擴展共享。所以這不適用於內容腳本。 – huyz 2011-07-20 01:52:08

+0

對於打包的應用程序,這確實是一個在後臺頁面中使用的明確解決方案,因爲打包應用程序的'localStorage'確實在其獨立的窗口中,並且不會像@huyz提到的那樣與頁面上的其他代碼和擴展共享。然而,對於擴展,情況並非如此。 – 2014-01-26 01:13:33

+0

**這需要存儲權限。** – Pacerier 2017-09-10 10:19:54

64

如果你想檢查是否延長已安裝或更新,你可以做這樣的事情:

function onInstall() { 
    console.log("Extension Installed"); 
    } 

    function onUpdate() { 
    console.log("Extension Updated"); 
    } 

    function getVersion() { 
    var details = chrome.app.getDetails(); 
    return details.version; 
    } 

    // Check if the version has changed. 
    var currVersion = getVersion(); 
    var prevVersion = localStorage['version'] 
    if (currVersion != prevVersion) { 
    // Check if we just installed this extension. 
    if (typeof prevVersion == 'undefined') { 
     onInstall(); 
    } else { 
     onUpdate(); 
    } 
    localStorage['version'] = currVersion; 
    } 
+0

如果我在Gmail中的內容腳本中運行getVersion(),則會獲取Gmail應用程序版本的編號。我應該指出有一些問題會阻止這種類型的腳本工作:a)當您安裝一個需要將內容腳本注入頁面並且該頁面已被加載的插件時,內容腳本會執行沒有被注入頁面,頁面必須重新加載)。b)獲取插件的版本號可以從後臺腳本中完成,但後臺腳本無法訪問localStorage,只有內容腳本可以,尚未加載... – 2011-12-18 03:59:15

+3

這篇文章很棒...你應該把這個標記爲答案。感謝穆罕默德! – frenetix 2012-02-02 14:36:04

+3

@VictorS上述內容旨在用於背景頁面中,如果您計劃在內容腳本中使用此內容,則只需直接調用chrome.app.getDetails()。版本。之前我之前獲得版本的原因是因爲在Chrome擴展開發的早期階段,沒有chrome.app對象,所以我們不得不使用XHR清單。你可以在封閉的情況下做所有這些,這樣你就可以保證你調用正確的方法。我通常將所有內容封裝在類對象中。 – 2012-02-02 23:13:33

139

在Chrome中的新版本(因爲Chrome的22),則可以使用chrome.runtime.onInstalled事件,這更清潔。

例子:

// Check whether new version is installed 
chrome.runtime.onInstalled.addListener(function(details){ 
    if(details.reason == "install"){ 
     console.log("This is a first install!"); 
    }else if(details.reason == "update"){ 
     var thisVersion = chrome.runtime.getManifest().version; 
     console.log("Updated from " + details.previousVersion + " to " + thisVersion + "!"); 
    } 
}); 
+2

謝謝你!我在互聯網上發現的所有內容都是將擴展的版本存儲在localStorage中,直到我最終偶然發現了這個答案,這當然是一個可行的解決方案,但我很驚訝,因爲Chrome並沒有內置任何東西!我很高興我沒有失望:) – JMTyler 2013-09-11 00:38:37

+2

自2012年9月發佈Chrome 22以來 – Redzarf 2013-12-12 11:44:19

+1

chrome.runtime.onInstalled檢測應用程序或擴展程序在後檯安裝的時間。然而,它沒有做的事情是檢測到chrome.app.runtime.onLaunched事件的第一次觸發... – 2014-01-26 01:16:52

14

幸運的是,現在有events這個(因爲Chrome瀏覽器版本22和25的更新事件)。

對於已安裝的事件:

chrome.runtime.onInstalled.addListener(function() {...}); 

對於OnUpdateAvailable事件:

chrome.runtime.onUpdateAvailable.addListener(function() {...}); 

從開發文檔約OnUpdateAvailable一個重要摘錄說:

時更新被觸發可用,但不會立即安裝,因爲該應用程序當前正在運行。如果您什麼都不做,則會在下次卸載後臺頁面時安裝更新,如果您希望更快安裝該更新,則可以顯式調用chrome.runtime.reload()。