检测 Chrome 扩展首次运行/更新

一个扩展如何才能发现它是第一次运行或者刚刚被更新,以便扩展可以执行一些特定的操作?(例如,打开帮助页面或更新设置)

41672 次浏览

很简单。当扩展首次运行时,localStorage为空。在第一次运行时,您可以在那里写一个标志,将所有后续运行标记为非第一次。

例如:

var first_run = false;
if (!localStorage['ran_before']) {
first_run = true;
localStorage['ran_before'] = '1';
}


if (first_run) alert('This is the first run!');

编辑: 要检查扩展是否已经更新,首次运行时存储版本而不是简单的标志,然后当当前扩展版本(通过 XmlHttpRequesting 清单获得)不等于存储在 localStorage中的版本时,扩展已经更新。

更新答案以反映清单第3版:

Chromium 现在有一组 Chrome 运行时 API,允许您获取扩展的版本。

要获得当前版本:

chrome.runtime.getManifest().version

要侦听扩展何时首次安装,何时将扩展更新为新版本,以及何时将 Chromium 更新为新版本,可以使用 onInstalled事件。

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


})

仅此而已!


旧答案,在2011年之前

如果你想检查扩展是否已经安装或更新,你可以这样做:

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

在较新版本的 Chrome 中(自 Chrome 22以来) ,你可以使用 chrome.runtime.onInstalled事件,这样更干净。

例如:

// 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 + "!");
}
});

幸运的是,现在已经有了 事件来处理这个问题(从 Chrome 22版本开始,更新事件的 事件是25版本)。

对于已安装的事件:

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

对于 OnUpdateOffable 事件:

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

开发者文档中关于 OnUpdate  一个重要摘录说:

更新可用时触发,但由于应用程序当前正在运行而未立即安装。如果您什么都不做,那么更新将在下次卸载后台页面时安装,如果您希望更快地安装更新,可以显式调用 chrome.runtime.reload ()。