macOS 分发与自动更新
口径说明
融云公开文档不覆盖 macOS 原生 SDK 与桌面交付链(dmg / 代码签名 / 公证 / 分发 / Gatekeeper);本页为本项目按 Apple 与 Electron 官方实践补齐的接入文档。
分发环节决定用户能否“下载 → 拖入 Applications → 双击可用”。macOS 推荐分发已签名并公证的 `.dmg`;自动更新按需接入,更新包同样需要签名与公证。
分发产物
| 产物 | 用途 | 要求 |
|---|---|---|
| ` | Intel Mac 下载 | 签名 + 公证 + stapling |
| ` | Apple Silicon 下载 | 签名 + 公证 + stapling |
| ` | 单包覆盖两种架构 | 体积大;签名 + 公证 + stapling |
| `latest-mac.yml` | 自动更新元数据(按需) | 版本、文件地址、sha512 |
| `*.dSYM` | 崩溃符号化 | 归档,不随用户分发 |
发布检查清单
- 版本号与 `package.json` / `Info.plist` 一致(`CFBundleShortVersionString`、`CFBundleVersion`)。
- `.app` 已用 Developer ID 签名并开启 hardened runtime。
- `.app` 与 `.dmg` 均已公证并 stapling(`spctl` 显示 accepted)。
- 在干净机器(未安装任何开发证书)上验证:下载 → 挂载 → 拖入 Applications → 双击启动 → 登录收发。
- 生成 SHA-256 校验值并随下载页公布。
- 归档构建日志、签名证书指纹、公证 submission id 与 dSYM。
Shell
shasum -a 256 "dist/My Desktop-0.1.0-arm64.dmg"
# 输出示例:9f2c... dist/My Desktop-0.1.0-arm64.dmg自动更新(按需接入)
桌面端可在主进程接入 electron-updater:启动后检查更新源,发现新版本时下载签名包并在下次启动安装。更新源可以是静态文件服务器(`latest-mac.yml` + dmg)或对象存储;关键是更新包与主包使用同一张 Developer ID 证书签名。
JavaScript
// main.mjs:按需启用自动更新(示例使用 electron-updater)
import { autoUpdater } from 'electron-updater';
autoUpdater.autoDownload = true;
autoUpdater.autoInstallOnAppQuit = true;
autoUpdater.on('update-available', (info) => broadcast('im:update-available', info));
autoUpdater.on('update-downloaded', (info) => broadcast('im:update-ready', info));
app.whenReady().then(() => {
// 仅打包后的应用检查更新;开发态跳过
if (app.isPackaged) autoUpdater.checkForUpdatesAndNotify();
});自动更新的安全前提
更新包必须由同一 Developer ID 证书签名并通过公证,否则安装会被系统拒绝。
更新源需支持 HTTPS 与断点续传;`latest-mac.yml` 中的 sha512 必须与实际文件一致。
重大版本升级前建议在应用内提示备份本地库,并保留回滚到上一版本的下载入口。
灰度与回滚
| 策略 | 做法 |
|---|---|
| 分批放量 | 更新源按渠道(stable / beta)分目录,客户端按配置选择渠道 |
| 强制升级 | 服务端下发最低支持版本,客户端低于时阻断登录并引导下载 |
| 回滚 | 保留上一版本 dmg 与更新元数据;把 `latest-mac.yml` 指向旧版本即可 |
| 崩溃监控 | 接入崩溃上报并把 dSYM 上传到符号服务器 |