Detectar la extensión de Chrome primero ejecutar / actualizar

98

¿Cómo puede una extensión saber que se está ejecutando por primera vez o que se acaba de actualizar, para que la extensión pueda realizar algunas acciones específicas? (por ejemplo, abra una página de ayuda o actualice la configuración)

rack1
fuente
¿Por qué no elegiste este? stackoverflow.com/a/14957674/4548520 es correcto anwser - evento oficial para la instalación de la primera extensión
usuario25

Respuestas:

176

En las versiones más nuevas de Chrome (desde Chrome 22), puede usar el chrome.runtime.onInstalledevento, que es mucho más limpio.

Ejemplo:

// 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
fuente
2
¡Gracias por esto! Todo lo que he encontrado en Internet es almacenar la versión de la extensión en localStorage hasta que finalmente encontré esta respuesta, que por supuesto era una solución viable, ¡pero me sorprendió tanto que Chrome no tuviera algo integrado para esto! Estoy muy contento de no haberme decepcionado :)
JMTyler
2
Desde Chrome 22, lanzado en septiembre de 2012
Redzarf
1
chrome.runtime.onInstalled detecta cuando la aplicación o extensión está instalada en segundo plano. Lo que no hace, sin embargo, es detectar una primera activación del evento chrome.app.runtime.onLaunched ...
realkstrawn93
3
Usé este código por un tiempo y funcionó muy bien, hasta que mi extensión solicitó un nuevo permiso en una actualización (que suspende la extensión hasta que el usuario acepta el permiso). Cuando se aceptó el permiso y la extensión no se suspendió, el evento onInstalled nunca se disparó y, por lo tanto, el script de actualización nunca se ejecutó. Vale la pena mencionar para aquellos que ejecutan scripts de actualización en Instalado, es posible que deba escuchar un evento diferente en situaciones en las que haya solicitado un nuevo permiso.
Elimn
2
@Elimm parece un error de Chrome, debe informar sobre el rastreador de errores.
Alvin Wong
72

Respuesta actualizada para reflejar v3 del manifiesto:

Chromium ahora tiene un conjunto de API chrome.runtime , que le permite obtener la versión de la extensión.

Para obtener la versión actual:

chrome.runtime.getManifest().version

Para escuchar cuando la extensión se instaló por primera vez, cuando la extensión se actualiza a una nueva versión y cuando Chromium se actualiza a una nueva versión, puede usar el 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;
   }

})

¡Eso es todo!


Respuesta anterior, anterior a 2011

Si desea verificar si la extensión se ha instalado o actualizado, puede hacer algo como esto:

  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
fuente
Si ejecuto getVersion () en un script de contenido en Gmail, obtengo el número de versión de la aplicación Gmail. Debo señalar que hay una serie de problemas que evitarán que este tipo de script funcione: a) cuando instala un complemento, que necesita inyectar un script de contenido en una página, y la página ya está cargada, el script de contenido lo hace no se inyecta en la página, la página debe recargarse). b) se puede obtener el número de versión del complemento desde el script de fondo, sin embargo, el script de fondo no puede acceder al localStorage, solo el script de contenido puede, que aún no está cargado ...
Victor S
3
esta publicación es excelente ... debes marcar esta como una respuesta. ¡Gracias Mohamed!
frenetix
3
@VictorS lo anterior está destinado a ser utilizado dentro de la página de fondo, si planea usar esto en un script de contenido, simplemente llame a chrome.app.getDetails (). Versión directamente. La razón por la que obtuve la versión antes es porque en los primeros días del desarrollo de la extensión de Chrome, no había un objeto chrome.app, por lo que tuvimos que XHR el manifiesto. Podrías hacer todo esto en un cierre para poder garantizar tu llamada con el método correcto. Normalmente encapsulo todo en un objeto de clase.
Mohamed Mansour
1
Genial, esto funcionó para mí. Tenga en cuenta que al código anterior le falta un punto y coma y que "indefinido" no debe tener comillas.
mpoisot
@mpoisot Lamento decirle que está equivocado acerca de "indefinido". (Sé que llego muy tarde a esta fiesta, pero esto puede ser importante para otras personas que se encuentran aquí, como yo). Él no está tratando de verificar prevVersion == 'undefined'... está controlando typeof prevVersion == 'undefined'. Es mucho más robusto de usar typeofcuando se verifica si una variable no está definida ... vea aquí para saber por qué: stackoverflow.com/a/3550319/130691
JMTyler
20

Afortunadamente, ahora hay eventos para esto (desde Chrome versión 22 y 25 para eventos de actualización).

Para un evento instalado:

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

Para un evento OnUpdateAvailable:

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

Un extracto importante sobre OnUpdateAvailable de los documentos del desarrollador dice:

Se activa cuando hay una actualización disponible, pero no se instala de inmediato porque la aplicación se está ejecutando. Si no hace nada, la actualización se instalará la próxima vez que se descargue la página de fondo; si desea que se instale antes, puede llamar explícitamente a chrome.runtime.reload ().

JVillella
fuente
9

Sencillo. Cuando la extensión se ejecuta por primera vez, localStorageestá vacía. En la primera ejecución, puede escribir una bandera allí para marcar todas las ejecuciones posteriores como no primeras.

Ejemplo, en 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 si la extensión se acaba de actualizar, almacene la versión en lugar de una bandera simple en la primera ejecución, luego, cuando la versión de la extensión actual (consígala mediante XmlHttpRequestel manifiesto) no es igual a la almacenada localStorage, la extensión tiene sido actualizado.

Max Shawabkeh
fuente
Tenga cuidado de no hacer eso en un guión de contenido. localStorage se comparte con otros códigos y extensiones de la página. Entonces esto no funcionaría en un guión de contenido.
huyz
Para las aplicaciones empaquetadas, esta es de hecho una solución definitiva para usar en páginas en segundo plano, ya que una aplicación empaquetada localStorageestá en su propia ventana separada y no se comparte con otros códigos y extensiones en la página como mencionó @huyz. Sin embargo, para las extensiones, este no es el caso.
realkstrawn93
1
Sin embargo, esto requiere permiso de almacenamiento.
Pacerier