Electron 自动更新

1,152 阅读2分钟

前言

在正式介绍整包自动更新前,我们先对齐所需要的环境、插件等必要的项目配置:

  1. 项目是基于electron-vue搭建
  2. electron-builder打包构建
  3. 更新插件 electron-updater
  4. Mac版验证 ⚠️备注:electron版本与electron-updater存在关联,类似:electron-updater最新版本需要electron 版本大于xx版本。 基于以上相关技术,当前自动更新能力可以时时监听下载进度、正式环境下可以存在多个版本。

插件electron-updater

Events

error //当更新发生错误时触发

checking-for-update://检查更新的时候触发

update-not-available //检验无可用更新时触发

update-available //检验有可用更新时触发

download-progress //实时更新进度

update-downloaded //更新完成触发
import { autoUpdater } from 'electron-updater';

autoUpdater.on('autoUpdater-Event', () => {
    //事件触发回调
});

API

autoDownload: true //是否自动下载更新。

autoInstallOnAppQuit: true //是否在应用程序退出时自动安装下载的更新(未调用过 quitAndInstall)

allowPrerelease: false //是否允许更新到预发行版本

fullChangelog: false //获取所有发行说明

allowDowngrade: false //是否允许版本降级

currentVersion: //当前的应用程序版本

channel: //获取更新频道

requestHeaders://请求头

Methods

// 是否有可用更新

appUpdater.checkForUpdates() ⇒ Promise<UpdateCheckResult// 是否有更新,下载并通知更新是否可用

appUpdater.checkForUpdatesAndNotify() ⇒ Promise< | UpdateCheckResult>

//手动下载更新

appUpdater.downloadUpdate(cancellationToken) ⇒ Promise<any>

appUpdater.getFeedURL() ⇒ undefined | null | String appUpdater.setFeedURL(options)

// 定义自动更新程序将要遵循的频道

appUpdater.channel (getter and setter)

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

appUpdater.quitAndInstall(isSilent, isForceRunAfter)

自动更新流程示意图:

示例

1、 配置package.json

为了打包时生成latest.yml文件,需要在 build 参数中添加 publish 配置。

⚠️注意:配置了publish才会生成latest.yml文件,用于自动更新的配置信息; latest.yml文件是打包过程生成的文件,为避免自动更新出错,打包后禁止对latest.yml文件做任何修改。如果文件有误,必须重新打包获取新的latest.yml文件!

// package.json配置
{
    ...
    "build": {
        "publish": [{

            "provider": "generic",

            "url": "https://xxxx/update/", // 推送的地址

            "channel": "latest" // 检查更新渠道(可省,走默认)

        }]
    }
    ...
}
  1. Latest.yml示例
version: 1.0.0
files:
    - url: xxx.zip
    sha512: '123abcdef...'
    size: 11000000
    blockMapSize: 121100
    - url: xxxx.dmg
    sha512: '222111asdfWzH...'
    size: 123902532
path: xxx.zip
sha512: '123abcdef...'
releaseDate: '2021-01-01T18:18:18.788Z'
  1. 主进程 autoUpdater 文件
import { autoUpdater } from 'electron-updater';

const checkAutoUpdate = () => {
    //url:更新链接
    autoUpdater.setFeedURL(url);
    autoUpdater.autoDownload = false;
    autoUpdater.autoInstallOnAppQuit = 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
    });

    autoUpdater.checkForUpdates()
    .catch(err => {
        // todo something
    });
}

checkAutoUpdate();

以上就是Electron配置更新的主体流程。