メインコンテンツへ飛ぶ

アプリケーションの更新

Electron アプリケーションを更新する方法はいくつかあります。 最も簡単で、公式にサポートされているものは、組み込みの Squirrel フレームワークと Electron の autoUpdater モジュールの利用です。

update.electronjs.orgの使用

Electron チームは update.electronjs.org をメンテナンスしています。これは、Electron を自己更新するためのオープンソースウェブサービスです。 このサービスは次の条件を満すElectronアプリ用に設計されています。

  • macOSまたはWindowsで動作するアプリである。
  • アプリはGitHubのパブリックなリポジトリである。
  • ビルド成果物は、GitHub Releases で提供する。
  • ビルド成果物はコード署名されています。

このサービスを使う最も簡単な方法はupdate-electron-appをインストールすることで、update.electronjs.orgをつかって、事前調整されたNode.js モジュールを使う方法です。

モジュールのインストール

npm install update-electron-app

あなたのmain processファイルからこのupdaterを起動します。

require('update-electron-app')()

デフォルト設定で、このモジュールはアプリの起動時に更新をチェックします。または10分毎にチェックします。 アップデートがみつかったとき、自動的にバックグラウンドでダウンロードします。 そのダウンロードが完了したとき、ダイアログを表示してユーザーにアプリの再起動許可を取ります。

設定をカスタマイズしたい場合、update-electron-appにオプションを渡すか、またはアップデートサービスを直接使用ができます。

アップロードサーバーを配備

プライベートの Electron アプリケーションを開発している場合、または GitHub リリースにリリースを公開していない場合は、独自のアップデートサーバーを実行する必要があるかもしれません。

ニーズに応じて、次のいずれかから選択できます。

  • HazelVercel 上に無料デプロイできる、非公開またはオープンソースのアプリのための更新サーバーです。 それは GitHub Releases から引き出され、GitHub の CDN の力を活用します。
  • NutsGitHub Releases も使用しますが、アプリの更新をディスクにキャッシュし、プライベートリポジトリをサポートします。
  • electron-release-server – リリースを処理するためのダッシュボードを提供します。リリースを GitHub で作成する必要はありません。
  • Nucleus – Atlassian がメンテナンスしている Electron アプリのための完全なアップデートサーバー。 複数のアプリケーションとチャンネルをサポートします。サーバーのコストを最小限に抑えるために静的ファイルストアを使用します。

アプリケーションでの更新の実装

アップデートサーバをデプロイしたら、コードに必要なモジュールをインポートします。 次のコードはサーバソフトウェアによって異なる場合がありますが、Hazel を使用したときの説明のように機能します。

重要: 以下のコードは、開発中ではなく、パッケージ化されたアプリでのみ実行されるようにしてください。 electron-is-dev を使って環境をチェックすることができます。

const { app, autoUpdater, dialog } = require('electron')

次に、アップデートサーバーの URL を作成し、それについて autoUpdater に伝えます。

const server = 'https://your-deployment-url.com'
const url = `${server}/update/${process.platform}/${app.getVersion()}`

autoUpdater.setFeedURL({ url })

最後のステップとして、更新を確認します。 以下の例では、毎分確認します。

setInterval(() => {
autoUpdater.checkForUpdates()
}, 60000)

アプリケーションがパッケージ化されると、公開した新しい GitHub Release ごとにアップデートが届きます。

アップデートの適用

アプリケーションの基本的な更新メカニズムを設定したので、更新があるとユーザに通知されるようにする必要があります。 これは autoUpdater API events を使用して実現できます。

autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: 'info',
buttons: ['Restart', 'Later'],
title: 'Application Update',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail: 'A new version has been downloaded. Restart the application to apply the updates.'
}

dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
})

エラーが 処理されている ことも確認してください。 これは stderr にログを出力するための例です。

autoUpdater.on('error', message => {
console.error('There was a problem updating the application')
console.error(message)
})

更新を手動でハンドリング

自動更新によるリクエストは直接管理されていないため、対応が難しい状況が発生することがあります (更新サーバーが認証下にある場合など)。 url フィールドはファイルをサポートしていますので、工夫次第でサーバーとの通信を回避できます。 こちらにその動作例があります