Chrome拡張機能の最初の実行/更新を検出する


96

拡張機能が特定のアクションを実行できるように、拡張機能が初めて実行された、または更新されたばかりであることをどのように確認できますか?(例:ヘルプページを開く、または設定を更新する)


なぜこれを選ばなかったのですか?stackoverflow.com/a/14957674/4548520それは正しいanwser-最初の拡張機能のインストールの公式イベント
user25

回答:


173

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 2013

2
クローム22以来、2012年9月にリリース
Redzarf

1
chrome.runtime.onInstalledは、アプリまたは拡張機能がバックグラウンドでインストールされたことを検出します。ただし、この機能では、chrome.app.runtime.onLaunchedイベントの最初の起動を検出しません...
realkstrawn93 '26

3
私はこのコードをしばらく使用しましたが、私の拡張機能が更新に対する新しい権限を要求するまで、それはうまくいきました(ユーザーが許可を受け入れるまで拡張機能を一時停止します)。権限が受け入れられ、拡張機能の中断が解除されたとき、onInstalledイベントは発生しなかったため、更新スクリプトは実行されませんでした。onInstalledで更新スクリプトを実行する人たちに言及する価値があることですが、新しい権限を要求した場合は、別のイベントをリッスンする必要があるかもしれません。
Elimn 2014

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

GmailのコンテンツスクリプトでgetVersion()を実行すると、Gmailアプリのバージョン番号がわかります。このタイプのスクリプトが機能しない原因となるいくつかの問題があることを指摘しておきます。a)コンテンツスクリプトをページに挿入する必要があるプラグインをインストールし、ページがすでにロードされている場合、コンテンツスクリプトはページに挿入されないため、ページをリロードする必要があります)。b)プラグインのバージョン番号の取得はバックグラウンドスクリプトから実行できますが、バックグラウンドスクリプトはlocalStorageにアクセスできず、コンテンツスクリプトのみがアクセスできますが、まだロードされていません...
Victor S

3
この投稿は素晴らしいです...これを回答としてマークする必要があります。モハメドありがとう!
frenetix

3
上記の@VictorSは、バックグラウンドページ内で使用するためのものです。コンテンツスクリプトでこれを使用する場合は、chrome.app.getDetails()。versionを直接呼び出してください。以前にgetVersionを実行した理由は、Chrome拡張機能の開発の初期の段階ではchrome.appオブジェクトがなかったため、マニフェストをXHRする必要があったためです。このすべてをクロージャで実行できるため、正しいメソッドの呼び出しを保証できます。通常、すべてをクラスオブジェクトにカプセル化します。
Mohamed Mansour

1
これでうまくいきました。上記のコードにはセミコロンがないため、「undefined」には引用符を含めないでください。
mpoisot 2012年

@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
ただし、これにはストレージ権限が必要です。
パチェリエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.