2012-03-26 18 views
4

如何知道我的Safari扩展代码在用户安装扩展后第一次运行?Safari扩展第一次运行和更新

我想区分扩展的新安装与扩展的更新。

我正在寻找一些与this answer非常相似的东西,但是用于Safari,而不是用于Chrome。我无法将该链接中的答案代码“翻译”为Safari。

回答

4

如果你生活中可以没有更新检查,这个脚本应该工作(与铬相关答案比较):

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

哎呀。我错过了localStorage只能处理字符串,所以我们必须在最上面的例子中使用布尔值来弥补这一点,例如通过引入JSON.parse和JSON.stringify。答案已更新。 – Claudijo 2012-07-17 10:34:17

1

我们可以从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 
} 
获得版本

不要忘记在扩展生成器添加隐藏设置项目

0

拿了@ 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'); 
});