前言
在正式介绍整包自动更新前,我们先对齐所需要的环境、插件等必要的项目配置:
- 项目是基于electron-vue搭建
- electron-builder打包构建
- 更新插件 electron-updater
- 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" // 检查更新渠道(可省,走默认)
}]
}
...
}
- 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'
- 主进程 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配置更新的主体流程。