Phát hiện lần chạy / cập nhật tiện ích mở rộng đầu tiên của Chrome


96

Làm cách nào để tiện ích mở rộng có thể phát hiện ra rằng nó đang được chạy lần đầu tiên hoặc mới được cập nhật, để tiện ích mở rộng có thể thực hiện một số hành động cụ thể? (ví dụ: mở trang trợ giúp hoặc cập nhật cài đặt)


tại sao bạn không chọn cái này? stackoverflow.com/a/14957674/4548520 nó phù hợp anwser - sự kiện chính thức cho cài đặt tiện ích mở rộng đầu tiên
25

Câu trả lời:


173

Trong các phiên bản Chrome mới hơn (kể từ Chrome 22), bạn có thể sử dụng chrome.runtime.onInstalledsự kiện, sự kiện này gọn gàng hơn nhiều.

Thí dụ:

// 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
Cảm ơn vì điều này! Tất cả những gì tôi tìm thấy trên Internet là lưu trữ phiên bản của tiện ích mở rộng trong localStorage cho đến khi tôi tình cờ tìm ra câu trả lời này, tất nhiên đây là một giải pháp khả thi, nhưng tôi rất ngạc nhiên khi chrome không có thứ gì đó được tích hợp sẵn cho việc này! Tôi rất vui vì tôi đã không thất vọng :)
JMTyler

2
Kể từ Chrome 22, phát hành vào tháng 9 năm 2012
Redzarf

1
chrome.runtime.onInstalled phát hiện khi ứng dụng hoặc tiện ích mở rộng được cài đặt trong nền. Những gì nó không làm, tuy nhiên, là một phát hiện bắn đầu tiên của sự kiện chrome.app.runtime.onLaunched ...
realkstrawn93

3
Tôi đã sử dụng mã này một thời gian và nó hoạt động tốt, cho đến khi tiện ích mở rộng của tôi yêu cầu quyền mới đối với bản cập nhật (sẽ tạm dừng tiện ích mở rộng cho đến khi người dùng chấp nhận quyền). Khi quyền được chấp nhận và tiện ích mở rộng không bị tạm dừng, sự kiện onInstalled không bao giờ kích hoạt và do đó tập lệnh cập nhật không bao giờ chạy. Đáng nói đối với những người chạy các tập lệnh cập nhật onInstalled, bạn có thể cần phải lắng nghe một sự kiện khác trong các tình huống mà bạn đã yêu cầu một quyền mới.
Elimn

2
@Elimm có vẻ giống như lỗi của Chrome, bạn nên báo cáo trên trình theo dõi lỗi.
Alvin Wong

72

Câu trả lời được cập nhật để phản ánh v3 của tệp kê khai:

Chromium hiện có một bộ API chrome.runtime , cho phép bạn tìm nạp phiên bản của tiện ích.

Để tải phiên bản hiện tại:

chrome.runtime.getManifest().version

Để nghe khi nào tiện ích được cài đặt lần đầu, khi tiện ích được cập nhật lên phiên bản mới và khi Chromium được cập nhật lên phiên bản mới, bạn có thể sử dụng onInstalledsự kiện.

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

})

Đó là tất cả!


Câu trả lời cũ, trước năm 2011

Nếu bạn muốn kiểm tra xem tiện ích mở rộng đã được cài đặt hoặc cập nhật hay chưa, bạn có thể làm như sau:

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

Nếu tôi chạy getVersion () trong một tập lệnh nội dung trong Gmail, tôi sẽ nhận được số phiên bản ứng dụng Gmail. Tôi nên chỉ ra rằng có một số vấn đề sẽ ngăn loại tập lệnh này hoạt động: a) khi bạn cài đặt một plugin, plugin cần đưa tập lệnh nội dung vào một trang và trang đã được tải, tập lệnh nội dung không được đưa vào trang, trang phải được tải lại). b) nhận được số phiên bản của các plugin có thể được thực hiện từ kịch bản nền, tuy nhiên kịch bản nền không thể truy cập localStorage, chỉ có kịch bản nội dung có thể, mà vẫn chưa nạp ...
Victor S

