构建与发布Compositor完全指南:Xcode编译、Developer ID签名、公证与自动更新
【免费下载链接】CompositorThe Photoshop alternative for Mac项目地址: https://gitcode.com/gh_mirrors/compos/Compositor
Compositor 是一款免费开源的 Mac 图像编辑器(Photoshop 替代品),本文完整讲解如何从零开始构建与发布 Compositor:用 Xcode 编译项目、Developer ID 签名、苹果公证(Notarization)与 Sparkle 自动更新,让任何 Mac 用户双击 DMG 即可无警告安装。
🖥️ 认识 Compositor
Compositor 用 SwiftUI 构建,围绕 Photoshop 的合成与后期工作流设计:图层与混合模式、蒙版、非破坏性变换、魔棒/选区、内容感知填充、曲线/色阶/色相饱和度、层特效(GPU 渲染),以及 PSD 导入导出。
📋 发布前置条件
在开始构建 Compositor 之前,请准备好以下环境(均保存在仓库之外,避免泄露):
| 准备项 | 说明 |
|---|---|
| macOS 26.5+ / Xcode 26+ | 编译 Compositor 的最低系统要求 |
| Developer ID Application 证书 | 存放在登录钥匙串,用于签名 |
| 公证凭证 | 通过xcrun notarytool store-credentials "compositor-notary" …一次性保存 |
create-dmg | 用 Homebrew 安装,用于制作 DMG |
ghCLI | 已登录,用于创建 Release 与推送更新源 |
🛠️ 用 Xcode 编译 Compositor
本地开发最快的方式就是直接跑 Debug 版:
- 打开
Compositor.xcodeproj - 选择Compositorscheme 并运行
版本信息维护在 project.pbxproj 中:MARKETING_VERSION(如 1.2.2)是展示版本号,CURRENT_PROJECT_VERSION(如 17)是构建号——Sparkle 自动更新正是靠构建号递增来判断"有新版本"。
💡 项目通过 SwiftPM 依赖 Sparkle 2.10.0,首次构建时 Xcode 会自动拉取并编译。
✍️ Developer ID 签名:ExportOptions 配置
发布构建与开发构建最大的区别是签名身份。ExportOptions.plist 指定了导出方式:
method = developer-id:导出面向分发的签名包(而非 App Store)signingStyle = manual+signingCertificate = Developer ID Application:手动指定证书teamID:你的开发者团队 ID
发布脚本 scripts/release.sh 会执行这三步:
xcodebuild archive—— 以 Release 配置归档,并显式传入CODE_SIGN_IDENTITY与DEVELOPMENT_TEAMxcodebuild -exportArchive—— 按 plist 导出已签名的.appcodesign --verify --deep --strict—— 立即校验签名完整性
⚠️ 一个容易踩的坑:脚本特意把构建放在~/Library/Caches/CompositorRelease,因为 Dropbox 等云同步工具给文件附加的扩展属性(xattr)会导致代码签名失败。
🛂 公证(Notarization):让 Gatekeeper 放行
签名之后,macOS 还需要一份"公证回执"。流程在 scripts/release.sh 中:
ditto -c -k --keepParent "$APP_PATH" Compositor.zip # 打包成 zip xcrun notarytool submit Compositor.zip --keychain-profile compositor-notary --wait xcrun stapler staple Compositor.app # 把回执"钉"进应用staple之后,用户离线打开 DMG 时系统也能验证公证状态。项目同时启用了沙盒(见 Compositor.entitlements),其中专门为 Sparkle 的更新助手服务声明了 Mach 服务例外,否则沙盒应用无法调用 Sparkle 安装更新。
📦 打包 DMG:带窗口布局与 Retina 背景
release.sh用create-dmg制作安装窗口,细节考究:
- 窗口固定600 × 380 点,应用图标与"拖到应用程序"链接精确摆位
- 背景图使用 600×380 与 1200×760 两张尺寸,经
tiffutil -cathidpicheck合成一张 TIFF——Finder 只认单张背景图,这样 Retina 屏上依然锐利 - 最后再对 DMG 本身签名、公证、staple 一遍
脚本末尾还会预演 Gatekeeper 的判定:
spctl --assess --type open --context context:primary-signature --verbose=2 Compositor.dmg看到accepted就说明发布包合格。
🔄 Sparkle 自动更新:appcast 更新源
Compositor 内置 Sparkle 自动更新框架。接入点很简单——CompositorApp.swift 中 import Sparkle,菜单提供"Check for Updates…"入口,调用updater.checkForUpdates(nil)。
关键配置集中在 Info.plist:
SUFeedURL:指向仓库主分支的 appcast.xmlSUPublicEDKey:Sparkle 更新的 EdDSA 公钥,校验签名防篡改SUEnableInstallerLauncherService = true:允许通过辅助服务替换正在运行的 app
appcast.xml 是标准 RSS 格式,每个<item>携带版本、最低系统版本、下载直链和sparkle:edSignature签名,例如当前版本 1.2.2(构建号 17)、最低系统 26.5。
🚀 一键发布:release.sh + publish.sh
完整发布只需两条命令:
./scripts/release.sh # 构建 + 签名 + 公证 + DMG → dist/Compositor-<版本>.dmg RELEASE_NOTES="…" ./scripts/publish.sh # 签名更新包 + 创建 Release + 发布更新源publish.sh 的完整流程:
- 用 Sparkle 自带的
sign_update对 DMG 生成 edSignature - 用
gh release create发布v<版本>,附件统一命名为Compositor.dmg,保证latest/download/Compositor.dmg直链永远有效 - 生成新的
appcast.xml,提交并推送到 main 分支——客户端随即感知到新版本
✅ 常见问题速查
- 签名失败?检查文件是否被云盘附加 xattr,改用本地目录构建。
- 公证一直等待?确认
store-credentials的 profile 名称与脚本中NOTARY_PROFILE一致。 - 更新没触发?记住递增
CURRENT_PROJECT_VERSION,且v<版本>Release 不能重复创建。 - 更多背景?项目 README.md 的 Releasing 一节与 docs/project-format.md 可作参考。
按照以上步骤,你就能构建出一个签名完整、公证通过、支持自动更新的 Compositor 发布包 🎉
【免费下载链接】CompositorThe Photoshop alternative for Mac项目地址: https://gitcode.com/gh_mirrors/compos/Compositor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考