Обнаружение расширения Chrome при первом запуске / обновлении

98

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

стойка1
источник
почему ты не выбрал этот? stackoverflow.com/a/14957674/4548520 это правильно anwser - официальное мероприятие для первой установки расширения
user25,

Ответы:

178

В более новых версиях Chrome (начиная с Chrome 22) вы можете использовать chrome.runtime.onInstalledсобытие, которое намного чище.

Пример:

// Check whether new version is installed
chrome.runtime.onInstalled.addListener(function(details){
    if(details.reason == "install"){
        console.log("This is a first install!");
    }else if(details.reason == "update"){
        var thisVersion = chrome.runtime.getManifest().version;
        console.log("Updated from " + details.previousVersion + " to " + thisVersion + "!");
    }
});
Элвин Вонг
источник
2
Спасибо тебе за это! Все, что я нашел в Интернете, - это хранить версию расширения в localStorage, пока я в конце концов не наткнулся на этот ответ, который, конечно же, был работоспособным решением, но я был так удивлен, что в Chrome не было чего-то встроенного для этого! Я так рад, что меня не подвели :)
JMTyler
2
Начиная с Chrome 22, выпущенного в сентябре 2012 г.
Redzarf
1
chrome.runtime.onInstalled определяет, когда приложение или расширение установлено в фоновом режиме. Однако чего он не делает, так это обнаружения первого срабатывания события chrome.app.runtime.onLaunched ...
realkstrawn93
3
Я использовал этот код какое-то время, и он отлично работал, пока мое расширение не запросило новое разрешение на обновление (которое приостанавливает расширение, пока пользователь не примет разрешение). Когда разрешение было принято и расширение было приостановлено, событие onInstalled никогда не запускалось, и, следовательно, сценарий обновления не запускался. Стоит упомянуть для тех, кто запускает скрипты обновления на установленном, вам может потребоваться прослушивание другого события в ситуациях, когда вы запрашивали новое разрешение.
Elimn
2
@Elimm похоже на ошибку Chrome, вы должны сообщить об ошибке в системе отслеживания ошибок.
Элвин Вонг,
72

Обновленный ответ, чтобы отразить v3 манифеста:

В Chromium теперь есть набор API-интерфейсов chrome.runtime , которые позволяют получить версию расширения.

Чтобы получить текущую версию:

chrome.runtime.getManifest().version

Чтобы прослушать, когда расширение было впервые установлено, когда расширение обновляется до новой версии и когда Chromium обновляется до новой версии, вы можете использовать onInstalledсобытие.

chrome.runtime.onInstalled.addListener((details) => {
   const currentVersion = chrome.runtime.getManifest().version
   const previousVersion = details.previousVersion
   const reason = details.reason

   console.log('Previous Version: ${previousVersion }')
   console.log('Current Version: ${currentVersion }')

   switch (reason) {
      case 'install':
         console.log('New User installed the extension.')
         break;
      case 'update':
         console.log('User has updated their extension.')
         break;
      case 'chrome_update':
      case 'shared_module_update':
      default:
         console.log('Other install events within the browser')
         break;
   }

})

Вот и все!


Старый ответ, до 2011 г.

Если вы хотите проверить, было ли расширение установлено или обновлено, вы можете сделать что-то вроде этого:

  function onInstall() {
    console.log("Extension Installed");
  }

  function onUpdate() {
    console.log("Extension Updated");
  }

  function getVersion() {
    var details = chrome.app.getDetails();
    return details.version;
  }

  // Check if the version has changed.
  var currVersion = getVersion();
  var prevVersion = localStorage['version']
  if (currVersion != prevVersion) {
    // Check if we just installed this extension.
    if (typeof prevVersion == 'undefined') {
      onInstall();
    } else {
      onUpdate();
    }
    localStorage['version'] = currVersion;
  }
Мохамед Мансур
источник
Если я запускаю getVersion () в сценарии содержимого в Gmail, я получаю номер версии приложения Gmail. Я должен указать на ряд проблем, которые помешают этому типу скрипта работать: а) когда вы устанавливаете плагин, который должен вставить контентный скрипт на страницу, и страница уже загружена, контентный скрипт выполняет не попадать на страницу, страницу необходимо перезагрузить). б) получить номер версии плагина можно из фонового скрипта, однако фоновый скрипт не может получить доступ к localStorage, может только скрипт содержимого, который еще не загружен ...
Виктор С.
3
этот пост отличный ... вы должны отметить его как ответ. Спасибо, Мохамед!
frenetix 02
3
@VictorS, приведенный выше, предназначен для использования на фоновой странице, если вы планируете использовать это в сценарии содержимого, просто вызовите chrome.app.getDetails (). Version напрямую. Причина, по которой я использовал getVersion раньше, заключается в том, что на заре разработки расширения Chrome не было объекта chrome.app, поэтому нам пришлось XHR манифеста. Вы можете сделать все это в закрытии, чтобы гарантировать, что вы вызываете правильный метод. Обычно я инкапсулирую все в объект класса.
Мохамед Мансур
1
Отлично, у меня это сработало. Обратите внимание, что в приведенном выше коде отсутствует точка с запятой, а «undefined» не должно содержать кавычек.
mpoisot 08
@mpoisot К сожалению, вы ошибаетесь насчет "undefined". (Я знаю, что очень опаздываю на эту вечеринку, но это может быть важно для тех, кто наткнется здесь, например, для меня.) Он не пытается проверить prevVersion == 'undefined'... он проверяет typeof prevVersion == 'undefined'. Его гораздо надежнее использовать typeofпри проверке того, не определена ли переменная ... см. Здесь, чтобы узнать, почему: stackoverflow.com/a/3550319/130691
JMTyler
20

К счастью, теперь для этого есть события (начиная с версии Chrome 22 и 25 для событий обновления).

Для установленного события:

chrome.runtime.onInstalled.addListener(function() {...});

Для события OnUpdateAvailable:

chrome.runtime.onUpdateAvailable.addListener(function() {...});

В важном отрывке из документации разработчика о OnUpdateAvailable говорится:

Запускается, когда доступно обновление, но не устанавливается сразу, поскольку приложение в настоящее время работает. Если вы ничего не сделаете, обновление будет установлено при следующей выгрузке фоновой страницы. Если вы хотите, чтобы оно было установлено раньше, вы можете явно вызвать chrome.runtime.reload ().

JVillella
источник
9

Просто. При первом запуске расширения поле localStorageпусто. При первом запуске вы можете написать там флаг, чтобы отмечать все последующие прогоны как не первые.

Пример в background.htm:

var first_run = false;
if (!localStorage['ran_before']) {
  first_run = true;
  localStorage['ran_before'] = '1';
}

if (first_run) alert('This is the first run!');

РЕДАКТИРОВАТЬ: чтобы проверить, было ли только что обновлено расширение, сохраните версию вместо простого флага при первом запуске, а затем, когда текущая версия расширения (получить ее XmlHttpRequestв манифесте) не совпадает с той, которая хранится в localStorage, расширение имеет был обновлен.

Макс Шавабке
источник
Осторожно, не делайте этого в сценарии содержимого. localStorage используется совместно с другим кодом и расширениями на странице. Так что это не будет работать в сценарии содержимого.
huyz
Для упакованных приложений это действительно определенное решение для использования на фоновых страницах, поскольку упакованное приложение localStorageдействительно находится в отдельном окне и не используется совместно с другим кодом и расширениями на странице, как упоминалось в @huyz. Однако для расширений это не так.
realkstrawn93
1
Однако для этого требуется разрешение на хранение.
Pacerier