Détecter la première exécution / mise à jour de l'extension Chrome

98

Comment une extension peut-elle savoir qu'elle est exécutée pour la première fois ou vient d'être mise à jour, afin que l'extension puisse effectuer certaines actions spécifiques? (par exemple ouvrir une page d'aide ou mettre à jour les paramètres)

rack1
la source
pourquoi tu n'as pas choisi celui-ci? stackoverflow.com/a/14957674/4548520 it's right anwser - événement officiel pour la première installation d'extension
user25

Réponses:

176

Dans les nouvelles versions de Chrome (depuis Chrome 22), vous pouvez utiliser l' chrome.runtime.onInstalledévénement, qui est beaucoup plus propre.

Exemple:

// 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
la source
2
Merci pour ça! Tout ce que j'ai trouvé sur Internet, c'est de stocker la version de l'extension dans localStorage jusqu'à ce que je tombe finalement sur cette réponse, ce qui était bien sûr une solution viable, mais j'ai été tellement surpris que Chrome n'ait pas quelque chose de intégré pour cela! Je suis tellement content de ne pas avoir été déçu :)
JMTyler
2
Depuis Chrome 22, sorti en septembre 2012
Redzarf
1
chrome.runtime.onInstalled détecte lorsque l'application ou l'extension est installée en arrière-plan. Ce qu'il ne fait pas, cependant, est de détecter un premier déclenchement de l'événement chrome.app.runtime.onLaunched ...
realkstrawn93
3
J'ai utilisé ce code pendant un certain temps et cela a très bien fonctionné, jusqu'à ce que mon extension demande une nouvelle autorisation sur une mise à jour (qui suspend l'extension jusqu'à ce que l'utilisateur accepte l'autorisation). Lorsque l'autorisation a été acceptée et que l'extension n'a pas été suspendue, l'événement onInstalled ne s'est jamais déclenché et le script de mise à jour ne s'est donc jamais exécuté. Il convient de mentionner que pour ceux qui exécutent des scripts de mise à jour sur Installé, vous devrez peut-être écouter un événement différent dans les situations où vous avez demandé une nouvelle autorisation.
Elimn le
2
@Elimm semble être le bogue de Chrome, vous devriez signaler le bug tracker.
Alvin Wong
72

Réponse mise à jour pour refléter la v3 du manifeste:

Chromium dispose désormais d'un ensemble d'API chrome.runtime , qui vous permet de récupérer la version de l'extension.

Pour obtenir la version actuelle:

chrome.runtime.getManifest().version

Pour écouter lorsque l'extension a été installée pour la première fois, lorsque l'extension est mise à jour vers une nouvelle version et lorsque Chromium est mis à jour vers une nouvelle version, vous pouvez utiliser l' onInstalledévénement.

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

})

C'est tout!


Ancienne réponse, avant 2011

Si vous souhaitez vérifier si l'extension a été installée ou mise à jour, vous pouvez faire quelque chose comme ceci:

  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
la source
Si j'exécute getVersion () dans un script de contenu dans Gmail, j'obtiens le numéro de la version de l'application Gmail. Je dois souligner qu'il existe un certain nombre de problèmes qui empêcheront ce type de script de fonctionner: a) lorsque vous installez un plugin, qui doit injecter un script de contenu dans une page, et que la page est déjà chargée, le script de contenu fait pas être injecté dans la page, la page doit être rechargée). b) obtenir le numéro de version du plugin peut être fait à partir du script d'arrière-plan, mais le script d'arrière-plan ne peut pas accéder à localStorage, seul le script de contenu peut, qui n'est pas encore chargé ...
Victor S
3
ce post est génial ... vous devriez marquer celui-ci comme une réponse. Merci Mohamed!
frenetix
3
@VictorS ce qui précède est destiné à être utilisé dans la page d'arrière-plan, si vous prévoyez de l'utiliser dans un script de contenu, appelez simplement chrome.app.getDetails (). Version directement. La raison pour laquelle j'ai fait getVersion avant est que dans les premiers jours du développement de l'extension Chrome, il n'y avait pas d'objet chrome.app, nous avons donc dû XHR le manifeste. Vous pouvez faire tout cela dans une fermeture afin de garantir que vous appelez la bonne méthode. J'encapsule généralement tout dans un objet de classe.
Mohamed Mansour
1
Super, cela a fonctionné pour moi. Notez que le code ci-dessus ne contient pas de point-virgule et que «indéfini» ne doit pas avoir de guillemets.
mpoisot
@mpoisot Désolé de dire que vous vous trompez sur "indéfini". (Je sais que je suis très en retard à cette fête, mais cela peut être important pour d'autres qui trébuchent ici comme moi.) Il n'essaye pas de vérifier prevVersion == 'undefined'... il vérifie typeof prevVersion == 'undefined'. Il est beaucoup plus robuste à utiliser typeoflors de la vérification si une variable n'est pas définie ... voyez ici pour savoir pourquoi: stackoverflow.com/a/3550319/130691
JMTyler
20

Heureusement, il y a maintenant des événements pour cela (depuis la version 22 de Chrome et 25 pour les événements de mise à jour).

Pour un événement installé:

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

Pour un événement OnUpdateAvailable:

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

Un extrait important sur OnUpdate Disponible dans la documentation du développeur dit:

Déclenché lorsqu'une mise à jour est disponible, mais n'est pas installée immédiatement car l'application est en cours d'exécution. Si vous ne faites rien, la mise à jour sera installée la prochaine fois que la page d'arrière-plan sera déchargée, si vous voulez qu'elle soit installée plus tôt, vous pouvez appeler explicitement chrome.runtime.reload ().

JVillella
la source
9

Facile. Lorsque l'extension s'exécute pour la première fois, le localStorageest vide. Lors de la première exécution, vous pouvez y écrire un indicateur pour marquer toutes les exécutions consécutives comme non premières.

Exemple, dans 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: Pour vérifier si l'extension vient d'être mise à jour, stockez la version au lieu d'un simple indicateur lors de la première exécution, puis lorsque la version actuelle de l'extension (récupérez-la en XmlHttpRequestutilisant le manifeste) ne correspond pas à celle stockée dans localStorage, l'extension a été mis à jour.

Max Shawabkeh
la source
Attention à ne pas faire cela dans un script de contenu. localStorage est partagé avec d'autres codes et extensions sur la page. Donc, cela ne fonctionnerait pas dans un script de contenu.
huyz
Pour les applications packagées, il s'agit en effet d'une solution définitive à utiliser dans les pages d'arrière-plan car une application packagée se localStoragetrouve en effet dans sa propre fenêtre séparée et n'est pas partagée avec d'autres codes et extensions sur la page, comme @huyz l'a mentionné. Pour les extensions, cependant, ce n'est pas le cas.
realkstrawn93
1
Cela nécessite cependant une autorisation de stockage.
Pacerier