Виявити розширення Chrome для першого запуску / оновлення


98

Як розширення може дізнатись, що воно запускається вперше або щойно оновлено, щоб розширення могло виконувати певні дії? (наприклад, відкрити сторінку довідки або оновити налаштування)


чому ти не вибрав цей? stackoverflow.com/a/14957674/4548520 це право anwser - офіційний захід для першого розширення установки
user25

Відповіді:


176

У новіших версіях 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 ніколи не запускалася, і, отже, сценарій оновлення ніколи не запускався. Варто згадати тим, хто запускає сценарії оновлення onInstalled, можливо, вам доведеться прослухати іншу подію в ситуаціях, коли ви запитуєте новий дозвіл.
Elimin

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, може лише скрипт вмісту, який ще не завантажений ...
Victor S

3
ця публікація чудова ... ви повинні позначити це як відповідь. Дякую Мохамед!
frenetix 02

3
@VictorS вищезазначене призначене для використання на фоновій сторінці, якщо ви плануєте використовувати це у сценарії вмісту, то просто зателефонуйте безпосередньо chrome.app.getDetails (). Причина, через яку я раніше отримував getVersion, полягає в тому, що на початку розробки розширення Chrome не було об’єкта chrome.app, тому нам довелося XHR маніфесту. Ви можете зробити все це в закритому режимі, щоб ви могли гарантувати, що ви телефонуєте правильним способом. Зазвичай я інкапсулюю все в об'єкті класу.
Мохамед Мансур

1
Чудово, це спрацювало у мене. Зверніть увагу, що у наведеному вище коді відсутня крапка з комою, а "undefined" не повинен містити лапок
mpoisot

@mpoisot Вибачте, що ви помиляєтесь щодо "невизначеного". (Я знаю, що я дуже спізнився на цю вечірку, але це може бути важливим для інших, хто натрапляє сюди, наприклад я, наприклад.) Він не намагається перевірити 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 ().


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.