文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
全量升级
使用 electron-updater 模块来完成升级功能,安装这个模块:
npm install electron-updater -D
创建 Updater.ts 封装 Updater 类:
src/main/Updater.ts
import { dialog } from 'electron';
import { autoUpdater} from 'electron-updater';
export class Updater {
static check() {
autoUpdater.checkForUpdates();
autoUpdater.on('update-downloaded', async () => {
await dialog.showMessageBox({
message: '有可用的升级',
});
autoUpdater.quitAndInstall();
});
}
}
Updater 类提供了一个方法 check,在这个方法中,让 autoUpdater 对象检查服务端是否存在新版本的安装包,并监听 update-downloaded 事件。
一旦 autoUpdater 发现服务端存在更新的安装包,则会把安装包下载到用户本地电脑内,当新版本安装包下载完成后,update-downloaded 事件被触发。此时提醒用户“有可用的升级”,用户确认后就退出当前应用并安装新的安装包。
在升级过程有以下几点需要注意:
- 升级服务的地址是在制作安装包时,通过 config.publish.url 指定的,这个路径指向新版本安装包所在的服务器目录。
src/plugins/buildPlugin.ts
publish: [{ provider: "generic", url: "http://localhost:5500/" }]
- 当完成新版本的开发工作后,要把 release 目录下的 [your_project_name] Setup [your_project_version].exe 和 latest.yml 两个文件上传到第 1 点中指定的服务器地址下(这是 Windows 平台下的工作)。Mac 平台下要把 release 目录下的 [your_project_name]-[your_project_version]-mac.zip、[your_project_name]-[your_project_version].dmg 和 latest-mac.yml 三个文件上传到指定的服务器地址下。
- 产品版本是通过 package.json 中的 version 属性指定的,产品的安装包的版本也是在这里指定的。
- 通过 dialog.showMessageBox 提醒用户升级程序实在称不上美观,这里应该发消息给渲染进程,让渲染进程弹出一个更漂亮的升级提醒窗口。用户做出选择后,再由渲染进程发消息给主进程,再执行 autoUpdater.quitAndInstall 逻辑。
- 在 app ready 事件发生之后再调用 Updater.check() 方法,而且应该在生产环境下调用,因为在开发环境下调用它没有任何意义,electron-updater 库会给出如下错误提示:
src/main/mainEntry.ts
import {app, BrowserWindow} from 'electron';
import {CustomScheme} from "./CustomScheme";
import { Updater } from "./Updater";
import {CommonWindowEvent} from "./CommonWindowEvent";
process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = 'true';
let mainWindow: BrowserWindow;
app.on("browser-window-created", (e, win) => {
CommonWindowEvent.regWinEvent(win);
});
app.whenReady().then(() => {
let config = {
frame: false,
show: false,
webPreferences: {
nodeIntegration: true,
webSecurity: false,
allowRunningInsecureContent: true,
contextIsolation: false,
webviewTag: true,
spellcheck: false,
disableHtmlFullscreenWindowResize: true,
nativeWindowOpen: true,
},
};
mainWindow = new BrowserWindow(config);
mainWindow.webContents.openDevTools({mode: 'undocked'});
if (process.argv[2]) {
mainWindow.loadURL(process.argv[2]);
} else {
CustomScheme.registerScheme();
mainWindow.loadURL('app"//index.html');
// Updater.check();
}
CommonWindowEvent.listen();
});
Skip checkForUpdatesAndNotify because application is not packed
- 最好让升级服务地址下始终有一个安装包和相应的配置文件,不然 checkForUpdates 方法会报错。
- latest.yml 的文件内包含如下几个信息:新版本安装文件的版本号、文件名、文件的 sha512 值、文件大小、文件生成时间、执行新版本安装文件时是否需要管理员权限。
当 autoUpdater.checkForUpdates() 方法执行时,会先请求这个 yml 文件,得到文件里的内容后,再拿此文件中的版本号与当前版本号对比,如果此文件中的版本号比当前版本号新,则下载新版本,否则就退出更新逻辑。
当新版本安装包下载完成后,electron-updater 会验证文件的 sha512 值是否合法,yml 文件中包含新版本安装包的 sha512 值,electron-updater 首先计算出下载的新版本安装包的 sha512 值,然后再与 yml 文件中的 sha512 值对比,两个值相等,则验证通过,不相等则验证不通过。
验证通过后 Electron 则使用 Node.js 的 child-process 模块启动这个新的安装文件,以完成应用程序升级工作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论