electron+vue3全家桶+vite项目搭建【25】使用electron-updater自动更新应用

news2024/11/17 21:25:25

文章目录

    • 引入
    • 实现效果
    • 实现步骤
      • 引入依赖
      • 配置electron-buidler文件
      • 封装版本升级工具类
      • 主进程调用版本更新校验
      • 渲染进程封装方法调用
    • 测试版本更新

引入

demo项目地址

electron-updater官网

我们不可能每次发布新的版本都让用户去手动下载安装最新的包,而是应用可以自动下载新包进行覆盖安装,electron-updater就可以非常方便的实现这个功能

实现效果

electron自动更新

实现步骤

引入依赖

  • 需要注意electron-updater的版本需要和electron的版本对应上
  • 实测用pnpm安装打包运行会有问题,这里还是推荐使用npm管理依赖
npm i electron-updater    

配置electron-buidler文件

我们修改根目录下的electron-buidler文件,补充安装包更新地址配置

  • electron-builder.json5
{
    ...
  // 配置安装包更新地址
  publish: [
    {
      provider: "generic",
      url: "http://common.longzipeng.online/package/auto",
    },
  ],
}

请添加图片描述

封装版本升级工具类

封装一个appVersion工具类

  • electron\main\appVersion.ts
  • 这里注意updateUrl就是存放我们安装包的远程服务器的地址【可以是nginx服务器,也可以是第三方云存储OSS】,我这里还会放mac和win两个目录,用于不同平台的自动更新
import { autoUpdater } from 'electron-updater';
import { dialog, BrowserWindow } from 'electron';

const updateUrl = 'http://common.longzipeng.online/package/auto';

/**检测更新 */
export const checkUpdate = (win: BrowserWindow) => {
  console.log('开始检测');

  // 设置更新检测的资源路径,会检测对应路径下的 last.yaml文件中的版本信息 上线后确保该文件能正常访问
  if (process.platform == 'darwin') {
    autoUpdater.setFeedURL(`${updateUrl}/mac`);
    return;
  } else {
    autoUpdater.setFeedURL(`${updateUrl}/win`);
  }

  //检测更新
  autoUpdater.checkForUpdates();

  //监听'error'事件
  autoUpdater.on('error', err => {
    console.log('出错拉' + err);
    dialog.showErrorBox('更新出错拉!', err.message);
  });

  //监听'update-available'事件,发现有新版本时触发
  autoUpdater.on('update-available', () => {
    console.log('found new version');
    dialog.showMessageBox({
      message: '发现新版本,正在下载安装包'
    });
  });

  // 更新包下载百分比回调
  autoUpdater.on('download-progress', function (progressObj) {
    if (win) {
      win.webContents.send('download-progress', progressObj);
    }
  });

  //默认会自动下载新版本,如果不想自动下载,设置autoUpdater.autoDownload = false
  // autoUpdater.autoDownload = false;

  //监听'update-downloaded'事件,新版本下载完成时触发
  autoUpdater.on('update-downloaded', () => {
    dialog
      .showMessageBox({
        type: 'info',
        title: '应用更新',
        message: '需要退出程序才能安装新版本,是否安装?',
        buttons: ['是', '否']
      })
      .then(buttonIndex => {
        if (buttonIndex.response == 0) {
          //选择是,则退出程序,安装新版本
          autoUpdater.quitAndInstall();

        }
      });
  });
};

主进程调用版本更新校验

我们在主进程中添加检测版本更新的handle处理

  • electron\main\index.ts
/**
* 版本更新检测
*/
ipcMain.handle("check-update",(e:any)=>{
  // 获取发送通知的渲染进程窗口
  const currentWin = getWindowByEvent(e);
  // 升级校验
  checkUpdate(currentWin);
});


/**
 * 通过窗口事件获取发送者的窗口
 * @param event ipc发送窗口事件
 */
function getWindowByEvent(event: IpcMainEvent): BrowserWindow {
  const webContentsId = event.sender.id;
  for (const currentWin of BrowserWindow.getAllWindows()) {
    if (currentWin.webContents.id === webContentsId) {
      return currentWin;
    }
  }
  return null;
}

渲染进程封装方法调用

  • src\utils\electronUtils.ts
