无需打开Xcode即可构建和发布Mac/iOS应用
速览
该工具允许开发者在不打开Xcode的情况下完成Mac和iOS应用的构建与发布流程,极大简化了开发环境依赖。它可能通过命令行或自动化脚本实现,提升开发效率,降低对苹果官方IDE的强制绑定。这对跨平台或偏好轻量级工作流的开发者具有实际意义。
AI 深度解读
背景
近来,不少 Apple 相关的播客主抱怨 Xcode 糟糕,认为 Apple 需要让 Xcode 不那么晦涩难懂,以改善 Mac 和 iOS 应用的“vibe coding”体验。这些批评并非完全没道理,但作者指出,他们其实大可不必打开 Xcode。通过一些前期准备工作,完全可以不碰 Xcode,尽情“vibe code” Mac 和 iOS 应用。如果对任何步骤有疑问,可以直接把这篇博客全文扔给 Claude Code 或你选的 LLM 编码工具,让它自己想办法解决——这正是 LLM 的工作,处理你不想操心的事情。
核心内容
快速概览
- 必须安装 Xcode.app,但永远不需要打开它。
xcodebuild、notarytool、stapler和devicectl这些工具都住在 Xcode 内部,完全可以从 shell 运行。 - 有少数一次性步骤需要 GUI(或交互终端):登录 Apple ID、创建 Developer ID 证书、存储公证密码。之后,构建和部署就可以完全无头(headless)运行。
- Mac 应用通过一个脚本
scripts/release.sh发布,写好之后自动执行完整链条:archive → Developer ID 签名 → notarize → staple → 安装到/Applications。 - 签名基于证书和钥匙串。签名密钥存放在登录钥匙串中,
xcodebuild会自动找到它,仓库中无需存储任何秘密。
一次性设置
-
安装 Xcode
必须安装 Xcode,因为构建依赖其内部的工具。安装后,确保选择的命令行工具链是/Applications/Xcode.app/Contents/Developer,而不是/Library/Developer/CommandLineTools。后者是独立的 Command Line Tools 包,只包含 clang、git 等,缺少 iOS SDK、notarytool、devicectl 等完整开发所需内容。 -
安装 XcodeGen
Xcode 命令行工具不足以自动生成和管理 Xcode 项目。XcodeGen 可通过 Homebrew 安装。原理:Xcode 项目实际是文件夹(macOS 伪装成文件),Xcode 会不断修改其中的文件引用,给 git 带来问题。XcodeGen 创建一个project.yml文件定义所有项目设置,每次构建时根据该 YAML 重新生成整个.xcodeproj文件夹。只需将 YAML 文件提交到 git,.xcodeproj可被 gitignore。 -
一次性配置 Xcode
- 接受许可证并安装附加组件:可通过命令行
sudo xcodebuild -license accept完成。 - 在 Xcode 中设置 Apple 开发者账号:打开 Xcode → Settings → Accounts → + 添加账号。注意:需要付费的 Apple Developer 账号才能分发和公证应用。
- 创建 Developer ID Application 证书:Settings → Accounts → 你的 Apple ID → Manage Certificates… → + → Developer ID Application。这个证书用于签名最终分发的
.app包。注意:Developer ID Application 证书与 Apple Development 证书不同——前者用于通过 Gatekeeper 在别人的 Mac 上运行,后者用于在自己设备上调试。创建证书时,其私钥会安装到登录钥匙串中,无法重新下载,需备份。
- 接受许可证并安装附加组件:可通过命令行
-
存储公证凭证(终端中一次性完成)
公证(notarization)会将签名后的应用上传到 Apple 进行恶意软件扫描。notarytool使用存储的钥匙串配置文件进行认证,需交互式创建(会提示输入 app-specific password):xcrun notarytool store-credentials "<profile-name>" --apple-id "<your-email>" --team-id "<your-team-id>" --password- 配置文件名应与应用名称一致,不要借用其他应用的配置文件,否则会在他人机器上静默失败。
- app-specific password 不是 Apple ID 密码,需在 appleid.apple.com → Sign-In & Security → App-Specific Passwords 生成。
- 更改 Apple ID 密码后,这些密码会静默失效。公证返回
401 invalid credentials几乎总是意味着“去生成新密码”,而非“设置坏了”。
-
设置 Local.xconfig 文件并加入 .gitignore
将团队 ID 和 bundle prefix 放入Local.xconfig文件,例如:TEAM_ID = ABC123 BUNDLE_PREFIX = com.example
创建部署脚本
在仓库中创建 scripts/release.sh。作者让 Claude Code 生成了脚本,要求是:archive、Developer ID 签名、公证、staple、安装到 /Applications,且任何步骤失败都要立即报错。LLM 知道标准流程:xcodebuild archive → xcodebuild -exportArchive(配合 ExportOptions.plist)→ notarytool submit --wait → stapler staple → spctl --assess。脚本中设置了 set -euo pipefail 使任意命令失败时立即停止。
手机/设备相关补充
针对 iOS 应用,还需额外配置:安装 iOS 设备运行所需证书(Xcode 中创建 iOS Development 证书),并使用 devicectl 代替旧的 ideviceinstaller 等工具。原文中这部分未展开,但指出流程类似:使用 xcodebuild 构建,然后用 devicectl 安装到设备。
关键要点
- Xcode 只需安装,无需打开:所有构建、签名、公证、部署操作均可通过命令行或 LLM 驱动的脚本完成。
- 一次性 GUI 操作不可避免:Apple ID 登录、Developer ID 证书创建、公证密码存储必须手动执行一次(或通过交互终端)。
- XcodeGen 是项目管理的核心:将 .xcodeproj 替换为 project.yml,减少 git 冲突,便于自动化。
- 部署脚本完全可由 LLM 生成:明确告知 LLM 目标(如“写一个脚本完成 archive、sign、notarize、staple、install”),它就能根据公开流程写出初稿,再通过“跑→修”迭代完善。
- 签名密钥安全存放:存在本地钥匙串中,仓库无秘密;备份是关键。
- app-specific password 的维护:需要在 Apple 网站生成,且密码随 Apple ID 密码变更而失效,需提前知悉。
- 使用 LLM 的初衷就是避免手动做不想做的事:一次设置好后,所有重复步骤都交给脚本和 LLM,实现真正的“vibe coding”。
意义与影响
本文展示了一种低摩擦、高度自动化的 Apple 应用开发与发布流程,其核心思想是“通过一次性准备 + 命令行工具 + LLM 代码生成”完全绕过 Xcode 图形界面。这不仅解决了 Xcode 臃肿、不稳定、版本控制混乱等问题,还大幅降低了重复性劳动,尤其适合偏好“vibe coding”或使用 AI 编程助手的开发者。
这种方法的意义在于:
- 重构了 Apple 开发者的工作流:从“手动在 Xcode 中点击”转向“脚本驱动 + AI 辅助”,提升了可重复性和 CI/CD 集成能力。
- 降低了进入门槛:新手只需关注项目配置(YAML)和脚本逻辑,无需熟悉 Xcode 复杂界面。
- 与 LLM 原生协作:整个构建流程是公开文档化的,LLM 可以直接理解并生成正确的脚本,开发者只需描述需求、迭代修正。
- 适用于个人和小团队:无需昂贵的 CI 服务,仅靠 shell 脚本和钥匙串即可实现完整的自动发布。
当然,该方案也有局限性:需一次性付费开发者账号、仍需信任 Apple 的公证流程、对较复杂的项目(如多 target、扩展、插件)可能需要额外适配。但总体上,它为那些被 Xcode 困扰的开发者提供了一条清晰、可落地的替代路径,也预示了未来 AI 原生的 Apple 开发趋势——人类定义意图,机器执行细节。
