如何知道我的Safari扩展代码在用户安装扩展后第一次运行?Safari扩展第一次运行和更新
我想区分扩展的新安装与扩展的更新。
我正在寻找一些与this answer非常相似的东西,但是用于Safari,而不是用于Chrome。我无法将该链接中的答案代码“翻译”为Safari。
如何知道我的Safari扩展代码在用户安装扩展后第一次运行?Safari扩展第一次运行和更新
我想区分扩展的新安装与扩展的更新。
我正在寻找一些与this answer非常相似的东西,但是用于Safari,而不是用于Chrome。我无法将该链接中的答案代码“翻译”为Safari。
如果你生活中可以没有更新检查,这个脚本应该工作(与铬相关答案比较):
// 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
}
获得版本
不要忘记在扩展生成器添加隐藏设置项目
拿了@ 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');
});
哎呀。我错过了localStorage只能处理字符串,所以我们必须在最上面的例子中使用布尔值来弥补这一点,例如通过引入JSON.parse和JSON.stringify。答案已更新。 – Claudijo 2012-07-17 10:34:17