/**
 * 检查版本更新
 */
export function checkUpdate(){
  ipcRenderer.invoke("check-update");
}

export default {
  ...
  checkUpdate
};

测试版本更新

1.我们直接在HeeloWorld组件中调用封装的更新校验方法,并监听下载回调

  • src\components\HelloWorld.vue
<script>
    onMounted(() => {
      // 版本更新,下载进度回调
      ipcRenderer.on("download-progress",downloadProgressHandle);

    });
    
    // 版本更新,处理下载进度回调
    function downloadProgressHandle(e:any,data:any){
      console.log(data);
    }

    onUnmounted(() => {
      ipcRenderer.removeListener("download-progress",downloadProgressHandle);
    });
</script>
<template>
	<li>
      <el-button @click="electronUtils.checkUpdate">检测版本更新</el-button>
    </li>
</template>

2.我们修改oackage.json文件,将version的版本提升

请添加图片描述

3.接着我们打包项目,在release目录下会出现一个1.0.1的文件夹,里面就是最新打包生成的文件,需要上传到服务器上的是如下两个文件

  • release\1.0.1\latest.yml
  • release\1.0.1\electron-vue3-template_1.0.1.exe
    请添加图片描述

4.把两个文件上传到服务器中,这里为了方便起见,我直接上传到七牛云的oss中

请添加图片描述

5.最后我们把package.json的版本号再调回1.0.0,然后打包,本地安装运行【只有安装好的应用,才能进行更新】

6.最终效果如下:
electron自动更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/837239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不懂这些专业名词,你很难成为有水平的项目经理——数据分析篇

大家好&#xff0c;我是老原。 前段时间我们项目组招了个新人小林&#xff0c;让他去和产品经理对下产品上线情况&#xff0c;等到下班也没等来反馈。 第二天在茶水间遇到了产品经理就问了一嘴&#xff0c;才知道已经对接到位了。 一问小林才知道&#xff0c;他完全不知道产…

跨境电商的广告推广怎么做?7个方法

在跨境电商竞争日趋激烈的市场环境下&#xff0c;跨境电商店铺引流成了制胜关键点。这里给大家分享一套引流推广的方法。 一、搜索引擎营销推广 搜索引擎有两个最大的优点是更灵活、更准确。搜索引擎营销的目标定位更精确&#xff0c;且不受时间和地理位置上的限制&#xff0…

Live800:未来的在线客服系统有哪些挑战?

科技的不断发展和人工智能的逐步成熟&#xff0c;让在线客服系统已成为许多企业提供优质服务的重要手段。在线客服系统显然并不是一成不变的&#xff0c;未来的在线客服系统必将与时俱进不断升级优化。那么&#xff0c;你知道在未来在线客服系统将面临哪些挑战呢&#xff1f; 这…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(29)-Fiddler如何抓取Android7.0以上的Https包-终篇

1.简介 上一篇宏哥介绍的Xposed是一款可以在不修改APK的情况下影响程序运行的框架。可以编写并加载自己编写的插件app&#xff0c;实现对目标apk的注入、拦截等。一般研究移动安全的都会使用Xposed。 Xposed框架已停止更新&#xff0c;它支持android 6.0-8.1&#xff0c;但它…

Maven依赖爆红的解决思路

说明&#xff1a;本文介绍Maven依赖爆红&#xff0c;排查错误的几种思路&#xff1b; 思路一&#xff1a;删除本地仓库.lastupdate文件&#xff1b; 找到本地maven仓库&#xff0c;全局搜索.lastupdate文件&#xff0c;把搜索出来的文件全部删除。.lastupdate后缀名的文件&am…

音频转文字软件哪个好用?这些软件你不容错过

在一个繁忙的办公室里&#xff0c;小明正在与他的同事小李聊天。突然&#xff0c;小明兴奋地拍了拍桌子&#xff0c;眉开眼笑地对小李说道&#xff1a;你知道吗&#xff1f;我近期发现了一个实用的音频转文字工具&#xff01;它可以帮助我们将音频转换成文字。 小李&#xff1…

UML-活动图

