Skip to content

feat: 应用自动更新(GitHub Releases)+ 透明圆角图标 (#23) - #29

Merged
FlashingChen merged 3 commits into
mainfrom
feat/app-updates
Aug 21, 2026
Merged

FlashingChen merged 3 commits into
mainfrom
feat/app-updates

Conversation

@FlashingChen

Copy link
Copy Markdown
Owner

Closes #23

概述

为 DSH Desktop Hub 接入 electron-updater + GitHub Releases 更新通道,并修复应用图标白边。

更新链路

  • 自动检查:打包版启动 8 秒后检查,之后每 6 小时一次;开发模式不联网,明确提示不支持
  • 用户确认autoDownload = falseautoInstallOnAppQuit = false,下载与重启安装均需点击确认
  • 侧边栏 UI:手动检查 / 下载 / 重启安装按钮 + 状态推送(checking / available / downloading / downloaded / error)

安全回退(macOS 未签名)

Squirrel.Mac 需替换整个 app bundle,未签名/ad-hoc 构建无法安全完成。主进程用 codesign -dv 探测签名状态,失败时禁用应用内更新并提示手动下载 DMG;正式签名后同一链路自动启用。

Release 管道修复

  • mac.artifactName 改为连字符安全文件名:默认 ProductName 含空格,导致 latest-mac.yml 引用的 ZIP 与实际上传文件名不一致(更新 404)
  • release 工作流补传 .zip.blockmap(差量下载必需)

并发与错误处理

  • 主进程 installRequested 守卫防重复 quitAndInstall
  • renderer in-flight 锁 + IPC rejection catch;异步安装失败经 error 状态推送复位锁
  • quitAndInstall 包 try/catch,失败推 error 状态

图标

build/icon.png 重生成为透明 RGBA 圆角 PNG,消除 DMG/任务栏四角白边

测试

  • 新增 tests/updates.test.mjs:发布源契约、更新链路契约、图标 RGBA 断言
  • npm run verify 全绿(96/96);Electron smoke 通过;macOS zip 打包验证 latest-mac.yml 与产物文件名一致

Review 说明

已经一轮多 agent code review(10 findings):2 个 correctness 已修(安装锁复位、RGBA 图标随 diff 提交),4 个 cleanup 已采纳(sendPluginEvent 复用、errorText 提取、守卫去重、codesign 结果缓存),3 个经评估暂不做(理由见会话记录),1 个类型重复受构建约束维持现状。

…23)

- electron-updater 集成:发布版启动 8s 后自动检查,之后每 6 小时一次;
  下载与重启安装均需用户确认(autoDownload/autoInstallOnAppQuit = false)
- 侧边栏更新入口:手动检查 / 下载 / 重启安装,含状态推送与错误展示
- 未签名 macOS 安全回退:codesign 探测失败时禁用应用内更新并提示手动
  下载 DMG(Squirrel.Mac 无法安全替换未签名 bundle)
- 修 macOS 更新载荷:mac.artifactName 改为连字符安全文件名(默认
  ProductName 含空格会导致 latest-mac.yml 引用 404);release 工作流
  补传 .zip.blockmap
- 防重复安装:installRequested 主进程守卫 + renderer in-flight 锁
  (异步失败经 error 状态推送复位)+ quitAndInstall try/catch
- 图标改为透明 RGBA 圆角 PNG,消除四角白边
- 新增 tests/updates.test.mjs 契约测试;README/PRD 同步更新
@FlashingChen

Copy link
Copy Markdown
Owner Author

Code Review 结论:✅ 可合并(无阻断项)

已在干净 worktree 实测:npm run verify 全绿(typecheck + build + 96 tests,含新增 tests/updates.test.mjs 3 项),lockfile 与 electron-updater@6.8.9 一致。

亮点

  • 权限模型正确:autoDownload = false + autoInstallOnAppQuit = false,下载/重启均需用户确认;IPC 全部过 assertRendererSender
  • macOS 未签名回退设计好:codesign -dv 探测 Authority= / Signature=adhoc,未签名时禁用应用内更新并引导 DMG,避免「下载了却装不上」
  • 修复真实发布 bug:artifactName 连字符化解决 latest-mac.yml 引用与上传文件名不一致的 404;补传 .zip.blockmap 使差量下载可用
  • 并发处理细致:主进程 installRequested 守卫 + renderer in-flight 锁 + setImmediate 让 IPC 先返回;定时器 unref() + will-quit 清理到位

非阻断问题(建议后续修)

1. 低 · 下载失败后按钮路径断裂renderer.ts
appUpdateDownload.hidden = status.state !== 'available':下载失败进入 error 状态后下载按钮消失,用户必须先重新「检查更新」才能再下载。建议 error 状态下若新版本信息仍在则保留下载按钮。

2. 低 · installRequested 复位过宽updater.ts error 监听
if (installRequested) installRequested = false 对任何 error 事件都会复位,包括安装等待期无关的定时检查失败。窗口极小(安装后应用即退出),但严格来说应只在 quitAndInstall 相关错误时复位。

3. 低 · catch 路径从 DOM 反解版本号renderer.ts 三处
appUpdateVersion?.textContent?.replace(/^v/, '') 用 DOM 文本还原版本号比较脆。建议缓存最近一次 UpdateStatus 直接取 currentVersion

4. 信息 · 契约测试偏脆tests/updates.test.mjs
大量对源码的正则匹配(如 /appUpdateInstalling/),重命名变量就会挂。作为防回归契约可接受,但有维护成本。

5. 信息 · UpdateStatus 类型三处重复
ipc.ts / preload.ts / renderer.ts 各一份。PR 说明受 preload CJS 构建约束维持现状,合理;未来若 preload 构建允许 import type 可消掉两份。

6. 信息 · renderer confirm()
Electron 下可用但同步阻塞渲染进程,当前规模没问题,以后嫌体验糙可换自定义对话框。

1-3 都是几行的改动,可以本 PR 顺手修或留 issue 跟进。

@FlashingChen

Copy link
Copy Markdown
Owner Author

已跟进 review 的 3 个非阻断问题(6e0f78b),并合并 main 解决冲突(1662c90):

  1. 下载失败后按钮路径断裂error 状态下若新版本信息仍在(status.version 存在)保留下载按钮,可直接重试
  2. installRequested 复位过宽 — 收窄为仅在 currentStatus.state === 'downloaded' 时复位,安装等待期的无关检查错误不再重新放开双重点击
  3. catch 路径从 DOM 反解版本号 — 新增 lastUpdateStatus 缓存 + lastKnownVersion(),三处 catch 不再解析 textContent

冲突解决:main 引入的 releaseExitResources()(托盘/autoRestartTimer 清理)与本 PR 的更新定时器清理在 will-quit 中并存。

验证:npm run verify 全绿(96/96),Electron smoke 通过。4-6(信息级)按原评估维持现状。

@FlashingChen
FlashingChen merged commit 43a7588 into main Aug 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[反馈][匿名][建议] 能不能增加一个app更新功能

1 participant