Electron-vue 自动更新

该博客介绍了如何在 Electron 应用中集成 `electron-updater` 模块,实现自动检查和下载更新的功能。通过在 `package.json` 中配置更新服务器地址,创建 `updata.js` 文件来监听和处理更新事件,并在主进程和渲染进程中进行通信,确保用户能够接收到更新信息并顺利更新应用。同时,在应用启动20秒后和每小时检查一次新版本,以保持应用的最新状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装electron-updater

yarn add electron-updater

package.json 中添加以下代码

 "publish": [
      {
        "provider": "generic",
        "url": "http://application.ziyoujike.cn/"
      }
    ],

如图

在这里插入图片描述
新建 updata.js

import { autoUpdater } from 'electron-updater'

import { ipcMain } from 'electron'
let mainWindow = null;
export function updateHandle(window, feedUrl) {
    mainWindow = window;
    let message = {
        error: '检查更新出错',
        checking: '正在检查更新……',
        updateAva: '检测到新版本,正在下载……',
        updateNotAva: '现在使用的就是最新版本,不用更新',
    };
    //设置更新包的地址
    autoUpdater.setFeedURL(feedUrl);
    //监听升级失败事件
    autoUpdater.on('error', function (error) {
        sendUpdateMessage({
            cmd: 'error',
            message: error
        })
    });
    //监听开始检测更新事件
    autoUpdater.on('checking-for-update', function (message) {
        sendUpdateMessage({
            cmd: 'checking-for-update',
            message: message
        })
    });
    //监听发现可用更新事件
    autoUpdater.on('update-available', function (message) {
        sendUpdateMessage({
            cmd: 'update-available',
            message: message
        })
    });
    //监听没有可用更新事件
    autoUpdater.on('update-not-available', function (message) {
        sendUpdateMessage({
            cmd: 'update-not-available',
            message: message
        })
    });

    // 更新下载进度事件
    autoUpdater.on('download-progress', function (progressObj) {
        console.log("更新下载进度事件")
        console.log(progressObj)
        console.log("更新下载进度事件")
        sendUpdateMessage({
            cmd: 'download-progress',
            message: progressObj
        })
    });
    //监听下载完成事件
    autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl) {
        sendUpdateMessage({
            cmd: 'update-downloaded',
            message: {
                releaseNotes,
                releaseName,
                releaseDate,
                updateUrl
            }
        })
        //退出并安装更新包
        autoUpdater.quitAndInstall();
    });

    //接收渲染进程消息,开始检查更新
    ipcMain.on("checkForUpdate", (e, arg) => {
        //执行自动更新检查
        // sendUpdateMessage({cmd:'checkForUpdate',message:arg})
        autoUpdater.checkForUpdates();
    })
}
//给渲染进程发送消息
function sendUpdateMessage(text) {
    mainWindow.webContents.send('message', text)
}

src main文件中 index.js 中添加

import {updateHandle } from '../renderer/utils/updata.js'

let feedUrl = "http://application.ziyoujike.cn/";
  
updateHandle(mainWindow, feedUrl);

如图

在这里插入图片描述
src renderer文件夹中 App.vue 中 添加以下代码

<template>
  <a-spin :spinning="loading.spinning" :delay="20">
    <div id="app">
      <GkHeader></GkHeader>
      <router-view></router-view>
    </div>
    <a-modal
      v-model="visible"
      title="软件更新"
      :closable="false"
      :keyboard="false"
      :maskClosable="false"
      :centered="true"
      :footer="null"
    >
      <a-progress :percent="percent" />
    </a-modal>
  </a-spin>
</template>

<script>
let ipcRenderer = require("electron").ipcRenderer;
let _this = this;
//接收主进程版本更新消息
ipcRenderer.on("message", (event, arg) => {
  if ("update-available" == arg.cmd) {
    //显示升级对话框
    _this.visible = true;
  } else if ("download-progress" == arg.cmd) {
    //更新升级进度
    let percent = Math.round(parseFloat(arg.message.percent));
    _this.percent = percent;
  } else if ("error" == arg.cmd) {
    _this.visible = false;
    _this.$message.error("更新失败");
  }
});
//20秒后开始检测新版本
let timeOut = window.setTimeout(() => {
  ipcRenderer.send("checkForUpdate");
}, 2000);
clearTimeout;
//间隔1小时检测一次
let interval = window.setInterval(() => {
  ipcRenderer.send("checkForUpdate");
}, 3600000);
import GkHeader from "./components/Gk-Header.vue";
import { mapState } from "vuex";
export default {
  name: "pxtk-application",
  components: {
    GkHeader,
  },
  data() {
    return {
      visible: false,
      percent: 0,
    };
  },
  computed: {
    ...mapState(["loading"]),
  },

  mounted() {
    _this = this;
    window.addEventListener("online", function () {
      this.$message.error("网络故障,请检查网络连接");
    });
    window.addEventListener("offline", function () {
      this.$message.success("网络已恢复");
    });
  },
  destroyed() {
    window.clearInterval(interval);
    window.clearInterval(timeOut);
  },
};
</script>

<style>
/* CSS */
.ant-notification {
  top: 80px !important;
}

/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar {
  width: 5px;
  height: 5px;
  background-color: #f5f5f5;
}

/*定义滚动条轨道 内阴影+圆角*/
::-webkit-scrollbar-track {
  box-shadow: inset 0 0 0px rgba(0, 0, 0, 0.3);
  background-color: #f5f5f5;
}

/*定义滑块 内阴影+圆角*/
::-webkit-scrollbar-thumb {
  box-shadow: inset 0 0 0px rgba(0, 0, 0, 0.3);
  background-color: #555;
}
</style>

如图

在这里插入图片描述
在这里插入图片描述

效果展示

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值