Расширение Safari при первом запуске и обновлениях - PullRequest
4 голосов
/ 26 марта 2012

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

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

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

Ответы [ 3 ]

5 голосов
/ 12 июля 2012

Если вы можете жить без проверки обновлений, этот скрипт должен работать (сравните с ответом, связанным с 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;
  }
});
1 голос
/ 22 сентября 2015

мы можем получить версию от 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 голосов
/ 14 февраля 2018

Взял ответ @ 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');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...