2012-03-26 3 views
4

Как узнать, запущен ли мой код расширения Safari в первый раз после того, как пользователь установил расширение?Первичный запуск Safari и обновления

Я хотел бы провести различие между новой установкой расширения и обновлением расширения.

Я ищу что-то очень похожее на this answer, но для Safari, а не для Chrome. Я не смог «перевести» код из ответа на эту ссылку в Safari.

ответ

4

Если вы можете жить без проверки обновлений, этот сценарий должен работать (сравните с соответствующей 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; 
    } 
}); 
+0

К сожалению. Я пропустил, что localStorage обрабатывает только строки, поэтому мы должны компенсировать это при работе с булевыми вершинами в самом верхнем примере, например, путем введения JSON.parse и JSON.stringify. Ответ обновлен. – Claudijo

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 
} 

не забудьте добавить скрытый элемент настройки в Extension Builder

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'); 
}); 
Смежные вопросы