Electron 更新應用程序

2023-02-16 17:16 更新

有若干種方法可以自動更新您的 Electron 應用程序。 最簡單并且獲得官方支持的方法是利用內(nèi)置的 Squirrel 框架和Electron的?autoUpdater?模塊。

使用 update.electronjs.org

Electron 團隊維護 update.electronjs.org,一個免費開源的網(wǎng)絡服務,可以讓 Electron 應用使用自動更新。 這個服務是設計給那些滿足以下標準的 Electron 應用:

  • 應用運行在 macOS 或者 Windows
  • 應用有公開的 GitHub 倉庫
  • 構建需要發(fā)布到 GitHub Releases 中
  • 構建是經(jīng)過代碼簽名

使用這個服務最簡單的方法是安裝 update-electron-app,一個預配置好的 Node.js 模塊來使用 update.electronjs.org。

使用您選擇的 Node.js 包管理器安裝模塊:

 npm Yarn 
npm install update-electron-app
yarn add update-electron-app

然后,從應用的主進程文件中調(diào)用更新模塊:

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

默認情況下,這個模塊會在應用啟動的時候檢查更新,然后每隔十分鐘再檢查一次。 當發(fā)現(xiàn)了一個更新,它會自動在后臺下載。 當下載完成后,會顯示對話框允許用戶重啟應用。

如果您需要自定義配置,您可以將選項傳遞給 update-electron-app 或直接使用更新服務。

使用其他更新服務?

如果你開發(fā)的是一個私有的 Electron 應用程序,或者你沒有在 GitHub Releases 中公開發(fā)布,你可能需要運行自己的更新服務器。

第一步:部署更新服務器?

根據(jù)你的需要,你可以從下方選擇:

  • Hazel——用于私人或開源應用的更新服務器,可在 Vercel 上免費部署。 它從GitHub Releases中拉取更新文件,并且利用 GitHub CDN 的強大性能。
  • Nuts-同樣使用GitHub Releases, 但得在磁盤上緩存應用程序更新并支持私有存儲庫.
  • electron-release-server – 提供一個用于處理發(fā)布的儀表板,并且不需要在GitHub上發(fā)布發(fā)布。
  • Nucleus – 一個由Atlassian維護的 Electron 應用程序的完整更新服務器。 支持多種應用程序和渠道; 使用靜態(tài)文件存儲來降低服務器成本.

部署更新服務器后,您可以檢測應用程序代碼以使用 Electron 的 autoUpdater 模塊接收和應用更新。

第二步:在你的應用程序上接收更新

首先,在您的主流程代碼中導入所需的模塊。以下代碼可能因不同的服務器軟件而異,但它的工作方式與使用 Hazel 時描述的一樣。

注意檢查執(zhí)行環(huán)境!

請確保以下代碼僅在打包的應用程序執(zhí)行,而不是在開發(fā)環(huán)境中。 您可以使用 ?app.isPackaged? API 來檢查環(huán)境。

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)

應用程序被?packaged?后, 它將接收你每次發(fā)布在 GitHub Release 上的的更新。

第三步:當更新可用時通知用戶

現(xiàn)在您已經(jīng)為應用程序配置了基本的更新機制, 您需要確保在更新時通知用戶. 這可以使用 autoUpdater API 事件實現(xiàn):

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

手動處理更新

由于 autoUpdate 發(fā)出的請求不受您的直接控制,您可能會發(fā)現(xiàn)難以處理的情況(例如,如果更新服務器在身份驗證之后)。 url 字段支持 file:// 協(xié)議,這意味著通過一些努力,您可以通過從本地目錄加載更新來避開該過程的服務器通信方面。這是一個如何工作的例子。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號