最新博文地址:https://segmentfault.com/a/1190000012904543

发客户端一定要做的就是自动更新模块,否则每次版本升级都是一个头疼的事。
下面是Electron应用使用electron-builder配合electron-updater实现自动更新的解决方案。

1.安装 electron-updater 包模块

  1. npm install electron-updater --save

2.配置package.json文件

为了打包时生成latest.yml文件,需要在 build 参数中添加 publish 配置。

  1. "build": {
  2. "productName": "***",//隐藏软件名称
  3. "appId": "**",//隐藏appid
  4. "directories": {
  5. "output": "build"
  6. },
  7. "publish": [
  8. {
  9. "provider": "generic",
  10. "url": "http://**.**.**.**:3002/download/",//隐藏版本服务器地址
  11. }
  12. ],
  13. "files": [
  14. "dist/electron/**/*"
  15. ],
  16. "dmg": {
  17. "contents": [
  18. {
  19. "x": 410,
  20. "y": 150,
  21. "type": "link",
  22. "path": "/Applications"
  23. },
  24. {
  25. "x": 130,
  26. "y": 150,
  27. "type": "file"
  28. }
  29. ]
  30. },
  31. "mac": {
  32. "icon": "build/icons/icon.icns",
  33. "artifactName": "${productName}_setup_${version}.${ext}"
  34. },
  35. "win": {
  36. "icon": "build/icons/icon.ico",
  37. "artifactName": "${productName}_setup_${version}.${ext}"
  38. },
  39. "linux": {
  40. "icon": "build/icons",
  41. "artifactName": "${productName}_setup_${version}.${ext}"
  42. }
  43. }

  注意:配置了publish才会生成latest.yml文件,用于自动更新的配置信息;
3.配置主进程main.js文件(或主进程main中的index.js文件),引入 electron-updater 文件,添加自动更新检测和事件监听:
注意:一定要是主进程main.js文件(或主进程main中的index.js文件),否则会报错。

  1. import { app, BrowserWindow, ipcMain } from 'electron'
  2.  
  3. // 注意这个autoUpdater不是electron中的autoUpdater
  4. import { autoUpdater } from "electron-updater"
  5. import {uploadUrl} from "../renderer/config/config";
  6.  
  7. // 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写
  8. function updateHandle() {
  9. let message = {
  10. error: '检查更新出错',
  11. checking: '正在检查更新……',
  12. updateAva: '检测到新版本,正在下载……',
  13. updateNotAva: '现在使用的就是最新版本,不用更新',
  14. };
  15. const os = require('os');
  16.  
  17. autoUpdater.setFeedURL(uploadUrl);
  18. autoUpdater.on('error', function (error) {
  19. sendUpdateMessage(message.error)
  20. });
  21. autoUpdater.on('checking-for-update', function () {
  22. sendUpdateMessage(message.checking)
  23. });
  24. autoUpdater.on('update-available', function (info) {
  25. sendUpdateMessage(message.updateAva)
  26. });
  27. autoUpdater.on('update-not-available', function (info) {
  28. sendUpdateMessage(message.updateNotAva)
  29. });
  30.  
  31. // 更新下载进度事件
  32. autoUpdater.on('download-progress', function (progressObj) {
  33. mainWindow.webContents.send('downloadProgress', progressObj)
  34. })
  35. autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
  36.  
  37. ipcMain.on('isUpdateNow', (e, arg) => {
  38. console.log(arguments);
  39. console.log("开始更新");
  40. //some code here to handle event
  41. autoUpdater.quitAndInstall();
  42. });
  43.  
  44. mainWindow.webContents.send('isUpdateNow')
  45. });
  46.  
  47. ipcMain.on("checkForUpdate",()=>{
  48. //执行自动更新检查
  49. autoUpdater.checkForUpdates();
  50. })
  51. }
  52.  
  53. // 通过main进程发送事件给renderer进程,提示更新信息
  54. function sendUpdateMessage(text) {
  55. mainWindow.webContents.send('message', text)
  56. }

  4.在视图层中触发自动更新,并添加自动更新事件的监听。
触发自动更新:

  1. ipcRenderer.send("checkForUpdate");

  监听自动更新事件:

  1. import { ipcRenderer } from "electron";
  2. ipcRenderer.on("message", (event, text) => {
  3. console.log(arguments);
  4. this.tips = text;
  5. });
  6. ipcRenderer.on("downloadProgress", (event, progressObj)=> {
  7. console.log(progressObj);
  8. this.downloadPercent = progressObj.percent || 0;
  9. });
  10. ipcRenderer.on("isUpdateNow", () => {
  11. ipcRenderer.send("isUpdateNow");
  12. });

  为避免多次切换页面造成监听的滥用,切换页面前必须移除监听事件:

  1. //组件销毁前移除所有事件监听channel
  2. ipcRenderer.removeAll(["message", "downloadProgress", "isUpdateNow"]);//remove只能移除单个事件,单独封装removeAll移除所有事件

  5.项目打包
执行electron-builder进行打包,windows下会生成安装包exe和latest.yml等文件,执行exe安装软件;Mac下会生成安装包dmg和latest-mac.yml文件,执行dmg安装软件。
windows打包生成文件:

Mac打包生成文件:

