2010-03-08 24 views
80

Làm cách nào để tiện ích mở rộng phát hiện thấy tiện ích mở rộng đang được chạy lần đầu tiên hoặc vừa đượ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ài đặt cập nhật)Phát hiện tiện ích mở rộng Chrome lần đầu tiên chạy/cập nhật

+0

chuyển sang superuser.com –

+25

không nhất thiết. tôi nghĩ rằng nó có thể là một câu hỏi lập trình nếu rack1 đang viết phần mở rộng chrome. –

+0

lý do tại sao bạn không chọn cái này? http://stackoverflow.com/a/14957674/4548520 nó là đúng anwser - sự kiện chính thức cho phần mở rộng đầu tiên cài đặt – user25

Trả lời

9

Đơn giản. Khi tiện ích mở rộng đầu tiên chạy, số localStorage trống. Trong lần chạy đầu tiên, bạn có thể viết cờ ở đó để đánh dấu tất cả các lần chạy do hậu quả là không phải đầ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!'); 

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

+0

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à phần 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

+0

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

+0

** Điều này yêu cầu giấy phép lưu trữ. ** – Pacerier

64

Nếu bạn muốn kiểm tra nếu phần mở rộng đã được cài đặt hoặc cập nhật, bạn có thể làm một cái gì đó như thế này:

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

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

+3

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

+3

@VictorS ở trên được dự định sẽ được sử dụng trong trang nền, nếu bạn định sử dụng điều 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à bởi vì trong những ngày đầu phát triển Chrome Extension, không có đối tượng chrome.app, vì vậy chúng tôi đã phải XHR biểu hiện. Bạn có thể làm tất cả điều này trong một đóng cửa để bạn có thể đảm bảo bạn gọi đúng phương pháp. Tôi thường đóng gói mọi thứ trong một đối tượng lớp. –

139

Trong các phiên bản mới hơn của Chrome (kể từ khi Chrome 22), bạn có thể sử dụng các sự kiện chrome.runtime.onInstalled, đó là sạch hơn nhiều.

Ví 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 bạ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 extension trong localStorage cho đến khi cuối cùng tôi tìm được câu trả lời này, tất nhiên 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ì đó tích hợp cho điều này! Tôi rất vui vì tôi đã không bị bỏ rơi :) – 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. Tuy nhiên, những gì nó không làm là phát hiện ra sự kiện đầu tiên của sự kiện chrome.app.runtime.onLaunched ... –

14

May mắn thay, hiện nay có events cho điều này (kể từ khi Chrome phiên bản 22 và 25 để cập nhật sự kiện).

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

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

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

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

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

Bị sa thải khi có bản cập nhật có sẵn, 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 sau khi trang nền được tải xuống, nếu bạn muốn cài đặt nó sớm hơn, bạn có thể gọi chrome.runtime.reload() một cách rõ ràng.

Các vấn đề liên quan