自动更新系统
**本文引用的文件** - [Sparkle.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/Sparkle.h) - [SPUUpdater.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUUpdater.h) - [SUUpdater.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUUpdater.h) - [SUAppcast.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUAppcast.h) - [SUAppcastItem.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUAppcastItem.h) - [SUUpdaterDelegate.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUUpdaterDelegate.h) - [SPUUpdaterSettings.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUUpdaterSettings.h) - [SPUStandardUpdaterController.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUStandardUpdaterController.h) - [SUErrors.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUErrors.h) - [SUStandardVersionComparator.h](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUStandardVersionComparator.h) - [Info.plist(应用)](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Info.plist)
目录
简介
本文件为基于 Sparkle 框架的自动更新系统技术文档,面向开发者与运维人员,系统性阐述版本管理策略、更新检查流程、下载与安装过程、公钥验证机制、更新通知系统、回滚与恢复策略、更新配置管理、更新源设置与安全性保障,并提供故障排除、手动更新与离线更新支持等实用指南。

项目结构
OpenClaw 应用通过 Sparkle 框架实现自动更新。应用 Info.plist 中包含更新相关的关键配置项,如更新源地址、公钥、自动检查开关等;Sparkle 框架提供更新检查、下载、解包、安装与重启等完整生命周期管理。
OpenClaw 应用
Info.plist 配置
SPUStandardUpdaterController
标准控制器
SPUUpdater
更新调度器
SPUUpdaterSettings
读取/写入用户默认与配置
应用更新源 Appcast
SUAppcast / SUAppcastItem
版本比较与显示
SUStandardVersionComparator
错误与事件通知
SUErrors / 通知中心
用户交互驱动
SPUStandardUserDriver
图表来源
-
SPUStandardUpdaterController.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUStandardUpdaterController.h#L28-L128)
-
SPUUpdaterSettings.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUUpdaterSettings.h#L23-L80)
-
SUAppcastItem.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUAppcastItem.h#L26-L406)
-
SUErrors.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUErrors.h#L24-L108)
-
Info.plist(应用)\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Info.plist#L75-L80)
-
更新控制器:SPUStandardUpdaterController 提供标准 UI 绑定与菜单项校验,封装 SPUUpdater 的使用。
-
更新调度器:SPUUpdater 负责启动、调度、检查更新、下载、解包、安装与重启。
-
设置读取:SPUUpdaterSettings 从用户默认与应用 Info.plist 读取/写入更新参数。
-
应用更新源:SUAppcast 表示应用更新源集合,SUAppcastItem 描述单个更新条目。
-
版本比较:SUStandardVersionComparator 提供默认版本号比较逻辑。
-
错误与通知:SUErrors 定义错误域与错误码,SUUpdaterDelegate 与通知中心提供事件回调。
-
公钥验证:应用 Info.plist 中的 SUPublicEDKey 用于签名验证。
章节来源
-
SPUStandardUpdaterController.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUStandardUpdaterController.h#L28-L128)
-
SPUUpdaterSettings.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUUpdaterSettings.h#L23-L80)
-
SUAppcastItem.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUAppcastItem.h#L26-L406)
-
SUErrors.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUErrors.h#L24-L108)
架构总览
下图展示从应用启动到完成更新的端到端流程,涵盖配置加载、权限提示、检查更新、下载与安装、重启等阶段。
"用户驱动" "版本比较/显示" "SUAppcast/SUAppcastItem" "SPUUpdaterSettings" "SPUUpdater" "SPUStandardUpdaterController" "OpenClaw 应用" "用户驱动" "版本比较/显示" "SUAppcast/SUAppcastItem" "SPUUpdaterSettings" "SPUUpdater" "SPUStandardUpdaterController" "OpenClaw 应用" 初始化并启动 创建并启动 读取自动检查/间隔/下载等设置 加载应用更新源 比较版本/显示版本 弹窗/提醒可选 下载更新包 解包/校验/安装 请求重启/重开
图表来源
-
SPUStandardUpdaterController.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUStandardUpdaterController.h#L78-L128)
-
SPUUpdaterSettings.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUUpdaterSettings.h#L33-L77)
-
SUAppcastItem.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUAppcastItem.h#L26-L406)
详细组件分析
版本管理策略
- 版本字段与比较
- SUAppcastItem 提供 versionString 与 displayVersionString,分别对应 CFBundleVersion 与 CFBundleShortVersionString。
- SUStandardVersionComparator 提供默认版本比较逻辑,适用于 CFBundleVersion 的数值型语义。
- 最低/最高系统版本
- SUAppcastItem 支持 minimumSystemVersion 与 maximumSystemVersion,运行时通过 minimumOperatingSystemVersionIsOK / maximumOperatingSystemVersionIsOK 进行校验。
- 渐进式发布与通道
- phasedRolloutInterval 支持按时间分组推送;channel 字段支持多通道筛选。
- 大升级与跳过策略
- minimumAutoupdateVersion 与 ignoreSkippedUpgradesBelowVersion 控制静默下载/安装与跳过升级记忆行为;isMajorUpgrade 标识是否需要用户确认。
章节来源
-
SUAppcastItem.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUAppcastItem.h#L40-L335)
更新检查流程
- 启动与权限
- SPUUpdater.startUpdater 在配置有效后启动更新周期,可能先弹出权限提示(自动检查)。
- 手动/后台检查
- checkForUpdates 显示进度与结果;checkForUpdatesInBackground 在后台静默检查,不展示无更新界面。
- 探针式检查
- checkForUpdateInformation 不实际安装,仅触发回调以更新 UI。
- 调度与重置
- automaticallyChecksForUpdates 与 updateCheckInterval 决定周期;resetUpdateCycle/resetUpdateCycleAfterShortDelay 用于响应设置变更。
否
是
是
否
开始
启动更新器
是否已授权自动检查?
请求权限
按周期检查
探针式检查/后台检查
发现新版本?
通知/弹窗
等待下次周期
用户选择/静默下载
下载更新包
解包/校验/安装
重启/重开
图表来源
-
SPUUpdater.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUUpdater.h#L71-L156)
章节来源
-
SPUUpdater.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUUpdater.h#L71-L156)
下载与安装过程
- 下载阶段
- willDownloadUpdate/didDownloadUpdate/failure 回调用于跟踪下载状态与错误处理。
- 解包与校验
- willExtractUpdate/didExtractUpdate 回调用于解包前后处理;SUSignatureError/SUValidationError 对应签名与校验失败。
- 安装阶段
- willInstallUpdate/重启前回调;SURelaunchError/SUInstallationError/SUDowngradeError 等错误码覆盖安装失败、降级保护等场景。
- 静默安装
- willInstallUpdateOnQuit 与 immediateInstallationBlock 提供在退出时静默安装的能力。
"安装器" "解包/校验" "下载器" "SPUUpdater" "用户" "安装器" "解包/校验" "下载器" "SPUUpdater" "用户" 触发检查/下载 发起下载 下载完成/失败 解包/校验 校验结果 开始安装 安装完成/错误 通知/重启
图表来源
-
SUUpdaterDelegate.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUUpdaterDelegate.h#L155-L213)
章节来源
-
SUUpdaterDelegate.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUUpdaterDelegate.h#L155-L213)
公钥验证机制
- 配置位置
- 应用 Info.plist 中的 SUPublicEDKey 指定用于验证更新签名的公钥。
- 验证流程
- Sparkle 在解包/安装前对更新包进行签名验证;失败时返回 SUSignatureError 或 SUValidationError。
- 安全建议
- 使用强密钥对;定期轮换;确保仅在可信源发布更新。
章节来源
-
Info.plist(应用)\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Info.plist#L79-L80)
更新通知系统
- 事件通知
- SUUpdaterDidFinishLoadingAppCastNotification/SUUpdaterDidFindValidUpdateNotification/SUUpdaterDidNotFindUpdateNotification/SUUpdaterWillRestartNotification 等通知键用于广播事件。
- 委托回调
- didFindValidUpdate/didNotFindUpdate/didFinishLoadingAppcast 等委托方法提供更细粒度控制。
- 用户驱动
- SPUStandardUserDriver 提供标准 UI 与交互体验。
章节来源
-
SUUpdaterDelegate.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUUpdaterDelegate.h#L26-L41)
回滚与恢复策略
- 降级保护
- SUDowngradeError 保护避免降级安装;可通过版本比较与最小版本要求控制。
- 安装失败处理
- SUInstallationError/SUInstallationCanceledError 等错误码用于识别安装异常;可结合 willInstallUpdateOnQuit 实现"退出时安装"策略。
- 重启与重开
- willInstallUpdate/WillRelaunchApplication 回调中可延迟重启或执行清理任务。
章节来源
-
SUErrors.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUErrors.h#L64-L71)
更新配置管理与更新源设置
- 配置入口
- SUFeedURL 指定主更新源;SUPublicEDKey 指定公钥;SUEnableAutomaticChecks 控制是否启用自动检查。
- 动态切换
- SPUUpdater 支持运行时设置 feedURL(旧接口),但推荐通过 SPUUpdaterDelegate.feedURLStringForUpdater 或 Info.plist 管理。
- 设置持久化
- SPUUpdaterSettings 将用户偏好写入用户默认;SPUUpdater.resetUpdateCycle/resetUpdateCycleAfterShortDelay 用于响应设置变更。
章节来源
-
Info.plist(应用)\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Info.plist#L75-L80)
-
SPUUpdaterSettings.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUUpdaterSettings.h#L33-L77)
-
传输安全
- SUErrors 中包含 SUInsecureFeedURLError/SUInvalidFeedURLError 等错误,提示需使用安全更新源。
-
签名与完整性
- SUSignatureError/SUValidationError 用于检测签名与完整性问题。
-
权限与隐私
- sendsSystemProfile 受用户许可影响;可通过设置关闭匿名系统信息上报。
章节来源
-
SUErrors.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUErrors.h#L30-L47)
依赖关系分析
- 组件耦合
- SPUStandardUpdaterController 依赖 SPUUpdater 与 SPUStandardUserDriver;SPUUpdater 依赖 SPUUpdaterSettings 与 SUAppcast/SUAppcastItem。
- 外部依赖
- 应用通过 Info.plist 注入更新源与公钥;网络访问受 ATS 配置影响。
- 循环依赖
- 未见直接循环依赖;委托回调与通知中心形成松耦合事件链。
"组合"
"读取设置"
"加载更新源"
"包含"
"比较版本"
"回调"
"错误码"
SPUStandardUpdaterController
+updater : SPUUpdater
+userDriver : SPUStandardUserDriver
+checkForUpdates(sender)
SPUUpdater
+automaticallyChecksForUpdates : bool
+updateCheckInterval : NSTimeInterval
+automaticallyDownloadsUpdates : bool
+feedURL : NSURL
+checkForUpdates()
+checkForUpdatesInBackground()
+resetUpdateCycle()
SPUUpdaterSettings
+automaticallyChecksForUpdates : bool
+updateCheckInterval : NSTimeInterval
+automaticallyDownloadsUpdates : bool
+sendsSystemProfile : bool
SUAppcast
+items : [SUAppcastItem]
SUAppcastItem
+versionString : String
+displayVersionString : String
+fileURL : NSURL
+contentLength : UInt64
+minimumSystemVersion : String
+maximumSystemVersion : String
+channel : String
+phasedRolloutInterval : NSNumber
+isMajorUpgrade : bool
SUStandardVersionComparator
+compareVersion(toVersion :)
SUUpdaterDelegate
SUErrors
图表来源
-
SPUStandardUpdaterController.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUStandardUpdaterController.h#L28-L128)
-
SPUUpdaterSettings.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SPUUpdaterSettings.h#L23-L80)
-
SUAppcastItem.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUAppcastItem.h#L26-L406)
-
SUErrors.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUErrors.h#L24-L108)
-
检查频率
- 合理设置 updateCheckInterval,避免过于频繁导致带宽与服务器压力。
-
静默下载
- 在允许的前提下开启 automaticallyDownloadsUpdates,减少用户感知与安装中断。
-
分阶段发布
- 使用 phasedRolloutInterval 控制发布节奏,降低一次性风险。
-
网络与存储
- 监控下载与解包阶段的磁盘空间与网络状况,提前失败优于长时间占用资源。
故障排除指南
- 常见错误与定位
- SUNoPublicDSAFoundError/SUInsufficientSigningError:检查 SUPublicEDKey 是否正确配置。
- SUInsecureFeedURLError/SUInvalidFeedURLError:确保更新源使用 HTTPS。
- SUDownloadError/SUTemporaryDirectoryError:检查网络连通与临时目录权限。
- SUSignatureError/SUValidationError:检查签名完整性与公钥匹配。
- SUInstallationError/SURelaunchError:检查目标路径权限与重启流程。
- 日志与回调
- 通过 didAbortWithError、failedToDownloadUpdate 等委托回调与日志定位问题。
- 重试与回退
- 对于网络波动,可短暂延长 updateCheckInterval 并提示用户稍后重试。
- 离线环境
- 若无法联网,可暂时禁用自动检查;待网络恢复后重新启用。
章节来源
-
SUErrors.h\](file://OpenClaw-2026.1.30/OpenClaw.app/Contents/Frameworks/Sparkle.framework/Versions/B/Headers/SUErrors.h#L29-L101)
结论
该自动更新系统以 Sparkle 为核心,围绕 SPUUpdater 与 SPUStandardUpdaterController 构建了完整的更新生命周期管理。通过应用层的配置(Info.plist)与框架层的委托/通知机制,系统实现了灵活的版本管理、安全的签名验证、可控的下载与安装流程以及完善的错误处理与回滚保护。建议在生产环境中严格遵循安全最佳实践,合理配置更新源与公钥,并根据业务需求调整检查频率与发布策略。
附录
- 手动更新方法
- 通过菜单项触发 SPUStandardUpdaterController.checkForUpdates,或直接调用 SPUUpdater.checkForUpdates。
- 离线更新支持
- 当前框架未提供内置离线安装能力;可在离线环境下准备更新包后,引导用户手动替换安装(需谨慎评估风险与兼容性)。