¿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)
¿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)
Respuestas:
En las versiones más nuevas de Chrome (desde Chrome 22), puede usar el chrome.runtime.onInstalled
evento, 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 + "!");
}
});
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 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;
}
})
¡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;
}
prevVersion == 'undefined'
... está controlando typeof prevVersion == 'undefined'
. Es mucho más robusto de usar typeof
cuando se verifica si una variable no está definida ... vea aquí para saber por qué: stackoverflow.com/a/3550319/130691
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 ().
Sencillo. Cuando la extensión se ejecuta por primera vez, localStorage
está 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 XmlHttpRequest
el manifiesto) no es igual a la almacenada localStorage
, la extensión tiene sido actualizado.
localStorage
está 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.