İlk çalıştırma / güncelleme Chrome uzantısını algıla


Yanıtlar:


178

Chrome'un daha yeni sürümlerinde (Chrome 22'den beri), chrome.runtime.onInstalledçok daha temiz olan etkinliği kullanabilirsiniz .

Misal:

// 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
Bunun için teşekkür ederim! İnternette bulduğum tek şey, uzantının sürümünü localStorage'da depolamak oldu, ta ki sonunda bu cevaba rastlayana kadar, ki bu elbette uygulanabilir bir çözümdü, ancak Chrome'un bunun için yerleşik bir şeye sahip olmamasına çok şaşırdım!
Hayal

2
Eylül 2012'de yayınlanan Chrome 22'den beri
Redzarf

1
chrome.runtime.onInstalled, uygulama veya uzantının arka planda yüklendiğini algılar. Ancak yapmadığı şey, chrome.app.runtime.onLaunched olayının ilk ateşlemesini algılamaktır ...
realkstrawn93

3
Bu kodu bir süre kullandım ve uzantım bir güncelleme için yeni bir izin talep edene kadar (kullanıcı izni kabul edene kadar uzantıyı askıya alan) harika çalıştı. İzin kabul edildiğinde ve uzantı askıya alınmadığında, onInstalled olayı asla tetiklenmedi ve bu nedenle güncelleme betiği hiç çalışmadı. Kurulumda güncelleme komut dosyalarını çalıştıranlar için bahsetmeye değer, yeni bir izin talep ettiğiniz durumlarda farklı bir olay dinlemeniz gerekebilir.
Elimn

2
@Elimm, Chrome'un hatası gibi görünüyor, hata izleyiciyi rapor etmelisiniz.
Alvin Wong

72

Manifest'in v3'ünü yansıtacak şekilde güncellenmiş yanıt:

Chromium artık, uzantının sürümünü getirmenize olanak tanıyan bir chrome.runtime API kümesine sahiptir .

Mevcut sürümü almak için:

chrome.runtime.getManifest().version

Uzantı ilk yüklendiğinde, uzantı yeni bir sürüme güncellendiğinde ve Chromium yeni bir sürüme güncellendiğinde dinlemek için onInstalledetkinliği kullanabilirsiniz .

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

})

Bu kadar!


2011 öncesi eski cevap

Uzantının yüklenip yüklenmediğini kontrol etmek istiyorsanız, aşağıdaki gibi bir şey yapabilirsiniz:

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

Gmail'de bir içerik komut dosyasında getVersion () çalıştırırsam, Gmail uygulaması sürüm numarasını alırım. Bu tür bir komut dosyasının çalışmasını engelleyecek bir dizi sorun olduğunu belirtmeliyim: a) bir içerik komut dosyasını bir sayfaya enjekte etmesi gereken bir eklenti yüklediğinizde ve sayfa zaten yüklendiğinde, içerik betiği sayfaya enjekte edilmemelidir, sayfanın yeniden yüklenmesi gerekir). b) Eklentinin sürüm numarasını almak arka plan komut dosyasından yapılabilir, ancak arka plan komut dosyası localStorage'a erişemez, yalnızca henüz yüklenmemiş içerik betiği erişebilir ...
Victor S

3
Bu gönderi harika ... Bunu bir cevap olarak işaretlemelisiniz. Teşekkürler Mohamed!
frenetix

3
@VictorS Yukarıdakilerin arka plan sayfasında kullanılması amaçlanmıştır, bunu bir içerik komut dosyasında kullanmayı planlıyorsanız, doğrudan chrome.app.getDetails (). Sürümünü çağırın. Daha önce getVersion özelliğini kullanmamın nedeni, Chrome Uzantısı geliştirmenin ilk günlerinde chrome.app nesnesinin olmamasıydı, bu yüzden manifest'i XHR yapmak zorunda kaldık. Tüm bunları bir kapanışta yapabilirsiniz, böylece doğru yöntemi aramanızı garanti edebilirsiniz. Genelde her şeyi bir sınıf nesnesinde kapsıyorum.
Mohamed Mansour

1
Harika, bu benim için çalıştı. Yukarıdaki kodda noktalı virgül bulunmadığını ve "tanımsız" ifadesinin tırnak işaretleri içermemesi gerektiğini unutmayın.
mpoisot

@mpoisot Üzgünüz, "tanımsız" konusunda yanılıyorsunuz. (Bu partiye çok geç kaldığımı biliyorum ama bu benim gibi burada rastlananlar için önemli olabilir.) Kontrol etmeye çalışmıyorprevVersion == 'undefined' ... kontrol ediyor typeof prevVersion == 'undefined'. typeofBir değişkenin tanımsız olup olmadığını kontrol ederken kullanmak çok daha sağlamdır ... nedenini öğrenmek için buraya bakın: stackoverflow.com/a/3550319/130691
JMTyler

20

Neyse ki, artık bunun için etkinlikler var (güncelleme etkinlikleri için Chrome sürüm 22 ve 25'ten beri).

Yüklü bir olay için:

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

OnUpdateAvailable etkinliği için:

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

Geliştirici belgelerinden OnUpdateAvailable hakkında önemli bir alıntı şöyle diyor:

Bir güncelleme mevcut olduğunda tetiklenir, ancak uygulama şu anda çalıştığı için hemen yüklenmez. Hiçbir şey yapmazsanız, güncelleme arka plan sayfasının bir sonraki yüklemesi kaldırıldığında yüklenecektir, daha erken yüklenmesini istiyorsanız, chrome.runtime.reload () öğesini açıkça çağırabilirsiniz.


9

Basit. Uzantı ilk çalıştığında localStorageboştur. İlk çalıştırmada, tüm ardışık işlemleri ilk olmayan olarak işaretlemek için oraya bir bayrak yazabilirsiniz.

Örnek, background.htm'de:

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

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

DÜZENLEME: Uzantının henüz güncellenip güncellenmediğini kontrol etmek için, ilk çalıştırmada basit bir bayrak yerine sürümü depolayın, ardından mevcut uzantı sürümü ( XmlHttpRequestmanifest'i kullanarak elde edin), içinde depolananla aynı olmadığında localStorage, uzantı güncellendi.


Bunu bir içerik senaryosunda yapmamaya dikkat edin. localStorage, sayfadaki diğer kod ve uzantılarla paylaşılır. Yani bu bir içerik senaryosunda çalışmaz.
huyz

Paketlenmiş uygulamalar için bu, paketlenmiş bir uygulamanın localStorageaslında kendi ayrı penceresinde olduğu ve @ huyz'un bahsettiği sayfadaki diğer kod ve uzantılarla paylaşılmadığı için arka plan sayfalarında kullanım için kesin bir çözümdür . Ancak uzantılar için durum böyle değil.
realkstrawn93

1
Bu, depolama izni gerektirir.
Pacerier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.