electron的自动更新

9,400 阅读5分钟

前言

我们在开发一款electron桌面应用中,我们希望只要我们发布了最新的版本,用户就会收到新包的更新提示。在electron自带的有autoUpdater,本次我们选择的是electron-updater这个第三方插件。先说一下electron自带的autoUpdater的缺点是没有办法控制什么时候下载(目前我看官方文档是没有这个功能,如果有欢迎指正),且不知道下载的进度;而electron-updater却有这个功能,这个功能最大的好处就是我们可以在正式环境下存在多个版本,时时监听下载进度;

electron-updater的使用说明

1、引入
$ yarn add electron-updater electron-log electron-is-dev
  • electron-updater 自动更新所需的依赖
  • electron-log可将更新的日志存放在本地
  • electron-is-dev判断electron是否为dev环境

2、electron-updater中的各个事件的说明
Event: error

当更新发生错误时触发

返回:

  • error Error
Event: checking-for-update

当开始检查更新的时候触发

​ 返回:

  • 没有返回值
Event: update-available

当检查到有可用的更新包时触发

​ 返回:

 {
     "version": "0.1.0", // 最新版本号
     "files": [{
         "url": "text Setup 0.1.0.exe", // 包的名称
         "sha512": "xxx",
         "size": 899999562, // 包的大小
     }],
     "path": "text Setup 0.1.0.exe", // 包的名称
     "sha512": "xxx",
     "relaseDate": "2019-11-07T10:26:23.286Z", // 新包发布时间
     "relaseNotes": "修复XXX", // 新包发布内容
 }
Event: update-not-available

当检测到没有可用更新时触发

​ 返回:

  • 没有返回值
Event: download-progress

监听下载进度

​ 返回:

{
    "delta":"22108084", // 差量
    "bytesPerSecond": "20243532", // 下载速度
    "percent":'73.32491979950667', // 已下载的百分比
    "total":"82879166", // 更新包的大小
    "transferred": "82879166" // 已下载的包大小
}
Event: update-downloaded

当下载完更新包后触发

​ 返回值:

  {
      "version": "0.1.0", // 最新版本号
      "files": [{
          "url": "text Setup 0.1.0.exe", // 包的名称
          "sha512": "xxx",
          "size": 899999562, // 包的大小
      }],
      "path": "text Setup 0.1.0.exe", // 包的名称
      "sha512": "xxx",
      "relaseDate": "2019-11-07T10:26:23.286Z", // 新包发布时间
      "relaseNotes": "修复XXX", // 新包发布内容
  }

方法:

