资讯动态

macOS自动更新不再难:Sparkle在FluxMarkdown中的实战落地

发布时间:2026/10/14 15:03:20 来源:尧图企业网站定制
【免费下载链接】flux-markdownMarkdown Preview Enhanced for macOS QuickLook项目地址https://gitcode.com/gh_mirrors/fl/flux-markdown点击查看免费下载FluxMarkdown 是一款运行在 macOS 上的 Markdown 快速预览工具QuickLook 扩展 独立 App它的检查更新能力完全由 Sparkle 框架驱动。本文结合 FluxMarkdown 的真实代码讲清楚 Sparkle 自动更新的完整落地流程从依赖接入、appcast.xml更新源、沙盒权限配置到 EdDSA 签名与密钥轮换的避坑经验。Sparkle 是什么为什么适合 FluxMarkdownSparkle 是 macOS 生态中最成熟的自动更新框架负责定时/手动检查远端更新源appcast.xml下载新版安装包并校验EdDSA 数字签名通过安装器进程Installer替换/Applications下的应用并重启对于 FluxMarkdown 这样的开源项目未使用 Mac App Store 分发渠道Sparkle 是实现应用内一键更新的标准选择。FluxMarkdown 的 QuickLook 预览效果如下用户可以直观看到 Markdown 文档在 Finder 中的渲染结果三步接入依赖、控制器、更新源第 1 步用 Swift Package 引入 Sparkle在 Package.swift 中声明依赖并锁定版本Xcode 工程侧由 project.yml 同步声明.package(url: https://github.com/sparkle-project/Sparkle, exact: 2.8.1)锁定精确版本很关键Sparkle 2.x 的 XPC 服务名、权限模型与 1.x 完全不同随意升级可能导致已安装用户无法更新。第 2 步初始化 SPUStandardUpdaterController在 MarkdownApp.swift 的AppDelegate中只需几行代码即可启动更新器let updaterController SPUStandardUpdaterController( startingUpdater: true, updaterDelegate: UpdateDelegate.shared, userDriverDelegate: nil )Sparkle 2.x 对 SwiftUI 应用推荐的正是SPUStandardUpdaterController1.x 时代的SUUpdater手动组装已被官方放弃。菜单栏中的检查更新按钮通过NSApp.sendAction(#selector(SPUStandardUpdaterController.checkForUpdates(_:)))触发同一套逻辑。第 3 步配置 Info.plist 更新源所有 Sparkle 配置集中在 Info.plist 中关键字段一览键作用SUFeedURLappcast.xml的托管地址必须指向返回 XML 原文的 URLSUPublicEDKey当前公钥用于校验更新包签名SUPublicEDKeyChain新旧公钥链支持密钥轮换过渡SUEnableAutomaticChecks开启自动检查SUScheduledCheckInterval检查间隔本项目为 86400 秒即每天一次SUEnableInstallerLauncherService沙盒应用必需的 XPC 安装服务appcast.xml更新的发布清单Sparkle 检查更新时拉取的 appcast.xml 是一个 RSS 文件每个item对应一个版本核心是enclosure节点enclosure url.../FluxMarkdown.dmg sparkle:edSignaturehu1PmNeX3dpse5... length36738769 typeapplication/octet-stream /其中sparkle:edSignature是用私钥对 DMG 生成的 EdDSA 签名。应用端用SUPublicEDKey公钥验签签名不匹配的安装包会被直接拒绝——这就是为什么下载更新不等于信任更新。 常见坑SUFeedURL若指向网页HTML而非 XML 原文Sparkle 会解析失败。本项目使用 raw 文件地址直接返回 XML避免了这个问题。发布时的更新包安装窗口如下用户只需将应用拖到 Applications后续版本交给 Sparkle沙盒应用的关键entitlements 权限例外FluxMarkdown 启用了 App Sandbox而 Sparkle 的安装器是独立进程必须显式放行才能工作。相关配置在 Markdown.entitlements 与 MarkdownRelease.entitlements 中!-- 允许 Sparkle XPC 服务通信 -- keycom.apple.security.temporary-exception.mach-lookup.global-name/key array string$(PRODUCT_BUNDLE_IDENTIFIER)-spks/string string$(PRODUCT_BUNDLE_IDENTIFIER)-spki/string /array !-- 允许写入 /Applications 完成安装 -- keycom.apple.security.temporary-exception.files.absolute-path.read-write/key array string/Applications/string /array⚠️ 注意服务名必须使用$(PRODUCT_BUNDLE_IDENTIFIER)-spks/-spki的标准格式。本项目早期曾用过自定义服务名com.xykong.Markdown.Installer结果更新时报错An error occurred while running the updater——Sparkle 2.x 只认标准后缀。这个教训完整记录在 LESSONS_SPARKLE_AUTO_UPDATE.md 中。发布流程签名、生成 appcast、发布一次完整的版本发布围绕三个脚本生成密钥generate-sparkle-keys.sh 生成 Ed25519 密钥对私钥严禁提交到仓库签名并更新 appcastgenerate-appcast.sh 调用 Sparkle 的sign_update工具对 DMG 签名自动把版本号、签名、文件大小写入 appcast.xml可恢复发布publish-release.sh 校验清单与公证、生成签名后的 appcast 并创建 Release失败可断点重跑流程细节见 RELEASE_PROCESS.md。用户侧的体验由 UpdateDelegate.swift 的回调串联发现新版本、用户点击下载、即将安装、更新失败……每个状态都有对应的 delegate 方法便于打日志和埋点。细节体验更新后自动恢复上次打开的文件自动更新常打断用户工作流FluxMarkdown 的解法在 UpdateRestorationManager.swift 中打开文档时把文件路径写入UserDefaultsSparkle 回调触发下载/安装前markUpdatePending()打一个更新进行中标记更新完成、应用重启后检测到该标记自动重新打开上次的 Markdown 文件0.5 秒延迟确保窗口就绪文件已被删除等异常情况会优雅降级并清理标记。这套机制让重启安装更新对用户几乎无感。避坑清单从 5 轮调试总结的教训以下问题都来自 LESSONS_SPARKLE_AUTO_UPDATE.md 的真实排障记录建议对照自查现象根因解决An error occurred while launching the installer沙盒缺少安装器启动服务开启SUEnableInstallerLauncherService entitlements 例外An error occurred while running the updaterMach 服务名不是 Sparkle 标准格式改用-spks/-spki后缀The update is improperly signed重新生成密钥后旧版本内嵌旧公钥用SUPublicEDKeyChain同时信任新旧公钥完成渐进式迁移检查更新解析报错SUFeedURL指向 HTML 页面改为返回 XML 原文的 raw 地址两条最重要的经验密钥是单点故障私钥丢失 所有旧用户永久无法更新务必备份到密码管理器或加密存储一定要测旧版本 → 新版本路径项目提供了 test-update-from-old-version.sh、test-update-locally.sh 等脚本模拟真实升级场景只测最新版覆盖安装会漏掉大量兼容性问题。总结一套可复用的 Sparkle 落地清单把 FluxMarkdown 的做法抽象出来就是五步SPM 引入固定版本的 Sparkle 2.xSPUStandardUpdaterController一行启动delegate 接管状态回调Info.plist配好SUFeedURL、公钥必要时SUPublicEDKeyChain、检查间隔entitlements放行-spks/-spki服务与/Applications写入发布时用sign_update签名 DMG脚本化生成appcast.xml并做旧版本升级回归。更多细节可查阅 AUTO_UPDATE.md 的官方说明与 CHANGELOG.md 中的历次更新记录。按这套清单执行你的 macOS 应用也能拥有稳定、安全、可追溯的自动更新体验。赞分享【免费下载链接】flux-markdownMarkdown Preview Enhanced for macOS QuickLook项目地址https://gitcode.com/gh_mirrors/fl/flux-markdown点击查看免费下载相关推荐实时更新模型不再难飞桨流处理系统中的在线更新方案实时更新模型不再难飞桨流处理系统中的在线更新方案 你是否还在为流处理系统中模型更新导致服务中断而烦恼是否因数据分布变化使模型性能持续下降本文将介绍基于飞桨人工智能深度学习计算机视觉NLP语音Sparkle与Xcode集成macOS应用自动更新的终极指南Sparkle与Xcode集成macOS应用自动更新的终极指南 Sparkle是一款专为macOS应用设计的自动更新框架它能帮助开发者轻松实现应用的版本检查桌面应用终极指南10分钟为你的macOS应用集成Sparkle自动更新想让你的macOS应用拥有像专业软件一样的自动更新功能吗 Sparkle 是一个专为macOS设计的软件更新框架让你的应用能够自动检测、下载和安装新版本。这桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