Electron 更新应用程序

2023-02-16 17:16 更新

有若干种方法可以自动更新您的 Electron 应用程序。 最简单并且获得官方支持的方法是利用内置的 Squirrel 框架和Electron的​autoUpdater​模块。

使用 update.electronjs.org

Electron 团队维护 update.electronjs.org,一个免费开源的网络服务,可以让 Electron 应用使用自动更新。 这个服务是设计给那些满足以下标准的 Electron 应用:

  • 应用运行在 macOS 或者 Windows
  • 应用有公开的 GitHub 仓库
  • 构建需要发布到 GitHub Releases 中
  • 构建是经过代码签名

使用这个服务最简单的方法是安装 update-electron-app,一个预配置好的 Node.js 模块来使用 update.electronjs.org。

使用您选择的 Node.js 包管理器安装模块:

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

然后,从应用的主进程文件中调用更新模块:

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

默认情况下,这个模块会在应用启动的时候检查更新,然后每隔十分钟再检查一次。 当发现了一个更新,它会自动在后台下载。 当下载完成后,会显示对话框允许用户重启应用。

如果您需要自定义配置,您可以将选项传递给 update-electron-app 或直接使用更新服务。

使用其他更新服务

如果你开发的是一个私有的 Electron 应用程序,或者你没有在 GitHub Releases 中公开发布,你可能需要运行自己的更新服务器。

第一步:部署更新服务器

根据你的需要,你可以从下方选择:

  • Hazel——用于私人或开源应用的更新服务器,可在 Vercel 上免费部署。 它从GitHub Releases中拉取更新文件,并且利用 GitHub CDN 的强大性能。
  • Nuts-同样使用GitHub Releases, 但得在磁盘上缓存应用程序更新并支持私有存储库.
  • electron-release-server – 提供一个用于处理发布的仪表板,并且不需要在GitHub上发布发布。
  • Nucleus – 一个由Atlassian维护的 Electron 应用程序的完整更新服务器。 支持多种应用程序和渠道; 使用静态文件存储来降低服务器成本.

部署更新服务器后,您可以检测应用程序代码以使用 Electron 的 autoUpdater 模块接收和应用更新。

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

首先,在您的主流程代码中导入所需的模块。以下代码可能因不同的服务器软件而异,但它的工作方式与使用 Hazel 时描述的一样。

注意检查执行环境!

请确保以下代码仅在打包的应用程序执行,而不是在开发环境中。 您可以使用 ​app.isPackaged​ API 来检查环境。

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​后, 它将接收你每次发布在 GitHub Release 上的的更新。

第三步:当更新可用时通知用户

现在您已经为应用程序配置了基本的更新机制, 您需要确保在更新时通知用户. 这可以使用 autoUpdater API 事件实现:

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 发出的请求不受您的直接控制,您可能会发现难以处理的情况(例如,如果更新服务器在身份验证之后)。 url 字段支持 file:// 协议,这意味着通过一些努力,您可以通过从本地目录加载更新来避开该过程的服务器通信方面。这是一个如何工作的例子


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号