如何使用 electron-updater 实现静默自动更新功能

文章导读
electron-updater 在 Windows NSIS 包上支持较好,macOS 因系统限制通常无法完全静默,需用户授权或重启确认。
📋 目录
  1. 核心配置文件
  2. 主进程完整代码实现
  3. 代码签名与权限配置
  4. 验证与调试方法
  5. 平台差异与常见坑
  6. 参考来源
A A

electron-updater 在 Windows NSIS 包上支持较好,macOS 因系统限制通常无法完全静默,需用户授权或重启确认。

先说结论:静默更新在 Windows 上最成熟,其他平台需处理权限和重启逻辑,生产环境务必先测试升级路径。

  • 适合:内部工具、企业分发或强管控场景,公开分发需谨慎对待用户感知
  • 先准备:有效的代码签名证书、稳定的发布渠道配置
  • 验收:覆盖多系统版本,验证断点续传和回滚机制

核心配置文件

在项目根目录创建 electron-builder.yml 或在 package.json 中配置 build 字段。重点配置 publish 更新源和平台特定参数:

如何使用 electron-updater 实现静默自动更新功能
appId: com.example.app
productName: MyElectronApp
publish:
  - provider: generic
    url: https://example.com/update
    channel: latest
win:
  target:
    - target: nsis
      arch:
        - x64
  artifactName: ${productName}-Setup-${version}.${ext}
  certificateSubjectName: "Your Company Name"
mac:
  target:
    - target: dmg
      arch:
        - x64
        - arm64
  identity: "Your Developer ID"
  hardenedRuntime: true
  gatekeeperAssess: false

注意:Windows 需配置 certificateSubjectName 匹配证书主题,macOS 需配置 identity 并开启 hardenedRuntime 以满足 Gatekeeper 要求。

主进程完整代码实现

在主进程文件(如 main.js)中初始化 autoUpdater。确保在 app.ready 之后执行,并处理所有关键事件:

如何使用 electron-updater 实现静默自动更新功能
const { autoUpdater } = require('electron-updater');

function initUpdater() {
  // 禁止自动下载,手动控制流程更可控
  autoUpdater.autoDownload = false;
  autoUpdater.autoInstallOnAppQuit = true;

  autoUpdater.on('checking-for-update', () => {
    console.log('检查更新中...');
  });

  autoUpdater.on('update-available', (info) => {
    console.log('发现新版本:', info.version);
    // 生产环境可自动下载,或提示用户
    autoUpdater.downloadUpdate();
  });

  autoUpdater.on('update-not-available', (info) => {
    console.log('当前已是最新版本');
  });

  autoUpdater.on('error', (err) => {
    console.error('更新错误:', err);
  });

  autoUpdater.on('update-downloaded', (info) => {
    console.log('更新包下载完成,准备安装');
    // 第一个参数 isSilent 控制是否静默,第二个参数 isForceRunAfter 控制安装后是否重启
    // Windows NSIS 支持较好,macOS 可能仍需用户确认
    autoUpdater.quitAndInstall(true, false);
  });
}

app.on('ready', () => {
  // 生产环境才检查更新
  if (process.env.NODE_ENV === 'production') {
    initUpdater();
    autoUpdater.checkForUpdatesAndNotify();
  }
});

代码签名与权限配置

更新失败最常见的原因是签名缺失。Windows 未签名会触发 UAC 弹窗甚至被杀软拦截,macOS 未签名无法通过 Gatekeeper 导致安装失败。

如何使用 electron-updater 实现静默自动更新功能
  • Windows:购买 EV 代码签名证书,在 electron-builder 配置中指定 certificateSubjectName 或使用 CSC_LINK 环境变量导入证书。
  • macOS:需 Apple Developer 账号,配置 CSC_NAMECSC_LINK,并启用 Notarization(公证)以避免系统拦截。

验证与调试方法

开发阶段开启 debug 日志可查看详细更新流程。在终端执行以下命令启动应用:

DEBUG=electron-updater npm start

验证步骤:

  1. 打包旧版本(如 1.0.0)并安装运行。
  2. 发布新版本(如 1.0.1)到配置更新源。
  3. 观察控制台日志是否触发 update-downloaded
  4. 应用重启后,检查版本号是否变更,并查看应用数据目录下的 pending 文件夹是否清空。

平台差异与常见坑

  • quitAndInstall 参数:第一个参数控制是否静默(isSilent),第二个参数控制安装后是否强制重启运行(isForceRunAfter)。错误配置可能导致更新后不重启或弹窗。
  • 更新死循环:确保版本比较逻辑正确,发布渠道配置一致,避免客户端认为始终有新版本。
  • 网络环境:内网环境需配置私有更新源(如 S3 或内部 HTTP 服务器),默认 GitHub 在国内可能超时。
  • macOS 限制:macOS 上静默安装可能需要额外权限配置,且通常无法完全绕过用户确认,需做好交互提示。

参考来源

  • electron-builder 官方文档,Auto Update 章节,URL: https://www.electron.build/auto-update
  • electron-updater GitHub 仓库,Issues 与 Wiki,URL: https://github.com/electron-userland/electron-builder