跳至主要內容

更新應用程式

有幾種方式可以為您的 Electron 應用程式提供自動更新。最簡單且官方支援的方式是利用內建的 Squirrel 框架和 Electron 的 autoUpdater 模組。

使用雲端物件儲存 (無伺服器)

對於簡單的無伺服器更新流程,Electron 的 autoUpdater 模組可以透過指向包含最新發佈版本中繼資料的靜態儲存 URL 來檢查是否有可用的更新。

當有新的發佈版本可用時,此中繼資料需要與發佈版本本身一起發佈到雲端儲存空間。中繼資料格式對於 macOS 和 Windows 來說有所不同。

發佈發佈版本中繼資料

使用 Electron Forge,您可以透過使用 macUpdateManifestBaseUrl 從 ZIP Maker (macOS) 和使用 remoteReleases 的 Squirrel.Windows Maker (Windows) 發佈中繼資料工件來設定靜態檔案儲存更新。

請參閱 Forge 的 從 S3 自動更新 指南,以取得端對端範例。

手動發佈

在 macOS 上,Squirrel.Mac 可以透過讀取具有以下 JSON 格式的 releases.json 檔案來接收更新

releases.json
{
"currentRelease": "1.2.3",
"releases": [
{
"version": "1.2.1",
"updateTo": {
"version": "1.2.1",
"pub_date": "2023-09-18T12:29:53+01:00",
"notes": "Theses are some release notes innit",
"name": "1.2.1",
"url": "https://mycompany.example.com/myapp/releases/myrelease"
}
},
{
"version": "1.2.3",
"updateTo": {
"version": "1.2.3",
"pub_date": "2024-09-18T12:29:53+01:00",
"notes": "Theses are some more release notes innit",
"name": "1.2.3",
"url": "https://mycompany.example.com/myapp/releases/myrelease3"
}
}
]
}

在 Windows 上,Squirrel.Windows 可以透過讀取在建置過程中產生的 RELEASES 檔案來接收更新。此檔案詳細說明要更新到的 .nupkg delta 套件。

RELEASES
B0892F3C7AC91D72A6271FF36905FEF8FE993520 electron-fiddle-0.36.3-full.nupkg 103298365

這些檔案應與您的發佈版本位於同一目錄中,且位於了解您應用程式平台和架構的資料夾結構下。

例如

my-app-updates/
├─ darwin/
│ ├─ x64/
│ │ ├─ my-app-1.0.0-darwin-x64.zip
│ │ ├─ my-app-1.1.0-darwin-x64.zip
│ │ ├─ RELEASES.json
│ ├─ arm64/
│ │ ├─ my-app-1.0.0-darwin-arm64.zip
│ │ ├─ my-app-1.1.0-darwin-arm64.zip
│ │ ├─ RELEASES.json
├─ win32/
│ ├─ x64/
│ │ ├─ my-app-1.0.0-win32-x64.exe
│ │ ├─ my-app-1.0.0-win32-x64.nupkg
│ │ ├─ my-app-1.1.0-win32-x64.exe
│ │ ├─ my-app-1.1.0-win32-x64.nupkg
│ │ ├─ RELEASES

讀取發佈版本中繼資料

最簡單的使用中繼資料方式是安裝 update-electron-app,這是一個插入式 Node.js 模組,用於設定 autoUpdater 並使用原生對話方塊提示使用者。

對於靜態儲存更新,請將 updateSource.baseUrl 參數指向包含您的發佈版本中繼資料檔案的目錄。

main.js
const { updateElectronApp, UpdateSourceType } = require('update-electron-app')

updateElectronApp({
updateSource: {
type: UpdateSourceType.StaticStorage,
baseUrl: `https://my-bucket.s3.amazonaws.com/my-app-updates/${process.platform}/${process.arch}`
}
})

使用 update.electronjs.org

Electron 團隊維護 update.electronjs.org,這是一項免費且開源的網路服務,Electron 應用程式可以使用它來進行自我更新。此服務專為符合以下條件的 Electron 應用程式設計

  • 應用程式在 macOS 或 Windows 上執行
  • 應用程式具有公開的 GitHub 儲存庫
  • 建置發佈到 GitHub 發佈
  • 建置已進行 程式碼簽署 (僅限 macOS)

使用此服務最簡單的方式是安裝 update-electron-app,這是一個預先設定為與 update.electronjs.org 一起使用的 Node.js 模組。

使用您選擇的 Node.js 套件管理器安裝模組

npm install update-electron-app

然後,從您應用程式的主要程序檔案中呼叫更新程式

main.js
require('update-electron-app')()

預設情況下,此模組會在應用程式啟動時檢查更新,然後每十分鐘檢查一次。當找到更新時,它將自動在背景中下載。當下載完成時,會顯示一個對話方塊,允許使用者重新啟動應用程式。

