Electron自动更新在Mac上总是失败怎么办?

UI诗语 阅读 78

我用Electron做了一个桌面应用,集成了electron-updater来做自动更新。Windows上测试没问题,但Mac用户反馈一直卡在“checking for updates”,日志里也没报错。我签名和公证都做了,发布到GitHub Releases的版本也打了tag,不知道是不是配置哪里有问题?

这是我的main.js里的更新逻辑:

const { app, BrowserWindow } = require('electron');
const { autoUpdater } = require('electron-updater');

app.whenReady().then(() => {
  autoUpdater.checkForUpdatesAndNotify();
  autoUpdater.on('update-available', () => {
    console.log('有新版本');
  });
});
我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
怡辰(打工版)
首先你要检查一下 electron-updater 的配置,尤其是对于 Mac 平台的一些特定设置。有时候默认配置可能不适用于所有情况。你可以在你的 main.js 文件中添加一些详细的配置选项,确保它们适合你的项目。这里有一个示例,包含了几个重要的配置项:

pre class="pure-highlightjs line-numbers">const { app, BrowserWindow } = require('electron');
const { autoUpdater } = require('electron-updater');

// 设置 autoUpdater 的日志输出,方便调试
autoUpdater.logger = require('electron-log');
autoUpdater.logger.transports.file.level = 'info';

// 配置 autoUpdater
autoUpdater.setFeedURL({
provider: 'github',
repo: 'your-repo-name', // 替换为你的 GitHub 仓库名称
owner: 'your-github-username', // 替换为你的 GitHub 用户名或组织名
private: false, // 如果你的仓库是私有的,这里需要设置为 true
token: 'your-github-token', // 如果仓库是私有的,需要提供一个有权限访问的 token
});

app.whenReady().then(() => {
// 检查更新并通知用户
autoUpdater.checkForUpdatesAndNotify();

// 监听更新事件
autoUpdater.on('checking-for-update', () => {
console.log('正在检查更新...');
});

autoUpdater.on('update-available', (info) => {
console.log('发现新版本:', info.version);
});

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

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

autoUpdater.on('download-progress', (progressObj) => {
let log_message = "下载进度: " + Math.round(progressObj.percent) + "%";
log_message = log_message + " (" + progressObj.transferred + "/" + progressObj.total + ")";
console.log(log_message);
});

autoUpdater.on('update-downloaded', (info) => {
console.log('更新已下载,即将安装...');
// 安装更新
autoUpdater.quitAndInstall(false, true);
});
});


这段代码中,我们做了几件事:

1. 设置了 autoUpdater 的日志记录,方便排查问题。
2. 使用 setFeedURL 方法配置了更新源,确保它指向正确的 GitHub 仓库。
3. 添加了一些事件监听器,用于跟踪更新过程中的各个阶段,包括错误处理。

接下来,你要确认以下几个方面:

1. 确保你的 GitHub 仓库中的发布版本标签命名格式正确,通常是 v1.0.0 这样的格式。
2. 检查发布版本中是否包含了正确的更新文件(例如,.zip 或 .dmg 文件),并且这些文件的文件名应该包含版本号。
3. 如果你是第一次部署,可能需要给用户手动安装一次应用,之后才能自动更新。

希望这些信息能帮到你,如果有其他问题,再继续找我吧。
点赞
2026-03-21 21:02
シ国玲
シ国玲 Lv1
你的代码有两个致命问题,导致Mac上根本跑不起来。

第一个问题是没设置feedUrl。 autoUpdater根本不知道去哪找更新包,Windows能跑是因为你可能用的是本地测试或者打包时自动带了配置。Mac上必须显式设置:

autoUpdater.setFeedUrl({
provider: 'github',
owner: '你的GitHub用户名',
repo: '你的仓库名'
});


第二个问题是事件监听顺序错了。 你是先调用checkForUpdatesAndNotify(),然后再设置监听器,这时候事件早就发完了,你当然收不到。必须先监听,再检查更新。

完整写法是这样的:

const { app, BrowserWindow } = require('electron');
const { autoUpdater } = require('electron-updater');

// 先设置feedUrl
autoUpdater.setFeedUrl({
provider: 'github',
owner: '你的用户名',
repo: '你的仓库名'
});

// 先监听所有事件
autoUpdater.on('checking-for-update', () => {
console.log('检查更新中');
});

autoUpdater.on('update-available', (info) => {
console.log('有新版本:', info.version);
});

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

autoUpdater.on('error', (err) => {
console.error('更新出错:', err.message); // 加这个你才能看到错误
});

autoUpdater.on('download-progress', (progress) => {
console.log(下载进度: ${progress.percent.toFixed(1)}%);
});

autoUpdater.on('update-downloaded', () => {
console.log('下载完成,重启后自动安装');
});

app.whenReady().then(() => {
// 最后才调用检查
autoUpdater.checkForUpdatesAndNotify();
});


加上error监听器后,你再跑一次,看控制台具体报什么错。Mac上常见的问题还有:

1. 签名不匹配 - Mac对代码签名要求很严,autoUpdater的版本必须和当前安装的版本用同一套证书签名
2. 公证问题 - 虽然你做了公证,但有时候electron-builder生成的zip包结构不对会导致验证失败
3. tag没同步 - GitHub Releases的tag必须和package.json里的version一致

你先加上feedUrl和error监听跑一次,看日志里具体报什么错。
点赞
2026-03-18 11:07