Erkennen Sie die erste Ausführung / Aktualisierung der Chrome-Erweiterung

96

Wie kann eine Erweiterung feststellen, dass sie zum ersten Mal ausgeführt wird oder gerade aktualisiert wurde, damit die Erweiterung bestimmte Aktionen ausführen kann? (zB eine Hilfeseite öffnen oder Einstellungen aktualisieren)

Rack1
quelle
warum hast du diesen nicht gewählt? stackoverflow.com/a/14957674/4548520 es ist richtig, antwortet - offizielles Ereignis für die Installation der ersten Erweiterung
user25

Antworten:

173

In neueren Versionen von Chrome (seit Chrome 22) können Sie das chrome.runtime.onInstalledEreignis verwenden, das viel sauberer ist.

Beispiel:

// 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
quelle
2
Danke dafür! Alles, was ich im Internet gefunden habe, ist, die Version der Erweiterung in localStorage zu speichern, bis ich schließlich auf diese Antwort stieß, die natürlich eine praktikable Lösung war, aber ich war so überrascht, dass in Chrome nichts eingebaut war! Ich bin so froh, dass ich nicht enttäuscht worden bin :)
JMTyler
2
Seit Chrome 22, veröffentlicht im September 2012
Redzarf
1
chrome.runtime.onInstalled erkennt, wenn die App oder Erweiterung im Hintergrund installiert ist. Was es jedoch nicht tut, ist ein erstes Auslösen des Ereignisses chrome.app.runtime.onLaunched zu erkennen ...
realkstrawn93
3
Ich habe diesen Code eine Weile verwendet und er hat hervorragend funktioniert, bis meine Erweiterung eine neue Berechtigung für ein Update angefordert hat (wodurch die Erweiterung ausgesetzt wird, bis der Benutzer die Berechtigung akzeptiert). Wenn die Berechtigung akzeptiert und die Erweiterung nicht aufgehoben wurde, wurde das Ereignis onInstalled nie ausgelöst und daher wurde das Aktualisierungsskript nie ausgeführt. Erwähnenswert für diejenigen, die Update-Skripte auf Installiert ausführen, müssen Sie möglicherweise in Situationen, in denen Sie eine neue Berechtigung angefordert haben, auf ein anderes Ereignis warten.
Elimn
2
@Elimm scheint der Fehler von Chrome zu sein, Sie sollten über den Bug-Tracker berichten.
Alvin Wong
72

Aktualisierte Antwort entsprechend Version 3 des Manifests:

Chromium verfügt jetzt über eine Reihe von APIs für chrome.runtime , mit denen Sie die Version der Erweiterung abrufen können .

So erhalten Sie die aktuelle Version:

chrome.runtime.getManifest().version

Um zuzuhören, wann die Erweiterung zum ersten Mal installiert wurde, wann die Erweiterung auf eine neue Version aktualisiert wurde und wann Chromium auf eine neue Version aktualisiert wurde, können Sie das onInstalledEreignis verwenden.

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

})

Das ist alles!


Alte Antwort vor 2011

Wenn Sie überprüfen möchten, ob die Erweiterung installiert oder aktualisiert wurde, können Sie Folgendes tun:

  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
