1、
2、自动更新文件:
import { ipcMain } from 'electron'
import log from './logger'
import { autoUpdater } from 'electron-updater'
const fs = require('fs-extra')
const path = require('path')
// 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写
export function updateHandle({ mainWindow }) {
// 清除每次更新下载的文件,否则无法进行更新
//= ==============================================================================================================
// updaterCacheDirName的值与src/main/app-update.yml中的updaterCacheDirName值一致,在windows中会创建一个类似
// C:\Users\Administrator\AppData\Local\slient-print-updater\pending文件存储更新下载后的文件"*.exe"和"update-info.json"
let updaterCacheDirName = 'workbench-updater'
// @ts-ignore (define in dts)
const updatePendingPath = path.join(autoUpdater.app.baseCachePath, updaterCacheDirName, 'pending')
fs.emptyDir(updatePendingPath)
let message = {
error: '检查更新出错',
checking: '正在检查更新……',
updateAva: '检测到新版本,正在下载……',
updateNotAva: '现在使用的就是最新版本,不用更新'
}
// 也可以通过代码配置文件服务地址
autoUpdater.setFeedURL({
provider: 'generic',
url: '你自己的更新地址'
})
// 设置是否自动下载,默认是true,当点击检测到新版本时,会自动下载安装包,所以设置为false
autoUpdater.disableWebInstaller = false
autoUpdater.autoDownload = false //这个必须写成false,写成true时,我这会报没权限更新,也没清楚什么原因
autoUpdater.logger = log
// 正在检查更新
autoUpdater.on('error', function () {
sendUpdateMessage(message.error, mainWindow)
console.log(message.error,'message.error');
})
autoUpdater.on('checking-for-update', function () {
if (process.env.NODE_ENV !== 'development') {
sendUpdateMessage(message.checking, mainWindow)
console.log(message.checking,'message.checking');
}
})
// 有新的可用更新
autoUpdater.on('update-available', function () {
sendUpdateMessage(message.updateAva, mainWindow)
console.log(message.updateAva,'message.updateAva');
})
// 没有可用的更新,也就是当前是最新版本
autoUpdater.on('update-not-available', function () {
sendUpdateMessage(message.updateNotAva, mainWindow)
console.log(message.updateNotAva,'message.updateNotAva');
})
// 更新下载进度事件
autoUpdater.on('download-progress', function (progressObj) {
mainWindow.webContents.send('downloadProgress', progressObj)
})
// 新安装包下载完成
autoUpdater.on('update-downloaded', function () {
log.warn('开始更新')
autoUpdater.quitAndInstall()
})
ipcMain.on('checkForUpdate', () => {
// 执行自动更新检查
log.warn('执行自动更新检查, isDestroyed:', mainWindow.isDestroyed())
// 解决mac重启App 报错 的问题: object has been destroyed
if (mainWindow && !mainWindow.isDestroyed()) {
autoUpdater.checkForUpdates()
}
})
ipcMain.on('downloadUpdate', () => {
// 下载
log.warn('执行下载')
autoUpdater.downloadUpdate()
})
}
// 通过main进程发送事件给renderer进程,提示更新信息
function sendUpdateMessage(text, mainWindow) {
mainWindow.webContents.send('message', text)
}
日志:
const log = require('electron-log')
log.transports.file.fileName = 'main.log';
log.transports.file.level = 'false';
// 达到最大上限后,备份文件并重命名为:main.old.log,有且仅有一个备份文件
log.transports.file.maxSize = 1048576;
log.transports.console.level = 'silly';
export default log
3、主窗口调用:
创建窗口的时候记得传1
4、渲染进程调用的窗口:
<el-dialog
v-model="isProgressVisible"
:show-close="false"
:close-on-click-modal="false"
:close-on-press-escape="false"
fullscreen
title="正在下载新版本,请稍后..."
>
<div style="text-align:center">
<el-progress type="circle" :percentage="percentage"></el-progress>
</div>
</el-dialog>
import { ipcRenderer } from 'electron' //记得主进程窗口开启node权限
// 是否显示下载窗口
let isProgressVisible = ref(false)
// 下载进度
let percentage = ref(0)
// 检测更新
const showUpdate = () => {
// 检查更新
ipcRenderer.send('checkForUpdate')
// 监听自动更新事件
// @ts-ignore (define in dts)
ipcRenderer.on('message', (event, text) => {
if (text === '检测到新版本,正在下载……') {
nextTick( () => {
isProgressVisible.value = true
ipcRenderer.send('downloadUpdate')
// //注意:“downloadProgress”事件如果无法触发,只需要限制一下下载网速就好了
// @ts-ignore (define in dts)
ipcRenderer.on('downloadProgress', (event, progressObj) => {
percentage.value = parseInt(progressObj.percent || 0)
console.log(percentage.value,'下载进度');
})
})
}
})
}
注:
5、win,打包后,更新需要用到的文件是
win需要:安装包、yml文件
mac的是除了安装包和yml文件以外还需要一个zip的安装包的压缩包,总共三个
以上文件打包时都会自动生成