Chrome 확장 프로그램 첫 실행 / 업데이트 감지


답변:


174

최신 버전의 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에 저장하는 것뿐입니다. 물론 실행 가능한 솔루션 이었지만 크롬에 내장 된 것이 없다는 것에 너무 놀랐습니다! 실망하지 않아서 너무 기뻐요 :)
JMTyler

2
Chrome 22 이후, 2012 년 9 월 출시
Redzarf 2013

1
chrome.runtime.onInstalled는 앱 또는 확장 프로그램이 백그라운드에 설치되는시기를 감지합니다. 이하지 않는 무엇, 그러나, chrome.app.runtime.onLaunched 이벤트의 첫 번째 발사를 탐지입니다 ...
realkstrawn93

3
이 코드를 잠시 사용했는데 내 확장 프로그램이 업데이트에 대한 새 권한을 요청할 때까지 (사용자가 권한을 수락 할 때까지 확장 프로그램을 일시 중단 할 때까지) 훌륭하게 작동했습니다. 권한이 승인되고 확장 프로그램이 일시 중단되지 않았을 때 onInstalled 이벤트가 발생하지 않았으므로 업데이트 스크립트가 실행되지 않았습니다. onInstalled에서 업데이트 스크립트를 실행하는 사람들은 새로운 권한을 요청한 상황에서 다른 이벤트를 수신해야 할 수도 있습니다.
Elimn

2
@Elimm은 Chrome의 버그 인 것 같습니다. 버그 추적기에보고해야합니다.
Alvin Wong

72

매니페스트 v3을 반영하도록 답변을 업데이트했습니다.

Chromium에는 이제 확장 프로그램의 버전을 가져올 수 있는 chrome.runtime API 세트가 있습니다.

현재 버전을 얻으려면 :

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

Gmail의 콘텐츠 스크립트에서 getVersion ()을 실행하면 Gmail 앱 버전 번호를 얻습니다. 이 유형의 스크립트가 작동하지 못하게하는 여러 문제가 있음을 지적해야합니다. a) 페이지에 콘텐츠 스크립트를 삽입해야하는 플러그인을 설치하고 페이지가 이미로드 된 경우 콘텐츠 스크립트가 페이지에 삽입되지 않으면 페이지를 다시로드해야합니다). b) 백그라운드 스크립트에서 플러그인의 버전 번호를 가져올 수 있지만 백그라운드 스크립트는 localStorage에 액세스 할 수 없으며 아직로드되지 않은 콘텐츠 스크립트 만 액세스 할 수 있습니다.
Victor S

3
이 게시물은 훌륭합니다 ...이 게시물을 답변으로 표시해야합니다. 감사합니다 모하메드!
frenetix

3
@VictorS 위의 내용은 백그라운드 페이지 내에서 사용하기위한 것입니다. 콘텐츠 스크립트에서이를 사용하려는 경우 chrome.app.getDetails (). version을 직접 호출하면됩니다. 이전에 getVersion을 사용한 이유는 Chrome Extension 개발 초기에는 chrome.app 객체가 없었기 때문에 매니페스트를 XHR해야했기 때문입니다. 이 모든 것을 클로저에서 수행 할 수 있으므로 올바른 메서드를 호출 할 수 있습니다. 나는 일반적으로 모든 것을 클래스 객체에 캡슐화합니다.
Mohamed Mansour 2012

1
좋습니다. 이것은 나를 위해 일했습니다. 위 코드에는 세미콜론이 누락되어 있으며 "정의되지 않음"에는 따옴표가 없어야합니다.
mpoisot 2010 년

@mpoisot 죄송합니다. "정의되지 않음"이 잘못되었습니다. (나는 내가이 파티에 매우 늦었다는 것을 알고 있지만 이것은 저와 같이 여기에서 우연히 발견되는 다른 사람들에게 중요 할 수 있습니다.) 그는 확인하려고 하지 않습니다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매니페스트를 통해 가져옴)이에 저장된 버전 과 같지 않으면 localStorage확장에 업데이트되었습니다.


콘텐츠 스크립트에서 그렇게하지 않도록주의하십시오. localStorage는 페이지의 다른 코드 및 확장과 공유됩니다. 따라서 이것은 콘텐츠 스크립트에서 작동하지 않습니다.
huyz

패키징 된 앱의 경우, 패키징 된 앱 localStorage은 실제로 별도의 창에 있고 @huyz가 언급 한대로 페이지의 다른 코드 및 확장과 공유되지 않기 때문에 실제로 백그라운드 페이지에서 사용하기위한 확실한 솔루션입니다 . 그러나 확장의 경우에는 그렇지 않습니다.
realkstrawn93 2014 년

1
그래도 저장 권한이 필요합니다.
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.