Rileva l'estensione di Chrome prima esecuzione / aggiornamento


96

Come può un'estensione scoprire che è in esecuzione per la prima volta o è stata appena aggiornata, in modo che l'estensione possa eseguire alcune azioni specifiche? (es. apri una pagina della guida o aggiorna le impostazioni)


perché non hai scelto questo? stackoverflow.com/a/14957674/4548520 è anwser giusto - evento ufficiale per la prima estensione installare
user25

Risposte:


174

Nelle versioni più recenti di Chrome (a partire da Chrome 22), puoi utilizzare l' chrome.runtime.onInstalledevento, che è molto più pulito.

Esempio:

// 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
Grazie per questo! Tutto quello che ho trovato su Internet è archiviare la versione dell'estensione in localStorage fino a quando non sono incappato in questa risposta, che era ovviamente una soluzione praticabile, ma sono rimasto così sorpreso che Chrome non avesse qualcosa integrato per questo! Sono così felice di non essere stato deluso :)
JMTyler

2
Da Chrome 22, rilasciato a settembre 2012
Redzarf

1
chrome.runtime.onInstalled rileva quando l'app o l'estensione è installata in background. Ciò che non fa, tuttavia, è rilevare una prima accensione dell'evento chrome.app.runtime.onLaunched ...
realkstrawn93

3
Ho usato questo codice per un po 'e ha funzionato alla grande, fino a quando la mia estensione non ha richiesto una nuova autorizzazione su un aggiornamento (che sospende l'estensione fino a quando l'utente non accetta l'autorizzazione). Quando l'autorizzazione è stata accettata e l'estensione non è stata sospesa, l'evento onInstalled non è mai stato attivato e quindi lo script di aggiornamento non è mai stato eseguito. Vale la pena menzionare per coloro che eseguono script di aggiornamento su Installed, potrebbe essere necessario ascoltare un evento diverso in situazioni in cui è stata richiesta una nuova autorizzazione.
Elimn

2
@Elimm sembra un bug di Chrome, dovresti segnalare il bug tracker.
Alvin Wong

72

Risposta aggiornata per riflettere la v3 di manifest:

Chromium ora dispone di un set di API chrome.runtime , che ti consentono di recuperare la versione dell'estensione.

Per ottenere la versione corrente:

chrome.runtime.getManifest().version

Per ascoltare quando l'estensione è stata installata per la prima volta, quando l'estensione viene aggiornata a una nuova versione e quando Chromium viene aggiornato a una nuova versione, puoi utilizzare l' onInstalledevento.

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

})

È tutto!


Vecchia risposta, prima del 2011

Se vuoi controllare se l'estensione è stata installata o aggiornata, puoi fare qualcosa del genere:

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

Se eseguo getVersion () in uno script di contenuto in Gmail, ottengo il numero della versione dell'app Gmail. Vorrei sottolineare che ci sono una serie di problemi che impediscono il funzionamento di questo tipo di script: a) quando installi un plugin, che deve iniettare uno script di contenuto in una pagina e la pagina è già caricata, lo script di contenuto lo fa non venga iniettato nella pagina, la pagina deve essere ricaricata). b) ottenere il numero di versione del plug-in può essere eseguito dallo script in background, tuttavia lo script in background non può accedere a localStorage, solo lo script del contenuto può, che non è ancora caricato ...
Victor S

3
questo post è fantastico ... dovresti contrassegnarlo come risposta. Grazie Mohamed!
frenetix

3
@VictorS quanto sopra è inteso per essere utilizzato all'interno della pagina in background, se prevedi di usarlo in uno script di contenuto, chiama direttamente chrome.app.getDetails (). Version. Il motivo per cui ho ottenuto la versione precedente è perché nei primi giorni dello sviluppo di Chrome Extension, non esisteva alcun oggetto chrome.app, quindi abbiamo dovuto eseguire l'XHR del manifest. Potresti fare tutto questo in una chiusura in modo da poter garantire la tua chiamata il metodo giusto. Di solito incapsulo tutto in un oggetto di classe.
Mohamed Mansour

1
Fantastico, questo ha funzionato per me. Notare che il codice precedente manca di un punto e virgola e "undefined" non dovrebbe contenere virgolette.
mpoisot

@mpoisot Mi dispiace dirlo, ti sbagli su "undefined". (So di essere molto tardi per questo partito, ma questo può essere importante per gli altri che incappare in qui come me.) Egli è non tentando di controllare prevVersion == 'undefined'... lui sta controllando typeof prevVersion == 'undefined'. E 'molto più robusto da utilizzare typeofdurante il controllo se non è definita una variabile ... vedi qui per imparare perché: stackoverflow.com/a/3550319/130691
JMTyler

20

Fortunatamente, ora ci sono eventi per questo (dalla versione 22 di Chrome e 25 per gli eventi di aggiornamento).

Per un evento installato:

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

Per un evento OnUpdateAvailable:

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

Un importante estratto su OnUpdateAvailable dai documenti per sviluppatori dice:

Attivato quando è disponibile un aggiornamento, ma non viene installato immediatamente perché l'app è attualmente in esecuzione. Se non fai nulla, l'aggiornamento verrà installato la prossima volta che la pagina in background viene scaricata, se vuoi che venga installato prima puoi chiamare esplicitamente chrome.runtime.reload ().


9

Semplice. Quando l'estensione viene eseguita per la prima volta, localStorageè vuoto. Alla prima esecuzione, è possibile scrivere una bandiera lì per contrassegnare tutte le corse conseguenti come non prime.

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

MODIFICA: per verificare se l'estensione è stata appena aggiornata, memorizzare la versione invece di un semplice flag alla prima esecuzione, quindi quando la versione dell'estensione corrente (ottenerla XmlHttpRequestinserendo il manifest) non è uguale a quella memorizzata localStorage, l'estensione è stato aggiornato.


Attento a non farlo in uno script di contenuto. localStorage è condiviso con altro codice ed estensioni nella pagina. Quindi questo non funzionerebbe in uno script di contenuto.
huyz

Per le app in pacchetto, questa è davvero una soluzione definitiva da utilizzare nelle pagine in background poiché un'app in pacchetto localStorageè effettivamente nella sua finestra separata e non condivisa con altro codice ed estensioni sulla pagina come menzionato da @huyz. Per le estensioni, tuttavia, questo non è il caso.
realkstrawn93

1
Tuttavia, ciò richiede il permesso di archiviazione.
Pacerier
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.