- 首先,我用的是electron-builder,不清楚packager是否适用😂
封装(其实整个丢到在app.on(‘ready’)也是可以的,autoUpdater.checkForUpdates() 必须在ready后调用)
const { autoUpdater } = require('electron-updater')
const { ipcMain } = require('electron')
function updater (event) {
autoUpdater.setFeedURL('安装包所在线上路径')
// 下面是自动更新的整个生命周期所发生的事件
autoUpdater.on('error', function(message) {
sendUpdateMessage('error', JSON.stringify(message))
})
// 获取版本信息
autoUpdater.on('checking-for-update', function(message) {
sendUpdateMessage('checking-for-update', message)
})
// 即将进行更新
autoUpdater.on('update-available', function(message) {
sendUpdateMessage('update-available', message)
})
// 已是最新版
autoUpdater.on('update-not-available', function(message) {
sendUpdateMessage('update-not-available', message)
})
// 更新下载进度事件 progressObj.data.percent === 100 下载完成,
// mac端会进行安装
// win端不会自动安装而是走到 update-downloaded
autoUpdater.on('download-progress', function(progressObj) {
sendUpdateMessage('downloadProgress', progressObj)
})
// 更新下载完成事件
autoUpdater.on('update-downloaded', function(event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
// 用于通知渲染进程下载完成(不通知直接关闭更新也可以,用户体验不好而已)
sendUpdateMessage('isUpdateNow')
// 渲染进程返回关闭应用并更新
ipcMain.on('updateNow', (e, arg) => {
// 关闭并更新
// mac端应该是更新好了,重启就是新版
// win端会开启安装界面
autoUpdater.quitAndInstall()
})
})
// 检测是否有更新
autoUpdater.checkForUpdates()
function sendUpdateMessage (message, data) {
console.log(message, data)
event.sender.send('updateApp', {message, data})
}
}
module.exports = updater
为了本地调试时加入自动更新配置文件,放在项目根路径
- mac
dev-app-update.yml
- win
default-app-update.yml
provider: generic
url: '安装包所在线上路径'
主进程main.js
// 自定义事件,对应渲染进程 '更新'功能
ipcMain.on('updateApp', (event) => {
// 刚刚封装的方法
updater(event)
})
打包后需要放到服务器的文件
- mac 需要打包dmg和zip,并且将打包出来的
.yml
文件改名为latest-mac.yml
(包含版本信息,新包的路径信息),将dmg、zip、latest-mac.yml放在同一根目录(线上服务器,对应配置文件的url) - win 需要将打包出来的
.yml
文件改名为latest.yml
,将exe、blockmap、latest.yml放在同一根目录(线上服务器,对应配置文件的url)
可以通过改本地配置文件的版本号本地运行进行测试
注意
- mac 需要签名后才能使用该功能,如果签名不正确mac会提示非法签名且无法安装应用
- win 大概也需要签名,在没签名的情况下也能用,但是存在个别用户的电脑需要以管理员打开才能够正常运行