electron 自动更新(兼容win/Mac)

 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的安装包的压缩包,总共三个

以上文件打包时都会自动生成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值