2012-03-26 9 views
4

Wie kann ich feststellen, ob mein Safari-Erweiterungscode zum ersten Mal ausgeführt wird, nachdem der Benutzer die Erweiterung installiert hat?Safari-Erweiterung wird zuerst ausgeführt und aktualisiert

Ich möchte zwischen einer Neuinstallation der Erweiterung im Vergleich zu einem Update der Erweiterung unterscheiden.

Ich bin auf der Suche nach etwas sehr ähnlich zu this answer, aber für Safari, anstatt für Chrome. Ich konnte den Code aus der Antwort in diesem Link zu Safari nicht "übersetzen".

Antwort

4

Wenn Sie ohne die Update-Prüfung leben kann, dieses Skript sollte (mit der Chrome bezogen Antwort vergleichen) arbeiten:

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

Wenn Sie auch nach Updates suchen möchten, müssen Sie die Version von asynchron erhalten die plist-Datei, wie so:

// 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

Oops. Ich habe verpasst, dass localStorage nur Strings behandelt, also müssen wir das kompensieren, wenn wir im obersten Beispiel mit Booleans arbeiten, zum Beispiel mit JSON.parse und JSON.stringify. Die Antwort wurde aktualisiert. – Claudijo

1

können wir Version von 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 
} 
erhalten

vergessen Sie nicht, versteckten Einstellungspunkt in Verlängerung Builder

0

@ Antwort des Claudijo oben Nahmen hinzuzufügen und arbeitete sie in eine kleine Klasse:

/** 
* 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'); 
}); 
Verwandte Themen