ตรวจหาส่วนขยาย Chrome เรียกใช้ / อัปเดตครั้งแรก


99

ส่วนขยายจะทราบได้อย่างไรว่ามีการเรียกใช้เป็นครั้งแรกหรือเพิ่งได้รับการอัปเดตเพื่อให้ส่วนขยายสามารถดำเนินการบางอย่างได้ (เช่นเปิดหน้าช่วยเหลือหรืออัปเดตการตั้งค่า)


ทำไมคุณไม่เลือกอันนี้ stackoverflow.com/a/14957674/4548520มันถูกต้อง anwser - เหตุการณ์อย่างเป็นทางการสำหรับการติดตั้งส่วนขยายครั้งแรก
25

คำตอบ:


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 เปิดตัวในเดือนกันยายน 2555
Redzarf

1
chrome.runtime.onInstalled ตรวจพบเมื่อติดตั้งแอปหรือส่วนขยายในพื้นหลัง อย่างไรก็ตามสิ่งที่ไม่ทำคือตรวจจับการยิงครั้งแรกของ chrome.app.runtime.on เหตุการณ์ที่เปิดตัว ...
realkstrawn93

3
ฉันใช้รหัสนี้มาระยะหนึ่งแล้วและใช้ได้ดีจนกระทั่งส่วนขยายของฉันขออนุญาตใหม่ในการอัปเดต (ซึ่งจะระงับส่วนขยายจนกว่าผู้ใช้จะยอมรับการอนุญาต) เมื่อยอมรับการอนุญาตและยกเลิกการระงับส่วนขยายเหตุการณ์ onInstalled จะไม่เริ่มทำงานดังนั้นสคริปต์การอัปเดตจะไม่ทำงาน สิ่งที่ควรค่าแก่การกล่าวถึงสำหรับผู้ที่เรียกใช้สคริปต์การอัปเดตบนติดตั้งคุณอาจต้องฟังเหตุการณ์อื่นในสถานการณ์ที่คุณได้ขออนุญาตใหม่
กำจัด

2
@Elimm ดูเหมือนว่าข้อผิดพลาดของ Chrome คุณควรรายงานเกี่ยวกับตัวติดตามข้อบกพร่อง
Alvin Wong

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 ฉันควรชี้ให้เห็นว่ามีปัญหาหลายประการที่จะป้องกันไม่ให้สคริปต์ประเภทนี้ทำงาน: a) เมื่อคุณติดตั้งปลั๊กอินซึ่งจำเป็นต้องฉีดสคริปต์เนื้อหาลงในเพจและโหลดเพจแล้วสคริปต์เนื้อหาจะทำ ไม่ได้รับการฉีดเข้าไปในหน้าต้องโหลดหน้าใหม่) b) การรับหมายเลขเวอร์ชันของปลั๊กอินสามารถทำได้จากสคริปต์พื้นหลังอย่างไรก็ตามสคริปต์พื้นหลังไม่สามารถเข้าถึง localStorage ได้มีเพียงสคริปต์เนื้อหาเท่านั้นที่สามารถทำได้ซึ่งยังไม่ได้โหลด ...
Victor S

3
โพสต์นี้ดีมาก ... คุณควรทำเครื่องหมายว่านี่เป็นคำตอบ ขอบคุณโมฮาเหม็ด!
frenetix

3
@VictorS ข้างต้นมีไว้เพื่อใช้ในหน้าพื้นหลังหากคุณวางแผนที่จะใช้สิ่งนี้ในสคริปต์เนื้อหาให้โทรหา chrome.app.getDetails () เวอร์ชันโดยตรง สาเหตุที่ฉันใช้ getVersion มาก่อนก็เพราะว่าในช่วงแรก ๆ ของการพัฒนา Chrome Extension ไม่มีวัตถุ chrome.app ดังนั้นเราจึงต้อง XHR ไฟล์ Manifest คุณสามารถทำได้ทั้งหมดนี้ในการปิดเพื่อให้คุณสามารถรับประกันการโทรของคุณถูกวิธี ฉันมักจะห่อหุ้มทุกอย่างไว้ในคลาสออบเจ็กต์
Mohamed Mansour

1
เยี่ยมมากสิ่งนี้ได้ผลสำหรับฉัน โปรดทราบว่าโค้ดด้านบนไม่มีเครื่องหมายอัฒภาคและ "ไม่ได้กำหนด" ไม่ควรมีเครื่องหมายคำพูด
mpoisot

@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 () ได้อย่างชัดเจน


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การติดตั้งไฟล์ Manifest) ไม่เท่ากับlocalStorageส่วนขยายที่เก็บไว้ส่วนขยายจะมี ได้รับการปรับปรุง


ระวังอย่าทำเช่นนั้นในสคริปต์เนื้อหา localStorage ใช้ร่วมกับโค้ดและส่วนขยายอื่น ๆ บนเพจ ดังนั้นสิ่งนี้จะไม่ทำงานในสคริปต์เนื้อหา
huyz

สำหรับแอพที่เป็นแพ็กเกจนี่เป็นวิธีแก้ปัญหาที่แน่นอนสำหรับการใช้งานในหน้าพื้นหลังเนื่องจากแอพที่รวมlocalStorageอยู่ในหน้าต่างแยกต่างหากและไม่ได้แชร์กับโค้ดและส่วนขยายอื่น ๆ บนเพจดังที่ @huyz กล่าวถึง อย่างไรก็ตามสำหรับส่วนขยายจะไม่เป็นเช่นนั้น
realkstrawn93

1
สิ่งนี้ต้องได้รับอนุญาตการจัดเก็บแม้ว่า
Pacerier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.