88 lines
2.8 KiB
TypeScript
88 lines
2.8 KiB
TypeScript
import { AppUpdater as _AppUpdater, autoUpdater, UpdateInfo } from 'electron-updater'
|
||
import logger from 'electron-log'
|
||
import { BrowserWindow, dialog } from 'electron'
|
||
|
||
export default class AppUpdater {
|
||
autoUpdater: _AppUpdater = autoUpdater
|
||
|
||
constructor(mainWindow: BrowserWindow) {
|
||
logger.transports.file.level = 'debug'
|
||
autoUpdater.logger = logger
|
||
autoUpdater.forceDevUpdateConfig = true
|
||
autoUpdater.autoDownload = false
|
||
|
||
// 检测下载错误
|
||
autoUpdater.on('error', (error) => {
|
||
logger.error('更新异常', error)
|
||
mainWindow.webContents.send('update-error', error)
|
||
})
|
||
|
||
// 检测是否需要更新
|
||
autoUpdater.on('checking-for-update', () => {
|
||
logger.info('正在检查更新……')
|
||
})
|
||
|
||
autoUpdater.on('update-available', (releaseInfo: UpdateInfo) => {
|
||
autoUpdater.logger?.info('检测到新版本,确认是否下载')
|
||
mainWindow.webContents.send('update-available', releaseInfo)
|
||
const releaseNotes = releaseInfo.releaseNotes
|
||
let releaseContent = ''
|
||
if (releaseNotes) {
|
||
if (typeof releaseNotes === 'string') {
|
||
releaseContent = <string>releaseNotes
|
||
} else if (releaseNotes instanceof Array) {
|
||
releaseNotes.forEach((releaseNote) => {
|
||
releaseContent += `${releaseNote}\n`
|
||
})
|
||
}
|
||
} else {
|
||
releaseContent = '暂无更新说明'
|
||
}
|
||
|
||
// 弹框确认是否下载更新(releaseContent是更新日志)
|
||
dialog
|
||
.showMessageBox({
|
||
type: 'info',
|
||
title: '应用有新的更新',
|
||
detail: releaseContent,
|
||
message: '发现新版本,是否现在更新?',
|
||
buttons: ['下次再说', '更新']
|
||
})
|
||
.then(({ response }) => {
|
||
if (response === 1) {
|
||
logger.info('用户选择更新,准备下载更新')
|
||
mainWindow.webContents.send('download-update')
|
||
autoUpdater.downloadUpdate()
|
||
}
|
||
})
|
||
})
|
||
|
||
// 检测到不需要更新时
|
||
autoUpdater.on('update-not-available', () => {
|
||
logger.info('现在使用的就是最新版本,不用更新')
|
||
mainWindow.webContents.send('update-not-available')
|
||
})
|
||
|
||
// 更新下载进度
|
||
autoUpdater.on('download-progress', (progress) => {
|
||
logger.info('下载进度', progress)
|
||
mainWindow.webContents.send('download-progress', progress)
|
||
})
|
||
|
||
// 当需要更新的内容下载完成后
|
||
autoUpdater.on('update-downloaded', () => {
|
||
logger.info('下载完成,准备更新')
|
||
dialog
|
||
.showMessageBox({
|
||
title: '安装更新',
|
||
message: '更新下载完毕,应用将重启并进行安装'
|
||
})
|
||
.then(() => {
|
||
setImmediate(() => autoUpdater.quitAndInstall())
|
||
})
|
||
})
|
||
|
||
this.autoUpdater = autoUpdater
|
||
}
|
||
}
|