Wykryj pierwsze uruchomienie / aktualizację rozszerzenia Chrome

98

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 wykonywać określone czynności? (np. otwórz stronę pomocy lub zaktualizuj ustawienia)

rack1
źródło
dlaczego nie wybrałeś tego? stackoverflow.com/a/14957674/4548520 It's
Right anwser

Odpowiedzi:

177

W nowszych wersjach Chrome (od Chrome 22) możesz korzystać z chrome.runtime.onInstalledwydarzenia, które jest znacznie czystsze.

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 + "!");
    }
});
Alvin Wong
źródło
2
Dziękuję Ci za to! Wszystko, co znalazłem w Internecie, to przechowywanie wersji rozszerzenia w localStorage, dopóki w końcu nie natknąłem się na tę odpowiedź, co było oczywiście wykonalnym rozwiązaniem, ale byłem tak zaskoczony, że Chrome nie ma do tego wbudowanego elementu! Tak się cieszę, że się nie
zawiodłem
2
Od 22 Chrome, wydanego we
wrześniu
1
chrome.runtime.onInstalled wykrywa, kiedy aplikacja lub rozszerzenie jest zainstalowane w tle. Jednak to, czego nie robi, to wykrycie pierwszego uruchomienia zdarzenia chrome.app.runtime.onLaunched ...
realkstrawn93
3
Używałem tego kodu przez jakiś czas i działało świetnie, dopóki moje rozszerzenie nie poprosiło o nowe pozwolenie na aktualizację (która zawiesza rozszerzenie, dopóki użytkownik nie zaakceptuje pozwolenia). Gdy zezwolenie zostało zaakceptowane, a rozszerzenie nie zostało zawieszone, zdarzenie onInstalled nigdy nie było wywoływane, a zatem skrypt aktualizacji nigdy nie był uruchamiany. Warto wspomnieć, że dla tych, którzy uruchamiają skrypty aktualizacji na Zainstalowany, może być konieczne nasłuchiwanie innego zdarzenia w sytuacjach, gdy poprosiłeś o nowe pozwolenie.
Elimn,
2
@Elimm wygląda na błąd Chrome'a, powinieneś zgłosić go w narzędziu do śledzenia błędów.
Alvin Wong,
72

Zaktualizowana odpowiedź odzwierciedlająca wersję 3 manifestu:

Chromium ma teraz zestaw interfejsów API chrome.runtime , które umożliwiają pobranie wersji rozszerzenia.

Aby uzyskać aktualną wersję:

chrome.runtime.getManifest().version

Aby nasłuchiwać, kiedy rozszerzenie zostało zainstalowane po raz pierwszy, kiedy zostało zaktualizowane do nowej wersji i kiedy Chromium zostało zaktualizowane do nowej wersji, możesz użyć onInstalledwydarzenia.

chrome.runtime.onInstalled.addListener((details) => {
   const currentVersion = chrome.runtime.getManifest().version
   const previousVersion = details.previousVersion
   const reason = details.reason

   console.log('Previous Version: ${previousVersion }')
   console.log('Current Version: ${currentVersion }')

   switch (reason) {
      case 'install':
         console.log('New User installed the extension.')
         break;
      case 'update':
         console.log('User has updated their extension.')
         break;
      case 'chrome_update':
      case 'shared_module_update':
      default:
         console.log('Other install events within the browser')
         break;
   }

})

To wszystko!


Stara odpowiedź, sprzed 2011 r

Jeśli chcesz sprawdzić, czy rozszerzenie zostało zainstalowane lub zaktualizowane, możesz 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;
  }