目录 一.活动图概述: 1.活动图的作用&#xff1a; 2.以下场合不使用活动图&#xff1a; 3.活动图的基本要素&#xff1a; 4.活动图的图符 4.1起始状态 4.2终止状态 4.3状态迁移 4.4决策点 4.5同步条:表示活动之间的不同 5.活动图: 二.泳道&#xff1a; 1.泳道图&a…

VS2017中Qt工程报错:无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被引用

工程报错:无法解析的外部符号 __imp_CommandLineToArgvW&#xff0c;该符号在函数 WinMain 中被引用 解决方法&#xff1a; 在输入的附加依赖项中增加 shell32.lib

信驰达RF-BM-2340B1开发套件加速CC2340R5产品化

TI第四代低功耗蓝牙SoC-CC2340一发布就在物联网通信模组厂商、方案商和成品厂商中引起了广泛关注。随着该芯片的量产&#xff0c;使用芯片或模块进行开发调试成为开发者面临的首要问题。作为无线通信模块老牌厂商&#xff0c;深圳市信驰达科技有限公司第一时间基于CC2340R5推出…

web测试方法总结

1. 登录测试 1.1 输入正确的用户名和正确的密码&#xff0c;看输出结果是否正确 1.2 输入正确的用户名和错误的密码&#xff0c;并给出合理的提示 1.3 输入错误的用户名和正确的密码&#xff0c;并给出合理的提示 1.4 输入错误的用户名和错误的密码&#xff0c;并给出合理的…

接口测试之文件上传

在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编写上传文件接口测试脚本的方法。 首先&#xff0c;要知道文件上传的一般原理&#xff1a;客户端根据文件路径读取文件内容&#xff0c;将文件内容转换成二进制文件流的格式…

安达发|模具制造业对APS软件需求大幅增长

近年来&#xff0c;中国模具工业以每年15%左右的增速速度快速发展。然而&#xff0c;对于大型、精密、复杂及长寿命模具的需求增长将远超过每年15%的增幅。为应对这一挑战&#xff0c;模具制造业对APS软件的需求大幅度增长&#xff0c;助力行业提速发展。 据统计&#xff0c;中…

16.M端事件和JS插件

16.1移动端 移动端也有自己独特的地方 ●触屏事件touch (也称触摸事件)&#xff0c;Android 和I0S都有。 ●touch对象代表一个触摸点。触摸点可能是一根手指&#xff0c;也可能是一根触摸笔。触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。 ●常见的触屏事件如下: …

获取SQL语句表名,判断DDL类型

1.在maven中引入jsqlparser依赖 <!--sql语句解析--><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.4</version></dependency>2.解析SQL语句具体代码 此代码解析…

如何消除“信息孤岛”对业务增长的威胁?

根据CMSWire的数据&#xff0c;员工平均每天要花36%的时间来查找和整合信息。但44%的情况下&#xff0c;他们找不到信息。这种时间和精力的浪费就是信息孤岛造成的。 什么是信息孤岛&#xff1f; 当部门存储数据并限制其他人访问数据时&#xff0c;就会出现信息孤岛&#xff…

动态代理类之万能模板

ProxyInvocationHandler package com.heerlin.demo03;import com.heerlin.demo02.Rent;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;//用这个类&#xff0c;自动生成代理类 public class ProxyInvocationH…

LeetCode每日一题Day5——21. 合并两个有序链表

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …

力扣 1049. 最后一块石头的重量 II

题目来源&#xff1a;https://leetcode.cn/problems/last-stone-weight-ii/description/ C题解&#xff08;思路来源代码随想录&#xff09;&#xff1a;本题其实就是尽量让石头分成重量相同的两堆&#xff0c;相撞之后剩下的石头最小&#xff0c;这样就化解成01背包问题了。 …

第一章-JavaScript基础进阶part2:事件

文章目录 概念一、注册事件&#xff08;绑定事件&#xff09;1.1 addEventListener事件监听 二、删除事件&#xff08;解绑&#xff09;三、DOM事件流四、事件对象event4.1 e.target与this与e.currentTarget的区别4.2 事件对象的常见属性 五、阻止事件默认行为及冒泡六、事件委…

【CSS】旋转中的视差效果

效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"/><meta name"viewport" content"widthdevice-…