6.软件升级版本,修改package.json中的version属性,例如:改为 version: “1.1.0” (之前为1.0.0);
7.再次执行electron-builder打包,将新版本latest.yml文件和exe文件放到package.json中build -> publish中的url对应的地址下;
8.在应用中触发更新检查,electron-updater自动会通过对应url下的yml文件检查更新;

windows上自动更新示例:

mac上自动更新示例:

如果这篇文章对你的工作或者学习有帮助的话,请收藏或点个赞。如果对其中有什么不明白的或者报错,可以留言或者加QQ群140455228交流

Electron应用使用electron-builder配合electron-updater实现自动更新(windows + mac)的更多相关文章

  1. Electron 桌面应用打包(npm run build)简述(windows + mac)

    最近一段时间在用electron+vue做内部项目的一键构建发布系统的桌面应用,现就其中打包流程写个备注,以示记录. Windows环境打包:1.首先贴一下package.json. { " ...

  2. 【原创】从零开始搭建Electron+Vue+Webpack项目框架(五)预加载和Electron自动更新

    导航: (一)Electron跑起来(二)从零搭建Vue全家桶+webpack项目框架(三)Electron+Vue+Webpack,联合调试整个项目(四)Electron配置润色(五)预加载及自动更 ...

  3. 【Electron】在 WSL2 中 打包 electron Linux 版本

    [Electron]在 WSL2 中 打包 electron Linux 版本. 安装 WSL 我使用的是 Ubuntu 20.04.4 LTS 的版本. 安装 WSL 文档地址:https://do ...

  4. electron开发 - mac平台的打包和签名 - 针对electron-builder的自动更新

    配合自动更新 - 安装包签名(mac)(待补充) 前提:实现自动更新需要签名 一.本地开发调试mac签名(无需具有权限的appple账号) 打开xcode,xcode -> preference ...

  5. Electron+React+七牛云 实战跨平台桌面应用(最新更新)

    课程资料获取链接:点击这里 前市场上对 Electron 的呼声很高,它几乎是 Web 开发人员开发桌面客户端的唯一途径,很多大厂都使用 Electron 开发自己的原生应用.Electron 天生适 ...

  6. Electron 的解释, 什么是Electron

    https://wizardforcel.gitbooks.io/electron-doc/content/development/build-instructions-windows.html

  7. Delphi及C++Builder经典图书一览表(持续更新中2018.01.02)

    序号 书名 原版书名 作者 译者 出版社 页数 年代 定价 备注 1 C++Builder 5程序设计大全 C++Builder 5 Developer's Guide Jarrod Hollingw ...

  8. C++ Builder平台使用Indy9开发自动FTP程序01

    Indy9与CB自带的Indy8不同处还是挺多的.首先就是图标变漂亮了,其次很多Method都重写了.它主要是依据Delph里的函数,力求与之相通.不同点在本系列的后续章节中会一一介绍. 在写ftp代 ...

  9. 使用VScode配合chrome实现网页自动刷新

    1.使用插件:livereload 2.VScode商店中搜索上述插件安装 3.Chrome商店中搜素上述插件安装 并设置允许访问文件网址: 4.在两方插件都打开的情况下,VScode中按下ctrl+ ...

随机推荐

  1. spring官方学习地址

    1.http://projects.spring.io/spring-framework/ 2.https://github.com/spring-projects/spring-mvc-showca ...

  2. linux数据库环境搭建

    linux数据库源码下载地址:http://www3.sqlite.org/download.html 下载完成之后,把源码放到linux下的目录,我们一步一步来搭建环境: 1.使用命令解压源码包 u ...

  3. Machine Learning - week 1

    Matrix 定义及基本运算 Transposing To "transpose" a matrix, swap the rows and columns. We put a &q ...

  4. CTF---密码学入门第二题 我喜欢培根

    我喜欢培根分值:20 来源: Ph0enix 难度:中 参与人数:3449人 Get Flag:1410人 答题人数:1653人 解题通过率:85% key: CTF{} 解题链接: http://c ...

  5. Java面向对象抽象类案例分析

    /** 雇员示例: 需求:公司中程序员有姓名,工号,薪水,工作内容 项目经理除了有姓名,工号,薪水还有奖金,工作内容 对给出需求进行数据建模 分析: 在这个问题领域中,先找出涉及的对象 通过名词提炼法 ...

  6. AtCoder Beginner Contest 069【A,水,B,水,C,数学,D,暴力】

    A - K-City Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement In K-city, ...

  7. hdu_1034(模拟题)

    很久没有打模拟题了,再次总结一下模拟题的做法: 仔细分析题意,弄清楚过程 理清楚模拟步骤,严格按照步骤编写代码 添加中间输出测试每步结果 虽然这是一个很简单的水题,但是没有松哥帮忙还是卡了很久,因为没 ...

  8. hbmy周赛1--E

    E - Combination Lock Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I6 ...

  9. JXLS 2.4.0系列教程(一)——最简单的模板导出

    Java中实现excel根据模板导出数据的方法有很多,一般简单的可以通过操作POI进行.还可以使用一些工具很轻松的实现模板导出.这些工具现在还在维护,而且做得比较好的国内的有easyPOI,国外的就是 ...

  10. [国嵌攻略][065][DM9000驱动程序设计]

    移植代码:通过已有的可用的代码修改到新环境下运行. 代码编写: 初始化网卡 1.选中网卡 nLAN_CS BWSCON(0x48000000) DW4:01 16bit BANKCON4(0x4800 ...