Mohamed Mansour
źródło
Jeśli uruchomię getVersion () w skrypcie zawartości w Gmailu, otrzymam numer wersji aplikacji Gmail. Powinienem zwrócić uwagę, że istnieje szereg problemów, które uniemożliwiają działanie tego typu skryptu: a) gdy instalujesz wtyczkę, która musi wstrzyknąć skrypt zawartości na stronę, a strona jest już załadowana, skrypt zawartości tak nie zostaną wprowadzone na stronę, strona musi zostać ponownie załadowana). b) pobranie numeru wersji wtyczki można zrobić ze skryptu działającego w tle, jednak skrypt działający w tle nie może uzyskać dostępu do lokalnego magazynu, tylko skrypt zawartości, który nie jest jeszcze załadowany ...
Victor S
3
ten post jest świetny ... powinieneś oznaczyć ten 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 zawartości, po prostu wywołaj bezpośrednio chrome.app.getDetails (). Version. Powodem, dla którego wcześniej korzystałem z getVersion, jest to, że we wczesnych dniach rozwoju rozszerzenia Chrome nie było obiektu chrome.app, więc musieliśmy XHR manifest. Możesz zrobić to wszystko w zamknięciu, aby zagwarantować, że zadzwonisz właściwą metodą. Zwykle zamykam wszystko w obiekcie klasy.
Mohamed Mansour
1
Świetnie, to zadziałało dla mnie. Zauważ, że w powyższym kodzie brakuje średnika, a słowo „undefined” nie powinno zawierać cudzysłowów.
mpoisot
@mpoisot Przykro mi to mówić, mylisz się co do „undefined”. (Wiem, że jestem bardzo spóźniony na to przyjęcie, ale może to być ważne dla innych, którzy się tutaj natkną, takich jak ja.) Nie próbuje sprawdzać prevVersion == 'undefined'... sprawdza typeof prevVersion == 'undefined'. Jest dużo bardziej niezawodne w użyciu typeofpodczas sprawdzania, czy zmienna jest niezdefiniowana ... zobacz tutaj, aby dowiedzieć się, dlaczego: stackoverflow.com/a/3550319/130691
JMTyler
20

Na szczęście są teraz związane z tym wydarzenia (od wersji Chrome 22 i 25 dla zdarzeń aktualizacji).

W przypadku zainstalowanego wydarzenia:

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

W przypadku zdarzenia OnUpdateAvailable:

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

Ważny fragment dotyczący OnUpdateAvailable z dokumentacji programisty mówi:

Uruchamiane, gdy aktualizacja jest dostępna, ale nie jest instalowana natychmiast, ponieważ aplikacja jest obecnie uruchomiona. Jeśli nic nie zrobisz, aktualizacja zostanie zainstalowana następnym razem, gdy strona w tle zostanie wyładowana, jeśli chcesz, aby została zainstalowana wcześniej, możesz jawnie wywołać chrome.runtime.reload ().

JVillella
źródło
9

Prosty. Gdy rozszerzenie jest uruchamiane po raz pierwszy, pole localStoragejest puste. Przy pierwszym uruchomieniu możesz napisać tam flagę, aby oznaczyć wszystkie kolejne uruchomienia jako nie-pierwsze.

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!');

EDYCJA: Aby sprawdzić, czy rozszerzenie zostało właśnie zaktualizowane, zapisz wersję zamiast prostej flagi przy pierwszym uruchomieniu, a gdy aktualna wersja rozszerzenia (pobierz ją XmlHttpRequestz manifestu) nie jest równa tej przechowywanej w localStorage, rozszerzenie ma został zaktualizowany.

Max Shawabkeh
źródło
Uważaj, aby nie robić tego w skrypcie treści. localStorage jest współdzielona z innym kodem i rozszerzeniami na stronie. Więc to nie zadziała w skrypcie zawartości.
huyz,
W przypadku aplikacji w pakietach jest to rzeczywiście ostateczne rozwiązanie do użytku na stronach w tle, ponieważ spakowana aplikacja znajduje localStoragesię w osobnym oknie i nie jest udostępniana innym kodom i rozszerzeniom na stronie, jak wspomniał @huyz. Jednak w przypadku rozszerzeń tak nie jest.
realkstrawn93
1
Wymaga to jednak pozwolenia na przechowywanie.
Pacerier,