news 2026/9/24 19:57:55

构建与发布Compositor完全指南:Xcode编译、Developer ID签名、公证与自动更新

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
构建与发布Compositor完全指南:Xcode编译、Developer ID签名、公证与自动更新

构建与发布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 版:

  1. 打开Compositor.xcodeproj
  2. 选择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 会执行这三步:

  1. xcodebuild archive—— 以 Release 配置归档,并显式传入CODE_SIGN_IDENTITYDEVELOPMENT_TEAM
  2. xcodebuild -exportArchive—— 按 plist 导出已签名的.app
  3. codesign --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.shcreate-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.xml
  • SUPublicEDKey: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 的完整流程:

  1. 用 Sparkle 自带的sign_update对 DMG 生成 edSignature
  2. gh release create发布v<版本>,附件统一命名为Compositor.dmg,保证latest/download/Compositor.dmg直链永远有效
  3. 生成新的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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 19:57:50

从SDK调大模型到Agent开发:基础对话实战指南

很多想转 Agent 开发的朋友&#xff0c;第一次动手时都会卡在同一个地方&#xff1a;明明大模型 API 文档写得挺清楚&#xff0c;可真要自己把一句话变成一次真实调用&#xff0c;却不知道该从哪行代码写起。还有人误以为“会调 API”就是“会写 HTTP 请求”&#xff0c;结果 c…

作者头像 李华
网站建设 2026/9/24 19:57:32

Mac 上 Homebrew 换国内源:一键脚本解决 brew install 卡顿与超时

讲个真事&#xff1a;上月给朋友的新 Mac 配环境&#xff0c;brew install wget敲下去&#xff0c;进度条直接卡在Updating Homebrew...环节快十分钟没动。我第一反应不是网不好&#xff0c;而是这家伙的 Homebrew 还顶着默认的 GitHub 源在跑。在国内网络环境下&#xff0c;Ho…

作者头像 李华
网站建设 2026/9/24 19:57:27

Python操作MySQL避坑指南:连接池、事务与性能优化

三年前一次线上事故&#xff0c;让我把 Python 连接 MySQL 这件事彻底重新学了一遍。业务一上线&#xff0c;某个订单模块就开始报pymysql.err.OperationalError: (1040, Too many connections)&#xff0c;MySQL 直接拒绝新连接&#xff0c;整个服务跟着雪崩。查到最后&#x…

作者头像 李华
网站建设 2026/9/24 19:57:12

办公电脑开机密码怎么改?账户类型与密码策略全解析

1. 为什么办公电脑要单独管理开机密码前阵子帮一位同事处理电脑问题&#xff0c;他刚入职没多久&#xff0c;公司配的笔记本电脑用的是上一个离职员工留下的账户&#xff0c;登录密码则是IT部门给的临时密码。他问我&#xff1a;“我想改成自己的密码&#xff0c;应该去哪里改&…

作者头像 李华
网站建设 2026/9/24 19:56:12

AI编程助手三大范式:Copilot、Claude Code与Cursor能力图谱

1. 为什么现在必须重新理解“AI编程助手”——不是工具升级&#xff0c;而是开发范式迁移我第一次在团队里推开那扇门&#xff0c;是2023年6月。当时我们正为一个遗留系统做接口重构&#xff0c;三个后端同学卡在Swagger定义与Spring Boot Controller签名不一致的问题上&#x…

作者头像 李华
网站建设 2026/9/24 19:56:07

Redwood 无障碍(a11y)指南:内置路由可达性与焦点管理

Redwood 无障碍&#xff08;a11y&#xff09;指南&#xff1a;内置路由可达性与焦点管理 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood Redwood 框架把无障碍&#xff08;Accessibility&#xff0c;简称 a11y&#xff…

作者头像 李华