Расширение Safari при первом запуске и обновлениях
Как я могу узнать, работает ли мой код расширения Safari впервые после того, как пользователь установил расширение?
Я хотел бы провести различие между новой установкой расширения и обновлением расширения.
Я ищу что-то очень похожее на этот ответ, но для Safari, а не для Chrome. Я не смог "перевести" код из ответа в той ссылке на Safari.
3 ответа
Если вы можете жить без проверки обновлений, этот скрипт должен работать (сравните с ответом, связанным с Chrome):
// In background page
function onInstall() {
console.log('Extension installed');
}
var firstRun = typeof localStorage['extensionHasPreviouslyRun'] === 'undefined' ||
!JSON.parse(localStorage['extensionHasPreviouslyRun']);
if (firstrun) {
onInstall();
localStorage['extensionHasPreviouslyRun'] = JSON.stringify(true);
}
Если вы также хотите проверить наличие обновлений, вам нужно асинхронно получить версию из файла plist, например:
// In background page
function onInstall() {
console.log('Extension installed');
}
function onUpdate() {
console.log('Extension update');
}
function requestVersion(callback) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', 'info.plist');
xmlhttp.onload = function () {
var infoFile = xmlhttp.responseXML;
var keys = infoFile.getElementsByTagName('key');
for (var i = 0; i < keys.length; i++){
if (keys[i].firstChild.data === 'CFBundleShortVersionString'){
var version = keys[i].nextElementSibling.firstChild.data;
callback(version);
break;
}
}
}
xmlhttp.send();
}
requestVersion(function(version) {
var storedVersion = localStorage['version'];
if (storedVersion !== version) {
// Check if we just installed this extension.
if (typeof storedVersion === 'undefined') {
onInstall();
} else {
onUpdate();
}
localStorage['version'] = version;
}
});
Мы можем получить версию от safari.extension.displayVersion
var storedVersion = safari.extension.settings.version;
var currentVersion = safari.extension.displayVersion + '.' + safari.extension.bundleVersion;
if (typeof storedVersion === 'undefined') {
console.log('Extension installed');
safari.extension.settings.version = currentVersion
} else if (currentVersion != storedVersion) {
console.log('Extension update');
safari.extension.settings.version = currentVersion
}
не забудьте добавить скрытый элемент настроек в Extension Builder
Взял ответ @Claudijo выше и разбил его на небольшой класс:
/**
* ExtensionState
*
* @abstract
*/
var ExtensionState = (function() {
/**
* __configFilePath
*
* @access private
* @return String (default: '../Info.plist')
*/
var __configFilePath = '../Info.plist';
/**
* __getConfigVersion
*
* @access private
* @param Function callback
* @return void
*/
var __getConfigVersion = function(callback) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', __configFilePath);
xmlhttp.onload = function () {
var infoFile = xmlhttp.responseXML,
keys = infoFile.getElementsByTagName('key');
for (var i = 0; i < keys.length; i++){
if (keys[i].firstChild.data === 'CFBundleShortVersionString') {
var version = keys[i].nextElementSibling.firstChild.data;
callback(version);
break;
}
}
};
xmlhttp.send();
};
/**
* __getLocalVersion
*
* @access private
* @return String
*/
var __getLocalVersion = function() {
return localStorage['version'];
};
/**
* __putLocalVersion
*
* @access private
* @param String version
* @return void
*/
var __putLocalVersion = function(version) {
localStorage['version'] = version;
};
// Public
return {
/**
* installed
*
* @access public
* @param Function callback
* @return void
*/
installed: function(callback) {
var localVersion = __getLocalVersion();
if (typeof localVersion === 'undefined') {
__getConfigVersion(function(version) {
callback(version);
__putLocalVersion(version);
});
}
},
/**
* updated
*
* @access public
* @param Function callback
* @return void
*/
updated: function(callback) {
var localVersion = __getLocalVersion();
if (typeof localVersion !== 'undefined') {
__getConfigVersion(function(version) {
if (localVersion !== version) {
callback(version);
__putLocalVersion(version);
}
});
}
}
};
})()
ExtensionState.installed(function(version) {
console.log('(global.html): Installed');
});
ExtensionState.updated(function(version) {
console.log('(global.html): Updated');
});