如果您需要自訂您的設定,您可以 將選項傳遞給 update-electron-app直接使用更新服務

使用其他更新服務

如果您正在開發私有的 Electron 應用程式,或者您沒有將發佈版本發佈到 GitHub 發佈,則可能需要執行自己的更新伺服器。

步驟 1:部署更新伺服器

根據您的需求,您可以從以下選項中選擇一個

  • Hazel – 適用於私有或開源應用程式的更新伺服器,可以在 Vercel 上免費部署。它從 GitHub 發佈 中提取,並利用 GitHub CDN 的強大功能。
  • Nuts – 也使用 GitHub 發佈,但在磁碟上快取應用程式更新,並支援私有儲存庫。
  • electron-release-server – 提供用於處理發佈版本的儀表板,並且不要求發佈版本起源於 GitHub。
  • Nucleus – 由 Atlassian 維護的 Electron 應用程式完整更新伺服器。支援多個應用程式和通道;使用靜態檔案儲存來降低伺服器成本。

部署更新伺服器後,您可以使用 Electron 的 autoUpdater 模組來檢測您的應用程式程式碼,以接收和套用更新。

步驟 2:在您的應用程式中接收更新

首先,在您的主要程序程式碼中匯入所需的模組。以下程式碼可能會因不同的伺服器軟體而有所不同,但它會像使用 Hazel 時所描述的那樣運作。

檢查您的執行環境!

請確保以下程式碼只會在您封裝的應用程式中執行,而不會在開發中執行。您可以使用 app.isPackaged API 來檢查環境。

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

接下來,建構更新伺服器饋送的 URL,並告知 autoUpdater 這件事

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

autoUpdater.setFeedURL({ url })

最後一步,檢查更新。以下範例將每分鐘檢查一次

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

一旦您的應用程式被 封裝,它將接收您發佈的每個新 GitHub 發佈 的更新。

步驟 3:當有可用的更新時通知使用者

現在您已經為您的應用程式設定了基本的更新機制,您需要確保使用者在有更新時會收到通知。這可以使用 autoUpdater API 事件 來實現

main.js
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 的範例

main.js
autoUpdater.on('error', (message) => {
console.error('There was a problem updating the application')
console.error(message)
})
手動處理更新

由於 autoUpdate 發出的請求不在您的直接控制之下,您可能會發現難以處理的情況(例如,如果更新伺服器位於驗證後面)。url 欄位支援 file:// 通訊協定,這表示透過一些努力,您可以透過從本機目錄載入更新來繞過該程序的伺服器通訊方面。以下是如何運作的範例

更新伺服器規格

對於進階部署需求,您也可以推出自己的 Squirrel 相容更新伺服器。例如,您可能想要進行基於百分比的推出、透過單獨的發佈通道發佈您的應用程式,或將您的更新伺服器置於驗證檢查之後。

Squirrel.Windows 和 Squirrel.Mac 用戶端需要不同的回應格式,但您可以透過根據 process.platform 的值將請求傳送到不同的端點,對這兩個平台使用單一伺服器。

main.js
const { app, autoUpdater } = require('electron')

const server = 'https://your-deployment-url.com'
// e.g. for Windows and app version 1.2.3
// https://your-deployment-url.com/update/win32/1.2.3
const url = `${server}/update/${process.platform}/${app.getVersion()}`

autoUpdater.setFeedURL({ url })

Windows

Squirrel.Windows 用戶端期望更新伺服器在您端點的 /RELEASES 子路徑傳回最新可用建置的 RELEASES 工件。

例如,如果您的饋送 URL 為 https://your-deployment-url.com/update/win32/1.2.3,則 https://your-deployment-url.com/update/win32/1.2.3/RELEASES 端點應傳回您想要提供之版本的 RELEASES 工件內容。

https://your-deployment-url.com/update/win32/1.2.3/RELEASES
B0892F3C7AC91D72A6271FF36905FEF8FE993520 https://your-static.storage/your-app-1.2.3-full.nupkg 103298365

Squirrel.Windows 會執行比較檢查,以查看目前的應用程式是否應更新到 RELEASES 中傳回的版本,因此即使沒有可用的更新,您也應傳回回應。

macOS

當有可用的更新時,Squirrel.Mac 用戶端期望在饋送 URL 的端點收到 JSON 回應。此物件具有強制性的 url 屬性,該屬性對應至應用程式更新的 ZIP 封存檔。物件中的所有其他屬性都是可選的。

https://your-deployment-url.com/update/darwin/0.31.0
{
"url": "https://your-static.storage/your-app-1.2.3-darwin.zip",
"name": "1.2.3",
"notes": "Theses are some release notes innit",
"pub_date": "2024-09-18T12:29:53+01:00"
}

如果沒有可用的更新,伺服器應返回 204 No Content HTTP 回應。