ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Dorso 双渠道发布流水线完全指南:代码签名、公证、Sparkle 自动更新与 App Store 私有 API 剔除

Dorso 双渠道发布流水线完全指南:代码签名、公证、Sparkle 自动更新与 App Store 私有 API 剔除 Dorso 双渠道发布流水线完全指南代码签名、公证、Sparkle 自动更新与 App Store 私有 API 剔除【免费下载链接】dorsoA macOS app that blurs your screen when you slouch.项目地址: https://gitcode.com/gh_mirrors/po/dorsoDorso 是一款 macOS 体态监测应用当你坐姿歪斜时自动模糊屏幕提醒你坐直。要把它同时送到「GitHub 直接下载」和「App Store」两条渠道还涉及代码签名、Apple 公证、Sparkle 签名自动更新、以及 App Store 私有 API 剔除等一整套发布流水线。本文用尽量少的代码带你从零看懂 Dorso 是如何构建、签名、公证并自动更新一款 macOS 应用的。一、为什么要做「双渠道」分发Dorso 的核心体验是「系统级屏幕模糊」它默认调用 macOS 的私有 CoreGraphics 接口来实现高效、全屏无死角的模糊。这类私有 API 无法上架 App Store于是作者把同一份源码编译成两种产物直接分发渠道GitHub / DMG / ZIP保留私有 API功能最完整支持 Sparkle 自动更新。App Store 渠道剔除私有 API 与 Sparkle改用公共 API 的兼容模式更新交给 App Store 自己处理。两条渠道共用一套源码、一套版本号体系靠一个编译开关APP_STORE区分。二、构建层一个 build.sh 编译出两种产物入口脚本 build.sh 负责把 Swift 源码编译成通用二进制arm64 x86_64双架构并组装出build/Dorso.app。它在文件头部集中管理版本号VERSION如1.15.0用户可见的版本号。BUILD_NUMBER如16写入CFBundleVersionSparkle 靠它判断是否有新版本每次发版必须递增。MIN_MACOS最低系统要求这里为13.0。关键点在于「App Store 开关」。当执行./build.sh --appstore时构建脚本会追加编译参数-D APP_STORE和链接参数-dead_strip_dylibs-D APP_STORE定义一个 Swift 编译条件让#if !APP_STORE包裹的代码在 App Store 构建里被整体编译掉。-dead_strip_dylibs移除对 Sparkle 的动态库引用确保 App Store 包里不含任何 Sparkle 痕迹。同一份脚本还会按需做三件事非 App Store 构建时把Sparkle.framework用ditto复制进Contents/Frameworksditto会保留框架内部软链接直接cp -r会破坏签名。只有直接分发构建才会往Info.plist写入SUFeedURL更新源地址和SUPublicEDKeyEdDSA 公钥。App Store 构建则完全跳过这两项——商店包不引用任何更新源。依赖在 Package.swift 里声明其中sparkle-project/Sparkle提供自动更新能力。三、直接分发渠道8 步自动发布流水线release.sh 把整条直接分发链路压缩成一次命令./release.sh X.Y.Z。它先校验版本号必须与build.sh中的VERSION一致否则拒绝发版然后按 8 步执行。步骤 1构建先调用build.sh产出带私有 API 的通用二进制Dorso.app。步骤 2Developer ID 代码签名由内而外签名顺序遵循 Sparkle 官方「从内到外」的要求先签框架内嵌组件再签主程序全部开启hardened runtime加固运行时并加时间戳Sparkle 的Installer.xpc/Downloader.xpcAutoupdate/Updater.appSparkle.framework本体主程序Dorso.app附带 entitlements签完立即用codesign --verify --deep --strict校验签名任何一步失败都会中断。这里的证书是Developer ID Application专用于在 macOS 上分发未上架 App Store 的应用。步骤 3用 ditto 打 ZIP关键细节提交公证前脚本用ditto -c -k --keepParent生成 ZIP。绝不能用zip -r——它会压平Sparkle.framework内部的软链接从而破坏代码签名导致 Sparkle 拒绝安装更新。这个细节是整个流水线最容易踩的坑。步骤 4提交 Apple 公证xcrun notarytool submit --keychain-profile把 ZIP 交给 Apple 做安全扫描可能耗时数分钟通过后应用即获得「官方背书」。步骤 5装订公证票据并重新打包xcrun stapler staple把公证结果「装订」进应用让离线环境也能通过校验随后重新用ditto打一份带票据的 ZIP。步骤 6制作 DMG 并再次签名公证用create-dmg生成拖拽式安装盘自定义背景图、图标、Applications快捷方式。注意 DMG 本身也要被签名、公证、装订——因为用户下载的正是这个文件。测试外观可单独运行 test-dmg.sh 快速预览无需走完整流程。步骤 7打 Git 标签并创建 GitHub Release打 tag、推送、创建 Release上传 ZIP 与 DMG 两个产物并自动生成面向用户的发布说明。步骤 8更新 Sparkle appcast自动更新上线这是让「已安装用户收到新版本的唯一开关」用 Sparkle 自带 CLIsign_update对最终上传的 ZIP做 EdDSA 签名。生成一条新的item插入 appcast.xml 的标记行下方同时删掉旧的同版本条目。提交并推送appcast.xml——它一旦落到主干更新就正式生效。四、Sparkle 签名与自动更新的三个要点版本号驱动Sparkle 比较的是BUILD_NUMBER而非VERSION所以每次发版必须递增BUILD_NUMBER否则老用户看不到更新。EdDSA 密钥私钥保存在登录钥匙串中「Private key for signing Sparkle updates」公钥写在build.sh的SPARKLE_PUBLIC_ED_KEY。私钥一旦丢失已发布的应用将拒绝所有未来更新务必备份。更新源appcast.xml位于仓库根目录通过静态文件服务对外提供客户端地址由build.sh的SPARKLE_FEED_URL指定。客户端侧的更新逻辑集中在 Sources/System/UpdaterManager.swift它对菜单栏这种常驻应用做了专门优化后台定时提醒更新时主动把应用拉到前台避免提示被其他窗口盖住。五、App Store 渠道私有 API 与 Sparkle 的「干净剔除」App Store 构建的核心就是#if !APP_STORE条件编译剔除私有模糊 APISources/UI/BlurOverlay.swift 里通过dlsym动态加载的CGSMainConnectionID、CGSSetWindowBackgroundBlurRadius等私有接口只在非 App Store 构建下编译。App Store 版改用公共的NSVisualEffectView兼容模式实现模糊。剔除 Sparkle整个UpdaterManager被编译掉配合-dead_strip_dylibs商店包里不存在Sparkle 框架、SUFeedURL或 EdDSA 公钥完全符合商店「应用不得自带更新通道」的规则。发布到 App Store 的额外步骤./build.sh --appstore产出无私有 API 的包。用Apple Distribution证书签名。用productbuild打包成.pkg安装器并签名。通过altool上传需 Apple ID 的专用密码切勿写入任何文件。App Store 版不内置自动更新其升级完全依赖 App Store 本身推送。六、双渠道对比速查表维度直接分发GitHub/DMGApp Store私有模糊 API✅ 保留CoreGraphics❌ 剔除兼容模式Sparkle 自动更新✅ EdDSA 签名 appcast❌ 由 App Store 推送签名证书Developer ID ApplicationApple Distribution Installer公证ZIP DMG 均需公证装订由 App Store 流程保证产物ZIP DMG.pkg打包方式ditto保留软链productbuild触发更新推送appcast.xml即生效商店审核通过后分发七、小结Dorso 的双渠道流水线本质上靠一个编译开关APP_STORE和两套签名/公证动作实现直接分发保留私有 API 与 Sparkle走 Developer ID 签名 Apple 公证 EdDSA 签名更新App Store 渠道则用条件编译干净地剔除私有接口与更新框架交由商店托管。最值得记住的三个「保命细节」ZIP 必须用ditto打包zip -r会破坏软链导致签名失效。BUILD_NUMBER每次发版都要递增否则 Sparkle 不判定为新版。EdDSA 私钥务必备份丢失意味着已发布应用永久无法再更新。完整发布说明与命令细节可参考项目内的 CLAUDE.md 与 CHANGELOG.md。【免费下载链接】dorsoA macOS app that blurs your screen when you slouch.项目地址: https://gitcode.com/gh_mirrors/po/dorso创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表