quelle
Wenn ich getVersion () in einem Inhaltsskript in Google Mail ausführe, erhalte ich die Versionsnummer der Google Mail-App. Ich möchte darauf hinweisen, dass es eine Reihe von Problemen gibt, die verhindern, dass diese Art von Skript funktioniert: a) Wenn Sie ein Plugin installieren, das ein Inhaltsskript in eine Seite einfügen muss und die Seite bereits geladen ist, funktioniert das Inhaltsskript nicht in die Seite injiziert werden, muss die Seite neu geladen werden). b) Das Abrufen der Versionsnummer des Plugins kann über das Hintergrundskript erfolgen, das Hintergrundskript kann jedoch nicht auf den localStorage zugreifen, sondern nur das Inhaltsskript, das noch nicht geladen ist ...
Victor S
3
Dieser Beitrag ist großartig ... Sie sollten diesen als Antwort markieren. Danke Mohamed!
Frenetix
3
@VictorS Das oben Genannte soll auf der Hintergrundseite verwendet werden. Wenn Sie dies in einem Inhaltsskript verwenden möchten, rufen Sie einfach die Version chrome.app.getDetails (). Direkt auf. Der Grund, warum ich GetVersion zuvor erhalten habe, ist, dass es in den frühen Tagen der Chrome Extension-Entwicklung kein chrome.app-Objekt gab, sodass wir das Manifest XHR mussten. Sie können dies alles in einem Abschluss tun, um sicherzustellen, dass Sie die richtige Methode aufrufen. Normalerweise kapsle ich alles in ein Klassenobjekt.
Mohamed Mansour
1
Großartig, das hat bei mir funktioniert. Beachten Sie, dass dem obigen Code ein Semikolon fehlt und "undefiniert" keine Anführungszeichen enthalten sollte.
Mpoisot
@mpoisot Tut mir leid zu sagen, dass Sie sich in Bezug auf "undefiniert" irren. (Ich weiß, dass ich sehr spät zu dieser Party komme, aber dies kann für andere wichtig sein, die hier stolpern, wie ich selbst.) Er versucht nicht zu überprüfen prevVersion == 'undefined'... er überprüft typeof prevVersion == 'undefined'. Es ist viel robuster zu verwenden, typeofwenn überprüft wird, ob eine Variable undefiniert ist ... siehe hier, um zu erfahren, warum: stackoverflow.com/a/3550319/130691
JMTyler
20

Glücklicherweise gibt es jetzt Ereignisse dafür (seit Chrome Version 22 und 25 für Aktualisierungsereignisse).

Für ein installiertes Ereignis:

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

Für ein OnUpdateAvailable-Ereignis:

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

Ein wichtiger Auszug über OnUpdateAvailable aus den Entwicklerdokumenten lautet:

Wird ausgelöst, wenn ein Update verfügbar ist, wird jedoch nicht sofort installiert, da die App derzeit ausgeführt wird. Wenn Sie nichts tun, wird das Update beim nächsten Entladen der Hintergrundseite installiert. Wenn Sie möchten, dass es früher installiert wird, können Sie chrome.runtime.reload () explizit aufrufen.

JVillella
quelle
9

Einfach. Wenn die Erweiterung zum ersten Mal ausgeführt wird, localStorageist sie leer. Beim ersten Lauf können Sie dort ein Flag schreiben, um alle nachfolgenden Läufe als nicht zuerst zu markieren.

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

BEARBEITEN: Um zu überprüfen, ob die Erweiterung gerade aktualisiert wurde, speichern Sie die Version beim ersten Ausführen anstelle eines einfachen Flags. Wenn die aktuelle Erweiterungsversion (erhalten Sie sie über XmlHttpRequestdas Manifest) nicht der gespeicherten Version entspricht localStorage, hat die Erweiterung wurde aktualisiert.

Max Shawabkeh
quelle
Achten Sie darauf, dies nicht in einem Inhaltsskript zu tun. localStorage wird mit anderen Codes und Erweiterungen auf der Seite geteilt. In einem Inhaltsskript würde dies also nicht funktionieren.
Huyz
Für gepackte Apps ist dies in der Tat eine eindeutige Lösung für die Verwendung auf Hintergrundseiten, da sich gepackte Apps in der localStorageTat in einem eigenen separaten Fenster befinden und nicht mit anderen Codes und Erweiterungen auf der Seite geteilt werden, wie @huyz erwähnt. Bei Erweiterungen ist dies jedoch nicht der Fall.
Realkstrawn93
1
Dies erfordert jedoch eine Speichererlaubnis.
Pacerier