Chrome एक्सटेंशन को पहले रन / अपडेट का पता लगाएं


98

एक एक्सटेंशन कैसे पता लगा सकता है कि यह पहली बार चलाया जा रहा है या बस अपडेट किया गया है, ताकि एक्सटेंशन कुछ विशिष्ट कार्यों को कर सके? (उदाहरण के लिए मदद पृष्ठ खोलें या सेटिंग अपडेट करें)


आपने इसे क्यों नहीं चुना? stackoverflow.com/a/14957674/4548520 यह सही
awser है

जवाबों:


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
इसके लिए शुक्रिया! मैंने इंटरनेट के चारों ओर पाया कि विस्तार का संस्करण लोकलस्टोरेज में स्टोर करना है, जब तक कि मैं अंततः इस उत्तर को पार नहीं कर देता, जो निश्चित रूप से एक व्यावहारिक समाधान था, लेकिन मुझे बहुत आश्चर्य हुआ कि क्रोम में इसके लिए कुछ अंतर्निहित नहीं था! मुझे बहुत खुशी है कि मुझे निराश नहीं किया गया :)
JMTyler

2
चूंकि क्रोम 22, सितंबर 2012 में रिलीज़ हुआ था
Redzarf

1
जब एप्लिकेशन या एक्सटेंशन पृष्ठभूमि में स्थापित हो जाता है, तो chrome.runtime.onInstalled पता लगाता है। हालांकि, यह क्या नहीं करता है, यह chrome.app.runtime.onLaunched इवेंट की पहली फायरिंग का पता लगाता है ...
realkstrawn93

3
मैंने थोड़ी देर के लिए इस कोड का उपयोग किया और इसने बहुत अच्छा काम किया, जब तक कि मेरे एक्सटेंशन ने अपडेट पर एक नई अनुमति का अनुरोध नहीं किया (जो उपयोगकर्ता द्वारा अनुमति स्वीकार करने तक एक्सटेंशन को निलंबित कर देता है)। जब अनुमति स्वीकार कर ली गई थी और एक्सटेंशन को अनसेंड कर दिया गया था, तो OnInstalled ईवेंट को कभी भी निकाल नहीं दिया गया था और इस प्रकार अपडेट स्क्रिप्ट कभी नहीं चली। अद्यतन स्क्रिप्ट चलाने वालों के लिए वर्थ का उल्लेख करते हुए, आपको उन स्थितियों में एक अलग घटना के लिए सुनने की आवश्यकता हो सकती है जहाँ आपने एक नई अनुमति का अनुरोध किया है।
११:४६ बजे

2
@ इल्म क्रोम की बग की तरह लगता है, आपको बग ट्रैकर पर रिपोर्ट करना चाहिए।
एल्विन वोंग

72

प्रकट होने के v3 को दर्शाने के लिए अद्यतित उत्तर:

क्रोमियम में अब एपीआई का क्रोम सेट है, जो आपको एक्सटेंशन के संस्करण को लाने की अनुमति देता है।

वर्तमान संस्करण प्राप्त करने के लिए:

chrome.runtime.getManifest().version

यह सुनने के लिए कि एक्सटेंशन को पहली बार इंस्टॉल किया गया है, जब एक्सटेंशन को नए संस्करण में अपडेट किया गया है, और जब क्रोमियम को नए संस्करण में अपडेट किया गया है, तो आप 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;
  }

यदि मैं Gmail में एक सामग्री स्क्रिप्ट में getVersion () चलाता हूं, तो मुझे जीमेल ऐप संस्करण का नंबर मिलता है। मुझे इंगित करना चाहिए कि इस प्रकार की स्क्रिप्ट को काम करने से रोकने में कई समस्याएं हैं: क) जब आप एक प्लगइन स्थापित करते हैं, तो एक सामग्री स्क्रिप्ट को एक पृष्ठ में इंजेक्ट करने की आवश्यकता होती है, और पृष्ठ पहले से ही लोड होता है, सामग्री स्क्रिप्ट करता है पृष्ठ में इंजेक्ट नहीं किया जाता है, पृष्ठ को पुनः लोड किया जाना है)। ख) प्लगइन का संस्करण संख्या प्राप्त करना पृष्ठभूमि स्क्रिप्ट से किया जा सकता है, हालांकि पृष्ठभूमि स्क्रिप्ट स्थानीय सामग्री तक नहीं पहुंच सकती है, केवल सामग्री स्क्रिप्ट कर सकती है, जो अभी तक लोड नहीं हुई है ...
विक्टर एस

3
यह पोस्ट बहुत अच्छी है ... आपको इसे उत्तर के रूप में चिह्नित करना चाहिए। धन्यवाद मोहम्मद!
frenetix

3
@VictorS को पृष्ठभूमि पृष्ठ के भीतर उपयोग करने का इरादा है, यदि आपकी सामग्री सामग्री स्क्रिप्ट में इसका उपयोग करने की योजना है, तो बस chrome.app.getDetails () संस्करण को सीधे कॉल करें। इस कारण से मुझे पहले मिला था क्योंकि क्रोम एक्सटेंशन डेवलपमेंट के शुरुआती दिनों में, chrome.app ऑब्जेक्ट नहीं था, इसलिए हमें एक्सएचआर को प्रकट करना पड़ा। आप यह सब एक क्लोजर में कर सकते हैं ताकि आप अपने कॉलिंग को सही विधि की गारंटी दे सकें। मैं आमतौर पर एक क्लास ऑब्जेक्ट में सब कुछ एनकैप्सुलेट करता हूं।
मोहम्मद मंसूर

1
महान, यह मेरे लिए काम किया। ध्यान दें कि उपरोक्त कोड एक अर्धविराम याद कर रहा है, और "अपरिभाषित" में उद्धरण नहीं होना चाहिए।
मपिसोट

@mpoisot कहने के लिए क्षमा करें, आप "अपरिभाषित" के बारे में गलत हैं। (मुझे पता है कि मुझे इस पार्टी में बहुत देर हो चुकी है, लेकिन यह दूसरों के लिए महत्वपूर्ण हो सकता है जो अपने आप को इस तरह से ठोकर खाते हैं।) वह जांचने की कोशिश नहीं कर रहा है prevVersion == 'undefined'... वह जाँच कर रहा है typeof prevVersion == 'undefined'। यह typeofजाँचने के लिए अधिक मजबूत है कि अगर कोई चर अपरिभाषित है तो जाँच करें ... जानने के लिए यहाँ देखें: stackoverflow.com/a/3550319/130691
JMTyler

20

सौभाग्य से, अब इसके लिए इवेंट हैं (चूंकि क्रोम संस्करण 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, तो एक्सटेंशन में है अद्यतन किया गया।


कंटेंट स्क्रिप्ट में ऐसा नहीं करने के लिए सावधान। लोकलस्टोरेज को पेज पर अन्य कोड और एक्सटेंशन के साथ साझा किया जाता है। तो यह एक सामग्री स्क्रिप्ट में काम नहीं करेगा।
1

पैकेज्ड एप्स के लिए, यह वास्तव में बैकग्राउंड पेजों में उपयोग के लिए एक निश्चित एप्लिकेशन के रूप में एक पैकेज्ड एप्स है localStorageजो वास्तव में अपनी अलग विंडो में है और पेज पर अन्य कोड और एक्सटेंशन के साथ साझा नहीं किया गया जैसा @huyz ने उल्लेख किया है। एक्सटेंशन के लिए, हालांकि, ऐसा नहीं है।
realkstrawn93

1
इसके लिए भंडारण की अनुमति की आवश्यकता होती है।
पचेरियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.