2010-03-08 34 views
80

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

+0

migrar a superuser.com –

+25

no necesariamente. Creo que puede ser una pregunta de programación si rack1 está escribiendo extensiones de Chrome. –

+0

¿por qué no eligió este? http://stackoverflow.com/a/14957674/4548520 es correcto: evento oficial para la primera instalación de extensión – user25

Respuesta

9

Simple. Cuando la extensión se ejecuta por primera vez, el localStorage está vacío. En la primera ejecución, puede escribir una bandera allí para marcar todas las ejecuciones consecutivas 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!'); 

EDIT: Para comprobar si la extensión acaba de ser actualizada, almacenar la versión en lugar de una simple bandera en la primera ejecución, a continuación, cuando la versión actual de extensión (obténgalo por XmlHttpRequest en el manifiesto) no es igual al almacenado en localStorage, la extensión se ha actualizado.

+0

Cuidado de no hacer eso en una secuencia de comandos de contenido. localStorage se comparte con otros códigos y extensiones en la página. Entonces esto no funcionaría en un script de contenido. – huyz

+0

Para aplicaciones empaquetadas, esta es de hecho una solución definitiva para usar en páginas de fondo ya que la aplicación empaquetada 'localStorage' está en su propia ventana separada y no se comparte con otros códigos y extensiones en la página como @huyz mencionó. Para extensiones, sin embargo, este no es el caso. –

+0

** Esto requiere permiso de almacenamiento. ** – Pacerier

64

Si desea comprobar si la extensión se ha instalado o actualizado, se 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; 
    } 
+0

Si ejecuto getVersion() en un script de contenido en Gmail, obtengo el número de la 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 volver a cargarse).b) obtener el número de versión del plug-in se puede hacer desde el guión de fondo, sin embargo el guión de fondo no puede acceder al almacenamiento local, sólo la escritura de contenido puede, que aún no se carga ... –

+3

este post es grande ... deberías marcar esto como una respuesta. Gracias, Mohamed! – frenetix

+3

@VictorS lo anterior está destinado a ser utilizado en la página de fondo, si planea usar esto en un script de contenido, simplemente llame directamente a chrome.app.getDetails(). Version. La razón por la que obtuve la versión anterior es porque en los primeros días del desarrollo de la extensión de Chrome, no había ningún objeto chrome.app, por lo que tuvimos que XHR el manifiesto. Podrías hacer todo esto en un cierre para que puedas garantizar que tu llamada sea el método correcto. Por lo general, encapsulado todo en un objeto de clase. –

139

En las nuevas versiones de Chrome (desde Chrome 22), que puede utilizar el evento chrome.runtime.onInstalled, 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 + "!"); 
    } 
}); 
+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 me topé con esta respuesta, que por supuesto era una solución factible, ¡pero estaba tan sorprendido de que Chrome no tuviera algo incorporado para esto! Estoy tan contenta de que no he sido decepción :) – JMTyler

+2

Desde Chrome 22, lanzado en septiembre de 2012 – Redzarf

+1

chrome.runtime.onInstalled detecta cuando la aplicación o la extensión se ha instalado en el fondo. Lo que no hace, sin embargo, se detecta una primera activación del evento chrome.app.runtime.onLaunched ... –

14

Afortunadamente, ahora hay events para esto (desde la versión de Chrome 22, y 25 para los 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 la documentación para desarrolladores dice:

Se activa cuando hay una actualización disponible, pero no se instala inmediatamente porque la aplicación se está ejecutando actualmente. 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().

Cuestiones relacionadas