Deteksi ekstensi Chrome jalankan / perbarui dulu

98

Bagaimana ekstensi mengetahui bahwa ekstensi sedang dijalankan untuk pertama kali atau baru saja diperbarui, sehingga ekstensi dapat melakukan beberapa tindakan tertentu? (mis. buka halaman bantuan atau perbarui pengaturan)

rak1
sumber
mengapa kamu tidak memilih yang ini? stackoverflow.com/a/14957674/4548520 jawaban yang benar - acara resmi untuk pemasangan ekstensi pertama
pengguna25

Jawaban:

176

Di versi Chrome yang lebih baru (sejak Chrome 22), Anda dapat menggunakan chrome.runtime.onInstalledacara tersebut, yang jauh lebih bersih.

Contoh:

// 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 + "!");
    }
});
Alvin Wong
sumber
2
Terima kasih untuk ini! Semua yang saya temukan di Internet adalah menyimpan versi ekstensi di localStorage sampai saya akhirnya menemukan jawaban ini, yang tentu saja merupakan solusi yang bisa diterapkan, tetapi saya sangat terkejut bahwa chrome tidak memiliki sesuatu yang built-in untuk ini! Saya sangat senang bahwa saya tidak dikecewakan :)
JMTyler
2
Sejak Chrome 22, dirilis pada Sep 2012
Redzarf
1
chrome.runtime.onInstalled mendeteksi saat aplikasi atau ekstensi dipasang di latar belakang. Namun, yang tidak dilakukannya adalah mendeteksi pengaktifan pertama peristiwa chrome.app.runtime.onLaunched ...
realkstrawn93
3
Saya menggunakan kode ini untuk sementara waktu dan berfungsi dengan baik, sampai ekstensi saya meminta izin baru pada pembaruan (yang menangguhkan ekstensi sampai pengguna menerima izin). Ketika izin diterima dan ekstensi tidak ditangguhkan, peristiwa onInstalled tidak pernah diaktifkan dan dengan demikian skrip pembaruan tidak pernah berjalan. Layak disebutkan bagi mereka yang menjalankan skrip pembaruan onInstalled, Anda mungkin perlu mendengarkan acara yang berbeda dalam situasi di mana Anda telah meminta izin baru.
Elimn
2
@Elimm sepertinya bug Chrome, Anda harus melaporkan di pelacak bug.
Alvin Wong
72

Jawaban yang diperbarui untuk mencerminkan v3 dari manifes:

Chromium sekarang memiliki sekumpulan API chrome.runtime , yang memungkinkan Anda mengambil versi ekstensi.

Untuk mendapatkan versi saat ini:

chrome.runtime.getManifest().version

Untuk mendengarkan saat ekstensi pertama kali dipasang, saat ekstensi diperbarui ke versi baru, dan saat Chromium diperbarui ke versi baru, Anda dapat menggunakan onInstalledacara tersebut.

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

})

Itu saja!


Jawaban lama, sebelum 2011

Jika Anda ingin memeriksa apakah ekstensi telah dipasang atau diperbarui, Anda dapat melakukan sesuatu seperti ini:

  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;
  }
Mohamed Mansour
sumber
Jika saya menjalankan getVersion () dalam skrip konten di Gmail, saya mendapatkan nomor versi aplikasi Gmail. Saya harus menunjukkan bahwa ada sejumlah masalah yang akan mencegah jenis skrip ini bekerja: a) saat Anda menginstal plugin, yang perlu memasukkan skrip konten ke dalam halaman, dan halaman sudah dimuat, skrip konten tidak tidak dimasukkan ke dalam halaman, halaman tersebut harus dimuat ulang). b) mendapatkan nomor versi plugin dapat dilakukan dari skrip latar belakang, namun skrip latar belakang tidak dapat mengakses localStorage, hanya skrip konten yang dapat, yang belum dimuat ...
Victor S
3
posting ini bagus ... Anda harus menandai yang ini sebagai jawaban. Terima kasih Mohamed!
frenetix
3
@VictorS di atas dimaksudkan untuk digunakan dalam halaman latar belakang, jika Anda berencana untuk menggunakan ini dalam skrip konten, maka panggil saja versi chrome.app.getDetails (). Versi secara langsung. Alasan mengapa saya melakukan getVersion sebelumnya adalah karena pada hari-hari awal pengembangan Ekstensi Chrome, tidak ada objek chrome.app, jadi kami harus XHR manifesnya. Anda dapat melakukan semua ini secara tertutup sehingga Anda dapat menjamin panggilan Anda dengan metode yang benar. Saya biasanya merangkum semuanya dalam objek kelas.
Mohamed Mansour
1
Bagus, ini berhasil untuk saya. Perhatikan bahwa kode di atas tidak memiliki titik koma, dan "undefined" tidak boleh memiliki tanda kutip.
mpoisot
@mpoisot Maaf untuk mengatakan, Anda salah tentang "tidak ditentukan". (Saya tahu saya sangat terlambat ke pesta ini tapi ini mungkin penting bagi orang lain yang tersandung di sini seperti saya.) Dia tidak mencoba untuk memeriksa prevVersion == 'undefined'... dia sedang memeriksa typeof prevVersion == 'undefined'. Ini jauh lebih kuat untuk digunakan typeofsaat memeriksa apakah suatu variabel tidak ditentukan ... lihat di sini untuk mempelajari alasannya: stackoverflow.com/a/3550319/130691
JMTyler
20

Untungnya, sekarang ada acara untuk ini (sejak Chrome versi 22, dan 25 untuk acara pembaruan).

Untuk acara terinstal:

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

Untuk acara OnUpdateAvailable:

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

Kutipan penting tentang OnUpdateAvailable dari dokumen pengembang mengatakan:

Diaktifkan ketika pembaruan tersedia, tetapi tidak segera dipasang karena aplikasi sedang berjalan. Jika Anda tidak melakukan apa-apa, pembaruan akan dipasang saat halaman latar belakang dibongkar, jika ingin lebih cepat dipasang, Anda dapat memanggil chrome.runtime.reload () secara eksplisit.

JVillella
sumber
9

Sederhana. Saat ekstensi pertama kali dijalankan, ekstensi localStoragekosong. Saat pertama kali dijalankan, Anda dapat menulis sebuah tanda di sana untuk menandai semua proses konsekuen sebagai non-first.

Contoh, di 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!');

EDIT: Untuk memeriksa apakah ekstensi baru saja diperbarui, simpan versi alih-alih bendera sederhana saat pertama kali dijalankan, lalu ketika versi ekstensi saat ini (dapatkan dengan XmlHttpRequestmenggunakan manifes) tidak sama dengan yang disimpan di dalamnya localStorage, ekstensi memiliki telah diperbarui.

Max Shawabkeh
sumber
Berhati-hatilah untuk tidak melakukannya dalam skrip konten. localStorage dibagikan dengan kode dan ekstensi lain di halaman. Jadi ini tidak akan berfungsi di skrip konten.
huyz
Untuk aplikasi terpaket, ini memang solusi pasti untuk digunakan di halaman latar belakang karena aplikasi terpaket localStoragememang berada di jendela terpisahnya sendiri dan tidak dibagikan dengan kode dan ekstensi lain di halaman seperti yang disebutkan @huyz. Untuk ekstensi, bagaimanapun, ini tidak terjadi.
realkstrawn93
1
Ini membutuhkan izin penyimpanan.
Pacerier