Ice 自动更新完全指南:两步开启自动检查,理解 Sparkle 背后的机制
【免费下载链接】IcePowerful menu bar manager for macOS项目地址: https://gitcode.com/GitHub_Trending/ice/Ice
Ice 是一款为 macOS 打造的强力菜单栏管理器,它内置了一套基于 Sparkle 框架的自动更新机制。对大多数人来说,最关心的是三件事:怎么开启自动检查更新、开启后它什么时候会动、以及"自动下载"到底会不会自动装好。本文带你把这几个问题一次说清,从设置面板里的两个开关讲起,再深入到源码看它背后的工作流程,最后给出不同使用场景下的推荐配置组合。
从一次"更新提醒"说起:为什么菜单栏工具需要自动更新
菜单栏管理工具的特殊之处在于它长期驻留在系统里:Ice 常驻后台监听系统事件、管理菜单栏图标的排列,一旦升级 macOS 或系统行为发生变化,旧版本很容易出现兼容性小毛病。手动去官网找 dmg 再拖进 Applications 文件夹,对这种"几乎天天在后台跑"的工具来说太频繁了。
所以 Ice 把更新做成了全自动闭环:定期向更新源查询新版本,发现新版本后弹系统通知,通知可直接跳转打开更新流程。整个过程不需要用户记版本号、不需要访问任何网站。
快速上手:两步开启自动检查与自动下载
路径很短:点击菜单栏上的 Ice 图标 → 偏好设置 → 关于面板。对应源码位置是 Ice/Settings/SettingsPanes/AboutSettingsPane.swift,这个面板里有一个"Updates"分区,包含三行内容:
- 第一个开关 "Automatically check for updates"——打开后,Ice 会在后台按 Sparkle 内置的节奏定期访问更新源,无需手动触发。
- 第二个开关 "Automatically download updates"——打开后,一旦检查发现有新版本,安装包会被自动下载到本地,等安装时不必再等下载进度。
- 下方的 "Check for Updates" 按钮——随时手动触发一次检查。按钮右侧的 "Last checked" 文本会显示上次检查的日期,从未检查过时显示 "Never"。
只建议先打开第一个开关。第二个开关按需开启:网络稳定的本地办公机可以开,走公司网络或移动数据为主的环境建议关着,避免在流量受限的场景后台拉取安装包。
它是怎么工作的:三层结构与关键文件位置
把 Ice 的更新功能拆开看,是清晰的三层结构,每层都有对应的源码位置:
界面层。也就是刚才的"关于"面板,只负责展示两个开关和"检查更新"按钮,不直接做任何网络请求。
管理层。Ice/Updates/UpdatesManager.swift 是整个更新机制的中枢。它持有一个SPUStandardUpdaterController(Sparkle 的更新控制器),并把 Sparkle 的automaticallyChecksForUpdates、automaticallyDownloadsUpdates两个属性封装成可直接绑定的属性供界面读写。它还暴露了lastUpdateCheckDate,这就是面板里 "Last checked" 数字的来源。
框架层。Sparkle 负责真正的事:访问更新源、校验签名、下载和安装。Ice 只做了两件事把 Sparkle 接进来:
- 在 Ice/Info.plist 中写入
SUFeedURL,指向官方维护的 appcast 更新源(XML 格式的版本清单); - 同文件中的
SUPublicEDKey保存了 EdDSA 验签公钥,Sparkle 用它校验每个安装包的数字签名,确保下载内容来自官方且未被篡改。
两个开关背后还有一个容易被忽略的细节:UpdatesManager实现了SPUStandardUserDriverDelegate协议。当后台检查发现新版本、且这次检查不是用户主动发起的,它会调用 UserNotificationManager 推送一条标题为 "A new update is available" 的系统通知,并把版本号写进正文。也就是说,你不需要盯着 Ice 的窗口,只要系统通知开着,更新就会"找上门"。
常见技巧与避坑
DEBUG 模式下点"检查更新"没有反应,这不是 bug。UpdatesManager.checkForUpdates()里有一段明确的调试分支:源码注释写着 "Checking for updates hangs in debug mode",所以 Xcode 直接运行的构建只会弹一个提示框,不会真正检查。想体验完整流程请使用正式发行的版本。
"自动下载"≠"自动安装"。第二个开关只负责把新版本安装包拉下来,安装动作(重启应用、替换旧版本)仍然由用户确认。这是有意的设计:菜单栏工具常驻后台,自动静默替换正在运行的程序风险较高。
通知点一下就能直达检查。在 UserNotificationManager.swift 的 delegate 实现里,点击 "UpdateCheck" 通知会直接回调updatesManager.checkForUpdates()。所以推荐工作流是:后台检查发现新版本 → 弹通知 → 点通知 → 进入更新流程,全程不用找设置窗口。
想收到通知,需要先授权。UpdatesManager在 Sparkle 调度定期检查的回调里会请求通知权限(badge、alert、sound)。如果你从没在"系统设置 → 通知"里给 Ice 开过权限,更新提醒就不会出现,只能靠 "Last checked" 和手动检查确认状态。
网络环境决定检查体验。更新源走的是官方 appcast 的固定地址,网络不通时检查会静默失败,但界面不会报错,"Last checked" 依然会刷新——别把它当作"已确认为最新版"的信号,它只表示"发起过一次检查"。
推荐配置:三种场景怎么选
日常主力机:两个开关都打开。检查频率交给 Sparkle 的内置节奏,下载自动完成,等系统通知出现时一键确认安装即可。这是最省心的组合。
移动办公 / 公司网络:只开"自动检查"。检查请求本身很小,而安装包体积不小,把下载留到你连上稳定 Wi-Fi 后手动点一次 "Check for Updates" 触发。
开发者:记住 DEBUG 构建不检查更新这一条就够。平时用发行版测试更新流程,Xcode 里跑的功能调试版不需要关心这块。
一句话回顾
Ice 的自动更新 = Sparkle 框架 + 两个开关 + 一条系统通知:进"关于"面板打开 "Automatically check for updates"(稳定网络再加 "Automatically download updates"),之后就能坐等更新通知了。如果还没开,现在就打开 Ice 的偏好设置,一分钟搞定。
【免费下载链接】IcePowerful menu bar manager for macOS项目地址: https://gitcode.com/GitHub_Trending/ice/Ice
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考