Detectar extensão do Chrome primeira execução / atualização

96

Como uma extensão pode descobrir que está sendo executada pela primeira vez ou que acabou de ser atualizada, para que a extensão possa realizar algumas ações específicas? (por exemplo, abrir uma página de ajuda ou atualizar as configurações)

rack1
fonte
por que você não escolheu este? stackoverflow.com/a/14957674/4548520 it's right anwser - evento oficial para a primeira instalação de extensão
usuário 25

Respostas:

174

Nas versões mais recentes do Chrome (desde o Chrome 22), você pode usar o chrome.runtime.onInstalledevento, que é muito mais limpo.

Exemplo:

// 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
fonte
2
Obrigado por isso! Tudo o que descobri na Internet foi armazenar a versão da extensão em localStorage até que finalmente encontrei esta resposta, que era obviamente uma solução viável, mas fiquei tão surpreso que o chrome não tinha algo embutido para isso! Estou tão feliz por não ter sido decepcionado :)
JMTyler
2
Desde o Chrome 22, lançado em setembro de 2012
Redzarf
1
chrome.runtime.onInstalled detecta quando o aplicativo ou extensão é instalado em segundo plano. O que ele não faz, no entanto, é detectar um primeiro disparo do evento chrome.app.runtime.onLaunched ...
realkstrawn93
3
Usei esse código por um tempo e funcionou muito bem, até que minha extensão solicitou uma nova permissão em uma atualização (que suspende a extensão até que o usuário aceite a permissão). Quando a permissão foi aceita e a extensão não foi suspensa, o evento onInstalled nunca foi disparado e, portanto, o script de atualização nunca foi executado. Vale a pena mencionar que, para aqueles que executam scripts de atualização noInstalled, pode ser necessário ouvir um evento diferente em situações em que você solicitou uma nova permissão.
Elimn de
2
@Elimm parece um bug do Chrome, você deve relatar no bug tracker.
Alvin Wong
72

Resposta atualizada para refletir a v3 do manifesto:

O Chromium agora tem um conjunto de APIs chrome.runtime , que permite que você busque a versão da extensão.

Para obter a versão atual:

chrome.runtime.getManifest().version

Para ouvir quando a extensão foi instalada pela primeira vez, quando a extensão é atualizada para uma nova versão e quando o Chromium é atualizado para uma nova versão, você pode usar o onInstalled evento.

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

})

Isso é tudo!


Resposta antiga, antes de 2011

Se você deseja verificar se a extensão foi instalada ou atualizada, você pode fazer algo assim:

  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
fonte
Se eu executar getVersion () em um script de conteúdo no Gmail, obtenho o número da versão do aplicativo Gmail. Devo salientar que há uma série de problemas que impedem esse tipo de script de funcionar: a) quando você instala um plugin, que precisa injetar um script de conteúdo em uma página, e a página já está carregada, o script de conteúdo o faz não seja injetado na página, a página deve ser recarregada). b) obter o número da versão do plugin pode ser feito a partir do script de fundo, porém o script de fundo não pode acessar o localStorage, apenas o script de conteúdo pode, que ainda não está carregado ...
Victor S
3
esta postagem é ótima ... você deve marcar esta como uma resposta. Obrigado Mohamed!
frenetix
3
@VictorS o acima deve ser usado na página de fundo, se você planeja usar isso em um script de conteúdo, basta chamar chrome.app.getDetails (). Version diretamente. A razão pela qual eu fiz getVersion antes é porque nos primeiros dias do desenvolvimento da extensão do Chrome, não havia nenhum objeto chrome.app, então tivemos que fazer o XHR do manifesto. Você pode fazer tudo isso em um encerramento para garantir a chamada do método correto. Normalmente encapsulo tudo em um objeto de classe.
Mohamed Mansour
1
Ótimo, isso funcionou para mim. Observe que o código acima está sem um ponto-e-vírgula e "indefinido" não deve ter aspas.
mpoisot,
@mpoisot Desculpe dizer, você está errado sobre "indefinido". (Eu sei que estou muito atrasado para esta festa, mas isso pode ser importante para outras pessoas que tropeçam aqui, como eu.) Ele não está tentando verificar prevVersion == 'undefined'... ele está verificando typeof prevVersion == 'undefined'. É muito mais robusto para usar typeofao verificar se uma variável é indefinida ... veja aqui para saber o porquê: stackoverflow.com/a/3550319/130691
JMTyler
20

Felizmente, agora existem eventos para isso (desde a versão 22 do Chrome e 25 para eventos de atualização).

Para um evento instalado:

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

Para um evento OnUpdateAvailable:

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

Um trecho importante sobre OnUpdateAvailable da documentação do desenvolvedor diz:

Disparado quando uma atualização está disponível, mas não é instalado imediatamente porque o aplicativo está em execução. Se você não fizer nada, a atualização será instalada na próxima vez que a página de plano de fundo for descarregada. Se você quiser que ela seja instalada antes, chame o chrome.runtime.reload () explicitamente.

JVillella
fonte
9

Simples. Quando a extensão é executada pela primeira vez, olocalStorage está vazio. Na primeira execução, você pode escrever um sinalizador lá para marcar todas as execuções subsequentes como não primeiras.

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

EDITAR: Para verificar se a extensão acabou de ser atualizada, armazene a versão em vez de um sinalizador simples na primeira execução, então, quando a versão da extensão atual (pegue XmlHttpRequestno manifesto) não for igual à armazenada em localStorage, a extensão foi foi atualizado.

Max Shawabkeh
fonte
Cuidado para não fazer isso em um script de conteúdo. localStorage é compartilhado com outro código e extensões na página. Portanto, isso não funcionaria em um script de conteúdo.
huyz de
Para aplicativos empacotados, esta é de fato uma solução definitiva para uso em páginas de fundo, já que um aplicativo empacotado localStorageestá de fato em sua própria janela separada e não é compartilhado com outro código e extensões na página como @huyz mencionou. Para extensões, no entanto, esse não é o caso.
realkstrawn93
1
Porém, isso requer permissão de armazenamento.
Pacerier