
如何从源码构建并公证CodenotchXcodeGen、Developer ID签名与Sparkle EdDSA自动更新入门教程【免费下载链接】codenotchA macOS app that pins usage limits from Claude Code, Cursor, Codex, and Antigravity to a screen edge.项目地址: https://gitcode.com/gh_mirrors/co/codenotchCodenotch 是一款 macOS 工具把 Claude Code、Cursor、Codex、Antigravity 等 AI 编程助手的用量限制钉在屏幕边缘的小黑块上。本文带你从零完成 Codenotch 源码构建全流程用 XcodeGen 生成工程、Developer ID 签名、公证 DMG并生成带 EdDSA 签名的 Sparkle 自动更新源。一、先认识这个项目Codenotch 长什么样克隆仓库git clone https://gitcode.com/gh_mirrors/co/codenotch cd codenotch构建完成后Codenotch 会在屏幕边缘显示各家 AI 编程工具的用量圆环鼠标悬停即可看到用量百分比与重置时间——这正是我们构建的最终产物整个发布链路由根目录的 Makefile 统一编排工程配置则写在 project.yml 中——仓库里没有.xcodeproj它是由 XcodeGen 按需生成的。二、一键安装构建环境Homebrew 装两个工具只需安装 XcodeGen 和 create-dmg 两个命令行工具其余能力由 Xcode 自带brew install xcodegen create-dmg工具作用xcodegen从project.yml生成 Xcode 工程create-dmg打包只读、压缩的 DMG公证要求 日常开发build / test / run不需要 Apple 开发者账号make会自动检测本机签名身份并降级为 ad-hoc 签名详见 CONTRIBUTING.md。三、XcodeGen 如何工作project.yml 是唯一事实来源make gen这一步做三件事见 Makefile 的gen目标运行xcodegen generate按 project.yml 生成Codenotch.xcodeproj创建 SwiftPM 的共享解析目录把根目录 Package.resolved 复制进工程锁住依赖版本。project.yml 里有两处与签名与更新直接相关的配置签名基线project.yml#L24-L34默认Developer ID Application 加固运行时Hardened Runtime公证必需同时关闭 App Sandbox——因为 Codenotch 需要读取 Claude Code 的钥匙串令牌Sparkle 配置project.yml#L101-L122SUFeedURL指向更新源SUPublicEDKey是 EdDSA 公钥SUAutomaticallyUpdate: false保证只在刘海里询问、绝不偷下。版本号也在这一份文件里维护MARKETING_VERSION是用户看到的版本CURRENT_PROJECT_VERSION是 Sparkle 用来比较新旧的构建号每次发版两个都要递增project.yml#L13-L18。四、本地构建、测试与运行make 三连make build # Debug 构建 make test # 单元测试 make run # 构建并直接启动Makefile 有一段巧妙的身份自动检测有Developer ID Application证书 → 直接用正式发布身份只有Apple Development证书 → 用它身份稳定钥匙串始终允许不会失效什么都没有 →ad-hoc 签名CODE_SIGN_IDENTITY-普通贡献者零门槛。为什么本地 ad-hoc 构建总弹钥匙串ad-hoc 签名每次构建都产生新身份钥匙串的始终允许记不住它所以读 Claude Code 令牌的授权弹窗每次启动都来一遍。Scripts/sign-local.sh 用一张自签证书解决它——无需 Apple 账号Scripts/sign-local.sh # 默认签 /Applications/Codenotch.app脚本首次运行会生成Codenotch Local Signing自签证书存入登录钥匙串之后每次直接复用。签完再手动授权一次弹窗此后再也不会打扰你。五、Developer ID 签名正式发布与本地构建的分水岭正式发布的差异集中在 Makefile 的发布段。核心是archive目标make archive它先用xcodebuild archive打出.xcarchive再写出ExportOptions.plistmethod: developer-id 签名证书Developer ID Application最后xcodebuild -exportArchive重新签名成可分发的.app。这一步是 Debug 构建做不到的为什么必须走 archive export因为-exportArchive会用 Developer ID 身份对整个 bundle含内嵌的 Sparkle 框架重签。ad-hoc 构建没有 Team IDdyld 在加固运行时下会拒绝加载框架Team ID 不匹配用户看到的就是Codenotch 打不开因为存在问题。这也是 CONTRIBUTING.md 里那句你不需要make release就能贡献代码的原因——Developer ID 证书和公证凭据只存在于维护者一台机器上。六、打包、公证与验证make release 全流程前置一次性配置需要 Apple ID 专用密码不是登录密码Team ID 见 project.yml#L26xcrun notarytool store-credentials UsageNotch \ --apple-id 你的AppleID --team-id 6WFPL8B9FB --password 专用密码然后一条命令走完全程Makefile 中release: notarize verify-release appcastmake release第 1 步 · 打包 DMGMakefilecreate-dmg生成只读压缩镜像背景图就是本文开头那张docs/design/dmg-background.png最后对整个 DMG 本体签名codesign --force --sign Developer ID Application --timestamp Codenotch.dmg第 2 步 · 公证Makefilenotarytool submit --wait提交 Apple 并阻塞等待通常几分钟通过后stapler staple把票据钉进 DMGxcrun notarytool submit Codenotch.dmg --keychain-profile UsageNotch --wait xcrun stapler staple Codenotch.dmg第 3 步 · 验证Makefile这一步模拟的是客户 Mac 上 Gatekeeper 的检查——stapler validate、codesign --verify --deep --strict、spctl --assess。spctl通过就是下载后无需右键打开也能运行的实际证明。七、Sparkle EdDSA 自动更新appcast 与密钥安全make appcastMakefile完成最后一环把 DMG 复制到发布目录并以版本号命名如Codenotch-1.20.0.dmg保证每次发版下载 URL 都是新的避免浏览器/CDN 缓存旧安装包运行 Sparkle 自带的generate_appcast它会用登录钥匙串里的EdDSA 私钥对每个更新签名生成appcast.xml。客户端侧的逻辑在 Sources/App/Updater.swiftSUPublicEDKeyproject.yml#L114烧进 Info.plistSparkle 会拒绝任何私钥没签过的更新——即使更新源被劫持也无法安装恶意代码。发现新版本时不弹窗而是在刘海里显示Codenotch 1.19.0 可更新 / 更新 / 稍后选择后才下载安装。⚠️ EdDSA 私钥一旦丢失已安装的所有副本将永远无法再更新务必备份。八、常见问题速查问题原因与对策xcrun: missing DEVELOPER_DIR只装了 Command Line Tools未装 XcodeMakefile 已做保护装完整 Xcode 即可下载/构建的 DMG 提示已损坏那是隔离旗标而非坏档xattr -dr com.apple.quarantine /Applications/Codenotch.app更新下载后验证失败appcast 里的下载地址与实际文件位置不一致Makefile 特意强调了这一点想跑 CI 同款无签名构建make dmg-ciMakefilead-hoc 签名 关闭库验证首次运行需手动解除隔离九、总结目标命令需要的凭据日常开发make run/make test无本地稳定身份Scripts/sign-local.sh无自签证书正式发布make releaseDeveloper ID 证书 公证凭据 EdDSA 私钥Codenotch 的构建链路设计得很防御性一份 project.yml 管所有配置一个 Makefile 管所有发布步骤每一步失败都能单独重跑。跟着本文走一遍gen → build → archive → dmg → notarize → appcast你就掌握了 macOS 应用从源码到公证分发、再到 EdDSA 安全自动更新的完整方法论。【免费下载链接】codenotchA macOS app that pins usage limits from Claude Code, Cursor, Codex, and Antigravity to a screen edge.项目地址: https://gitcode.com/gh_mirrors/co/codenotch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考