2010-03-08 15 views
80

W jaki sposób rozszerzenie może dowiedzieć się, że jest uruchamiane po raz pierwszy lub właśnie zostało zaktualizowane, aby rozszerzenie mogło wykonać określone czynności? (np. otwórz stronę pomocy lub ustawienia aktualizacji)Wykryj rozszerzenie Chrome najpierw uruchom/aktualizuj

+0

migracja do superuser.com –

+25

niekoniecznie. Myślę, że może to być pytanie programistyczne, jeśli rack1 pisze rozszerzenia chrome. –

+0

dlaczego nie wybrałeś tego? http://stackoverflow.com/a/14957674/4548520 to jest prawo anwser - oficjalne wydarzenie dla pierwszej instalacji rozszerzenia – user25

Odpowiedz

9

Prosty. Po pierwszym uruchomieniu rozszerzenie localStorage jest puste. Przy pierwszym uruchomieniu można zapisać tam flagę, aby oznaczyć wszystkie kolejne przebiegi jako niebędące pierwszymi.

przykład w 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!'); 

EDIT: Aby sprawdzić, czy rozszerzenie właśnie został zaktualizowany, przechowywanie wersji zamiast prostego flagę na pierwszym biegu, a następnie, gdy obecna wersja rozszerzenie (pobierz go przez XmlHttpRequest w manifeście) nie jest równe temu zapisanemu w localStorage, rozszerzenie zostało zaktualizowane.

+0

Uważaj, aby tego nie robić w skrypcie treści. localStorage jest współdzielony z innym kodem i rozszerzeniami na stronie. To nie działałoby w skrypcie treści. – huyz

+0

Dla aplikacji pakowanych, jest to rzeczywiście zdecydowane rozwiązanie do użytku na stronach w tle, ponieważ "localStorage" aplikacji pakowanej jest rzeczywiście w osobnym oknie i nie jest udostępniane innym kodom i rozszerzeniom na stronie, o której wspomniała @huyz. W przypadku rozszerzeń tak jednak nie jest. –

+0

** To wymaga jednak pozwolenia na przechowywanie. ** – Pacerier

64

Jeśli chcesz sprawdzić, czy rozszerzenie zostało zainstalowane lub zaktualizowane, można zrobić coś takiego:

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

Jeśli uruchomię getVersion() w skrypcie treści w Gmailu, otrzymam numer wersji aplikacji Gmail. Powinienem wskazać, że istnieje wiele problemów, które uniemożliwią działanie tego typu skryptów: a) podczas instalowania wtyczki, która wymaga wstrzyknięcia skryptu treści na stronę, a strona jest już załadowana, skrypt nie zostanie wprowadzony do strony, strona musi zostać ponownie załadowana).b) uzyskanie numeru wersji wtyczki można wykonać ze skryptu w tle, jednak skrypt w tle nie może uzyskać dostępu do localStorage, tylko skrypt zawartości może, który nie jest jeszcze załadowany ... –

+3

ten wpis jest świetny ... powinieneś oznaczyć to jako odpowiedź. Dzięki Mohamed! – frenetix

+3

@VictorS powyższe jest przeznaczone do użycia na stronie w tle, jeśli planujesz użyć tego w skrypcie treści, po prostu wywołaj bezpośrednio chrome.app.getDetails(). Powodem, dla którego zrobiłem getVersion wcześniej, jest fakt, że w początkach rozwoju rozszerzenia Chrome nie było obiektu chrome.app, więc musieliśmy XHR manifestować. Możesz zrobić to wszystko w zamknięciu, dzięki czemu możesz zagwarantować, że zadzwonisz właściwą metodą. Zwykle otaczam wszystko w obiekcie klasy. –

139

w nowszych wersjach Chrome (od Chrome 22), można użyć zdarzenia chrome.runtime.onInstalled, który jest znacznie czystszy.

Przykład:

// 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

Dziękuję za to! Wszystko, co udało mi się znaleźć w Internecie, to przechowywanie wersji rozszerzenia w localStorage, aż w końcu natknąłem się na tę odpowiedź, co było oczywiście praktycznym rozwiązaniem, ale byłem tak zaskoczony, że chrom nie ma w tym nic wbudowanego! Tak się cieszę, że nie zawiodłem się :) – JMTyler

+2

Od Chrome 22, wydany we wrześniu 2012 r. – Redzarf

+1

chrome.runtime.onInstalled wykrywa, kiedy aplikacja lub rozszerzenie jest zainstalowane w tle. To, czego nie robi, to jednak wykrycie pierwszego uruchomienia zdarzenia chrome.app.runtime.onLaunched ... –

14

szczęście są teraz events za to (od Chrome w wersji 22 i 25 dla zdarzeń update).

Dla zainstalowanej imprezy:

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

dla OnUpdateAvailable imprezy:

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

Ważnym fragmentem o OnUpdateAvailable z docs deweloperskich mówi:

strzały gdy jest aktualizacja dostępne, ale nie jest instalowane natychmiast, ponieważ aplikacja jest aktualnie uruchomiona. Jeśli nic nie zrobisz, aktualizacja zostanie zainstalowana następnym razem, gdy strona w tle zostanie rozładowana, jeśli chcesz, aby była zainstalowana wcześniej, możesz jawnie wywołać chrome.runtime.reload().

Powiązane problemy