Electron 更新應(yīng)用程序

2023-02-16 17:16 更新

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

使用 update.electronjs.org

Electron 團(tuán)隊(duì)維護(hù) update.electronjs.org,一個(gè)免費(fèi)開(kāi)源的網(wǎng)絡(luò)服務(wù),可以讓 Electron 應(yīng)用使用自動(dòng)更新。 這個(gè)服務(wù)是設(shè)計(jì)給那些滿足以下標(biāo)準(zhǔn)的 Electron 應(yīng)用:

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

使用這個(gè)服務(wù)最簡(jiǎn)單的方法是安裝 update-electron-app,一個(gè)預(yù)配置好的 Node.js 模塊來(lái)使用 update.electronjs.org。

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

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

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

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

默認(rèn)情況下,這個(gè)模塊會(huì)在應(yīng)用啟動(dòng)的時(shí)候檢查更新,然后每隔十分鐘再檢查一次。 當(dāng)發(fā)現(xiàn)了一個(gè)更新,它會(huì)自動(dòng)在后臺(tái)下載。 當(dāng)下載完成后,會(huì)顯示對(duì)話框允許用戶重啟應(yīng)用。

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

使用其他更新服務(wù)?

如果你開(kāi)發(fā)的是一個(gè)私有的 Electron 應(yīng)用程序,或者你沒(méi)有在 GitHub Releases 中公開(kāi)發(fā)布,你可能需要運(yùn)行自己的更新服務(wù)器。

第一步:部署更新服務(wù)器?

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

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

部署更新服務(wù)器后,您可以檢測(cè)應(yīng)用程序代碼以使用 Electron 的 autoUpdater 模塊接收和應(yīng)用更新。

第二步:在你的應(yīng)用程序上接收更新

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

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

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

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

接下來(lái),構(gòu)建更新服務(wù)器的 URL 并通知 ?autoUpdater?:

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

autoUpdater.setFeedURL({ url })

最后一步,檢查更新。 下面的示例將在每分鐘檢查一次:

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

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

第三步:當(dāng)更新可用時(shí)通知用戶

現(xiàn)在您已經(jīng)為應(yīng)用程序配置了基本的更新機(jī)制, 您需要確保在更新時(shí)通知用戶. 這可以使用 autoUpdater API 事件實(shí)現(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()
  })
})

另外,也請(qǐng)確認(rèn)錯(cuò)誤被處理。 下面是將錯(cuò)誤日志輸出到stderr的例子。

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

手動(dòng)處理更新

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)