当前位置:网站首页>Electron应用使用electron-builder配合electron-updater实现自动更新
Electron应用使用electron-builder配合electron-updater实现自动更新
2020-11-06 01:22:00 【:::::::】
开发客户端一定要做的就是自动更新模块,否则每次版本升级都是一个头疼的事。 下面是Electron应用使用electron-builder配合electron-updater实现自动更新的解决方案。
1.安装 electron-updater 包模块
npm install electron-updater --save
2.配置package.json文件 2.1 为了打包时生成latest.yml文件,需要在 build 参数中添加 publish 配置。
"build": { "productName": "***",//隐藏软件名称 "appId": "**",//隐藏appid "directories": { "output": "build" }, "publish": [ { "provider": "generic", "url": "http://**.**.**.**:3002/download/",//隐藏版本服务器地址 } ], "files": [ "dist/electron/**/*" ], "dmg": { "contents": [ { "x": 410, "y": 150, "type": "link", "path": "/Applications" }, { "x": 130, "y": 150, "type": "file" } ] }, "mac": { "icon": "build/icons/icon.icns", "artifactName": "${productName}_setup_${version}.${ext}" }, "win": { "icon": "build/icons/icon.ico", "artifactName": "${productName}_setup_${version}.${ext}" }, "linux": { "icon": "build/icons", "artifactName": "${productName}_setup_${version}.${ext}" } }
注意:配置了publish才会生成latest.yml文件,用于自动更新的配置信息;latest.yml文件是打包过程生成的文件,为避免自动更新出错,打包后禁止对latest.yml文件做任何修改。如果文件有误,必须重新打包获取新的latest.yml文件!!!
2.2 增加nsis配置(可省略) nsis配置不会影响自动更新功能,但是可以优化用户体验,比如是否允许用户自定义安装位置、是否添加桌面快捷方式、安装完成是否立即启动、配置安装图标等。nsis 配置也是添加在 build 参数中。
"nsis": { "oneClick": true, "perMachine": true, "allowElevation": true, "allowToChangeInstallationDirectory": true, "createDesktopShortcut": true, "runAfterFinish": true, "installerIcon": "./build/icon.ico", "uninstallerIcon": "./build/icon.ico" },
3.配置主进程main.js文件(或主进程main中的index.js文件),引入 electron-updater 文件,添加自动更新检测和事件监听: 注意:一定要是主进程main.js文件(或主进程main中的index.js文件),否则会报错。
import { app, BrowserWindow, ipcMain } from 'electron' // 注意这个autoUpdater不是electron中的autoUpdater import { autoUpdater } from "electron-updater" import {uploadUrl} from "../renderer/config/config"; // 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写 function updateHandle() { let message = { error: '检查更新出错', checking: '正在检查更新……', updateAva: '检测到新版本,正在下载……', updateNotAva: '现在使用的就是最新版本,不用更新', }; const os = require('os'); autoUpdater.setFeedURL(uploadUrl); autoUpdater.on('error', function (error) { sendUpdateMessage(message.error) }); autoUpdater.on('checking-for-update', function () { sendUpdateMessage(message.checking) }); autoUpdater.on('update-available', function (info) { sendUpdateMessage(message.updateAva) }); autoUpdater.on('update-not-available', function (info) { sendUpdateMessage(message.updateNotAva) }); // 更新下载进度事件 autoUpdater.on('download-progress', function (progressObj) { mainWindow.webContents.send('downloadProgress', progressObj) }) autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) { ipcMain.on('isUpdateNow', (e, arg) => { console.log(arguments); console.log("开始更新"); //some code here to handle event autoUpdater.quitAndInstall(); }); mainWindow.webContents.send('isUpdateNow') }); ipcMain.on("checkForUpdate",()=>{ //执行自动更新检查 autoUpdater.checkForUpdates(); }) } // 通过main进程发送事件给renderer进程,提示更新信息 function sendUpdateMessage(text) { mainWindow.webContents.send('message', text) }
注:在添加自动更新检测和事件监听之后,在主进程createWindow中需要调用一下updateHandle()。如下图所示:
4.在视图(View)层中触发自动更新,并添加自动更新事件的监听。 触发自动更新:
ipcRenderer.send("checkForUpdate");
监听自动更新事件:
import { ipcRenderer } from "electron"; ipcRenderer.on("message", (event, text) => { console.log(arguments); this.tips = text; }); //注意:“downloadProgress”事件可能存在无法触发的问题,只需要限制一下下载网速就好了 ipcRenderer.on("downloadProgress", (event, progressObj)=> { console.log(progressObj); this.downloadPercent = progressObj.percent || 0; }); ipcRenderer.on("isUpdateNow", () => { ipcRenderer.send("isUpdateNow"); });
注意:子进程中“downloadProgress”事件可能出现无法触发的问题,那是因为下载速度很快,就会跳过“downloadProgress”事件;只需要限制一下本地下载网速就好了!
为避免多次切换页面造成监听的滥用,切换页面前必须移除监听事件:
//组件销毁前移除所有事件监听channel ipcRenderer.removeAll(["message", "downloadProgress", "isUpdateNow"]);//remove只能移除单个事件,单独封装removeAll移除所有事件
5.项目打包 执行electron-builder进行打包,windows下会生成安装包exe和latest.yml等文件,执行exe安装软件;Mac下会生成安装包dmg、zip和latest-mac.yml文件,执行dmg安装软件。 注意:mac上不签名也可以打包成功,但是涉及到自动更新等需要身份认证的功能则不能用,也不能发布到mac app store中。所以说经过代码签名的MAC包才是完整的包。我们这里一定是经过代码签名的完整包!切记! 具体打包流程请参考:Electron 桌面应用打包(npm run build)简述(windows + mac) MAC打包中报Error: Could not get code signature for running application错误可参考:Electron 打包Mac安装包代码签名问题解决方案 windows打包生成文件:
Mac打包生成文件:
6.软件升级版本,修改package.json中的version属性,例如:改为 version: “1.1.0” (之前为1.0.0); 7.再次执行electron-builder打包,Windows下将新版本latest.yml文件和exe文件(MAC下将latest-mac.yml,zip和dmg文件)放到package.json中build -> publish中的url对应的地址下; 8.在应用中触发更新检查,electron-updater自动会通过对应url下的yml文件检查更新;
windows上自动更新示例:
mac上自动更新示例:
附:项目目录层次:
如果这篇文章对你的工作或者学习有帮助的话,请收藏或点个赞。如果对其中有什么不明白的或者报错,可以留言或者加交流。
注意:请支持原创,本文谢绝转载,确有需要可链接到本文。本文链接地址:https://segmentfault.com/a/11...
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
版权声明
本文为[:::::::]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1715163
边栏推荐
- 做外包真的很难,身为外包的我也无奈叹息。
- Polkadot series (2) -- detailed explanation of mixed consensus
- ipfs正舵者Filecoin落地正当时 FIL币价格破千来了
- 安装Anaconda3 后,怎样使用 Python 2.7?
- 基於MVC的RESTFul風格API實戰
- Elasticsearch database | elasticsearch-7.5.0 application construction
- Cos start source code and creator
- 连肝三个通宵,JVM77道高频面试题详细分析,就这?
- Technical director, to just graduated programmers a word - do a good job in small things, can achieve great things
- (1) ASP.NET Introduction to core3.1 Ocelot
猜你喜欢
随机推荐
6.9.2 session flashmapmanager redirection management
Jmeter——ForEach Controller&Loop Controller
DevOps是什么
Flink的DataSource三部曲之二:内置connector
简直骚操作,ThreadLocal还能当缓存用
做外包真的很难,身为外包的我也无奈叹息。
C++和C++程序员快要被市场淘汰了
Asp.Net Core learning notes: Introduction
3分钟读懂Wi-Fi 6于Wi-Fi 5的优势
Technical director, to just graduated programmers a word - do a good job in small things, can achieve great things
用Python构建和可视化决策树
Use of vuepress
Basic principle and application of iptables
Existence judgment in structured data
文本去重的技术方案讨论(一)
使用NLP和ML来提取和构造Web数据
【新閣教育】窮學上位機系列——搭建STEP7模擬環境
前端模組化簡單總結
The practice of the architecture of Internet public opinion system
tensorflow之tf.tile\tf.slice等函数的基本用法解读