返回介绍

全量升级

发布于 2024-09-11 01:11:56 字数 3430 浏览 0 评论 0 收藏 0

使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文