3
bài đăng này rất tuyệt ... bạn nên đánh dấu bài này làm câu trả lời. Cảm ơn Mohamed!
frenetix

3
@VictorS ở trên dự định sẽ được sử dụng trong trang nền, nếu bạn định sử dụng cái này trong tập lệnh nội dung, thì chỉ cần gọi trực tiếp phiên bản chrome.app.getDetails (). Lý do tại sao tôi làm getVersion trước đây là vì trong những ngày đầu phát triển Tiện ích mở rộng Chrome, không có đối tượng chrome.app, vì vậy chúng tôi phải XHR tệp kê khai. Bạn có thể thực hiện tất cả điều này trong một lần đóng cửa để có thể đảm bảo việc gọi của bạn đúng phương pháp. Tôi thường đóng gói mọi thứ trong một đối tượng lớp.
Mohamed Mansour

1
Tuyệt vời, điều này đã làm việc cho tôi. Lưu ý rằng đoạn mã trên thiếu dấu chấm phẩy và "không xác định" không được có dấu ngoặc kép.
mpoisot

@mpoisot Xin lỗi phải nói rằng bạn đã sai về "undefined". (Tôi biết tôi đến bữa tiệc này rất muộn nhưng điều này có thể quan trọng đối với những người khác tình cờ gặp ở đây chẳng hạn như tôi.) Anh ấy không cố gắng kiểm tra prevVersion == 'undefined'... anh ấy đang kiểm tra typeof prevVersion == 'undefined'. Nó sẽ mạnh mẽ hơn nhiều để sử dụng typeofkhi kiểm tra xem một biến có không được xác định hay không ... hãy xem tại đây để tìm hiểu lý do: stackoverflow.com/a/3550319/130691
JMTyler

20

May mắn thay, hiện đã có các sự kiện cho việc này (kể từ phiên bản Chrome 22 và 25 cho các sự kiện cập nhật).

Đối với một sự kiện đã cài đặt:

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

Đối với sự kiện OnUpdateAvailable:

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

Một đoạn trích quan trọng về OnUpdateAvailable từ tài liệu dành cho nhà phát triển cho biết:

Được kích hoạt khi có bản cập nhật nhưng không được cài đặt ngay lập tức vì ứng dụng hiện đang chạy. Nếu bạn không làm gì, bản cập nhật sẽ được cài đặt vào lần tiếp theo trang nền được tải xuống, nếu bạn muốn nó được cài đặt sớm hơn, bạn có thể gọi chrome.runtime.reload () một cách rõ ràng.


9

Đơn giản. Khi phần mở rộng chạy lần đầu tiên, phần mở rộng localStoragetrống. Trong lần chạy đầu tiên, bạn có thể viết một cờ ở đó để đánh dấu tất cả các lần chạy kết quả là không phải lần đầu tiên.

Ví dụ, trong 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!');

CHỈNH SỬA: Để kiểm tra xem tiện ích mở rộng vừa được cập nhật, hãy lưu trữ phiên bản thay vì một cờ đơn giản trong lần chạy đầu tiên, sau đó khi phiên bản tiện ích mở rộng hiện tại (lấy bằng cách XmlHttpRequestnhập tệp kê khai) không bằng phiên bản được lưu trữ localStorage, tiện ích mở rộng có đã được cập nhật.


Cẩn thận không làm điều đó trong một kịch bản nội dung. localStorage được chia sẻ với các mã và tiện ích mở rộng khác trên trang. Vì vậy, điều này sẽ không hoạt động trong một kịch bản nội dung.
huyz

Đối với các ứng dụng đóng gói, đây thực sự là một giải pháp xác định để sử dụng trong các trang nền vì ứng dụng đóng gói localStoragethực sự nằm trong cửa sổ riêng biệt của nó và không được chia sẻ với mã và tiện ích mở rộng khác trên trang như @huyz đã đề cập. Đối với phần mở rộng, tuy nhiên, đây không phải là trường hợp.
realkstrawn93

1
Tuy nhiên, điều này yêu cầu quyền lưu trữ.
Pacerier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.