Как расширение может узнать, что оно запускается впервые или только что было обновлено, чтобы расширение могло выполнять определенные действия? (например, откройте страницу справки или обновите настройки)
Как расширение может узнать, что оно запускается впервые или только что было обновлено, чтобы расширение могло выполнять определенные действия? (например, откройте страницу справки или обновите настройки)
Ответы:
В более новых версиях 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 + "!");
}
});
Обновленный ответ, чтобы отразить v3 манифеста:
В Chromium теперь есть набор API-интерфейсов chrome.runtime , которые позволяют получить версию расширения.
Чтобы получить текущую версию:
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;
}
prevVersion == 'undefined'
... он проверяет typeof prevVersion == 'undefined'
. Его гораздо надежнее использовать typeof
при проверке того, не определена ли переменная ... см. Здесь, чтобы узнать, почему: stackoverflow.com/a/3550319/130691
К счастью, теперь для этого есть события (начиная с версии Chrome 22 и 25 для событий обновления).
Для установленного события:
chrome.runtime.onInstalled.addListener(function() {...});
Для события OnUpdateAvailable:
chrome.runtime.onUpdateAvailable.addListener(function() {...});
В важном отрывке из документации разработчика о OnUpdateAvailable говорится:
Запускается, когда доступно обновление, но не устанавливается сразу, поскольку приложение в настоящее время работает. Если вы ничего не сделаете, обновление будет установлено при следующей выгрузке фоновой страницы. Если вы хотите, чтобы оно было установлено раньше, вы можете явно вызвать chrome.runtime.reload ().
Просто. При первом запуске расширения поле localStorage
пусто. При первом запуске вы можете написать там флаг, чтобы отмечать все последующие прогоны как не первые.
Пример в 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!');
РЕДАКТИРОВАТЬ: чтобы проверить, было ли только что обновлено расширение, сохраните версию вместо простого флага при первом запуске, а затем, когда текущая версия расширения (получить ее XmlHttpRequest
в манифесте) не совпадает с той, которая хранится в localStorage
, расширение имеет был обновлен.
localStorage
действительно находится в отдельном окне и не используется совместно с другим кодом и расширениями на странице, как упоминалось в @huyz. Однако для расширений это не так.