autoUpdater具有以下方法

  • autoUpdater.checkForUpdates() => Promise<UpdateCheckResult>

    询问服务器是否有可用更新

  • autoUpdater.checkForUpdatesAndNotify() ⇒ Promise< | UpdateCheckResult>

    询问服务器是否有更新,下载并通知更新是否可用。

  • autoUpdater.downloadUpdate(cancellationToken) ⇒ Promise<any>

    开始手动下载更新。如果autoDownloadoption设置为,则可以使用此方法false

    返回Promise<any>-下载文件的路径。

    • cancelToken CancellationToken
  • autoUpdater.getFeedURL()⇒ undefined| null|String autoUpdater.setFeedURL(options)

    配置更新提供程序。如果value为string,则GenericServerOptions的值将设置为url

    选项PublishConfiguration| String| GithubOptions| S3Options| SpacesOptions| GenericServerOptions| BintrayOptions-如果要覆盖中的配置app-update.yml

  • autoUpdater.channel (getter和setter

    使用定义自动更新程序将要遵循的频道(请参阅使用频道进行自动更新),autoUpdater.channel = 'beta'或使用来获取当前频道currentChannel = autoUpdater.channel

  • autoUpdater.quitAndInstall(isSilent, isForceRunAfter)

    下载更新后,重新启动应用程序并安装更新。仅应在update-downloaded发出后调用它。

    注意: autoUpdater.quitAndInstall()将首先关闭所有应用程序窗口,之后才发出before-quit事件app。这与正常的退出事件序列不同。

    isSilent Boolean- 仅Windows以静默模式运行安装程序。默认为false

    isForceRunAfter- Boolean即使无提示安装也可以在完成后运行应用程序。不适用于macOS。忽略是否isSilent设置为false


API

  • autoDownload= true布尔值-发现更新后是否自动下载更新。

  • autoInstallOnAppQuit= true布尔值-是否在应用程序退出时自动安装下载的更新(如果quitAndInstall以前未调用过)。

    仅适用于Windows和Linux。

  • allowPrerelease= false布尔- *只有GitHub的供应商。*是否允许更新到预发行版本。默认为true应用程序版本是否包含预发行组件(例如0.12.1-alpha.1,此处alpha为预发行组件),否则为false

    如果为true,则允许降级(allowDowngrade将设置为true)。

  • fullChangelog= false布尔- *只有GitHub的供应商。*获取所有发行说明(从当前版本到最新版本),而不仅仅是最新版本。

  • allowDowngrade= false布尔值-是否允许版本降级(当来自Beta频道的用户想要返回稳定频道时)。

    仅当渠道不同时才考虑在内(就语义版本而言,预发行版本组件)。

  • currentVersion SemVer-当前的应用程序版本。

  • channel字符串-获取更新频道。不适用于GitHub。channel仅在先前设置的情况下,不会从更新配置中返回。

  • requestHeaders [键:字符串]:字符串-请求标头。

  • logger 日志您可以通过以下界面传递electronic-logwinston或其他日志:{ info(), warn(), error() }。如果您要禁用日志记录功能,请将其设置为null

  • signals= new UpdaterSignal(this) UpdaterSignal-为了类型安全,您可以使用信号,例如autoUpdater.signals.updateDownloaded(() => {})代替autoUpdater.on('update-available', () => {})


自动更新示例

  • package.json中的配置
{
    ....
    "build": {
    	"releaseInfo": {
          "releaseNotes": "优化我的订单、信息库、角色功能,新增退费、退费订单审核" // 更新的内容
        },
		"publish": [
          {
            "provider": "generic",
            "url": "http://127.0.0.1:8080/download/", // 推送的地址
            "channel": "latest" // 检查更新的渠道
          }
        ],
	} 
	....
}
  • 在跟目录下添加app-updater.yml 和 dev-app-updater.yml文件用作检查更新文件的配置
# 在app-update.yml中配置检查更新的地址,这个地址为正式环境下的更新地址
provider: 'generic'
url: 'http://127.0.0.1:8080/download/'
channel: 'latest'
# 在dev-app-update.yml中配置检查更新的地址,这个地址为开发环境下的地址
provider: 'generic'
url: 'http://127.0.0.1:8080/test-download/'
channel: 'latest'
  • APPAutoUpdater.js
const { autoUpdater } = require('electron-updater')
const Store = require('electron-store')
const path = require('path')
global.store = new Store()
autoUpdater.logger = require('electron-log')
// 监听输出的日志
autoUpdater.logger.transports.file.level = 'info'
// 设置当前的版本号为自动更新的版本号
global.currentVersion = autoUpdater.currentVersion
autoUpdater.autoDownload = false // 将自动下载包设置为false,产品的需求是让用户自己点击更新下载
// 监听自动更新的几个事件
// 监听如果自动更新失败将停止安装
autoUpdater.on('error', () => {
  // todo something
})
// 检查更新是否已开始时发出
autoUpdater.on('checking-for-update', () => {})
// 检测有可更新的应用包
autoUpdater.on('update-available', info => {
  // todo something
})
// 检测没有可用更新时发出
autoUpdater.on('update-not-available', info => {
  // todo something
})
// 下载可更新的安装包
autoUpdater.on('update-downloaded', info => {
 // todo something
})
// 监听下载进度
autoUpdater.on('download-progress', info => {
  // todo something
})
module.exports = {
  checkVersion() {
    if (global.isDev) {
      autoUpdater.updateConfigPath = path.join(__dirname, '../../dev-app-update.yml')
    }
    autoUpdater.checkForUpdates()
  }
}
  • 在electron的主进程中 index.js

// 主页面一旦加载完成后就开始执行检查更新
mainWindow.webContents.on('did-finish-load', () => {
    AppUpdater.checkVersion()
})