blake@xcode:~/Projects$ cat ios-agent-development.md

使用AI智能体构建iOS应用:实践者指南

# 借助AI智能体更快构建iOS应用。涵盖Claude Code、Codex CLI、Xcode 27智能体、MCP、CLAUDE.md模式、hooks,以及来自8个应用的经验教训。

author: words: 5780 read_time: 62m updated: 2026-08-17 00:16

Part 1 of iOS with Agents

$ less ios-agent-development.md

简而言之:如今有 3 种智能体运行时可为 iOS 编写代码:搭配 MCP 的 Claude Code CLI、搭配 MCP 的 Codex CLI,以及 Xcode 原生的 Intelligence 智能体——Claude Agent、Codex,以及自 Xcode 26.6 起支持的 Google Gemini 或任意 Agent Client Protocol(ACP)智能体。17两台 MCP 服务器(拥有 82 个工具的 XcodeBuildMCP,以及拥有 20 个工具的 Apple xcrun mcpbridge)为智能体提供了对构建、测试、模拟器和调试的结构化访问能力。本指南涵盖真实的 CLAUDE.md 模式、Hook 配置,以及哪些功能有效、哪些会失效的坦诚评估——这些内容源自 8 款已上线的 iOS 应用,共计 293 个 Swift 文件。32智能体擅长 SwiftUI 视图、SwiftData 模型、重构和构建错误诊断,却难以处理 .pbxproj 修改、代码签名和视觉调试。从“智能体编写 Swift”到“智能体发布 iOS 应用”之间的鸿沟,靠的是配置而非提示词。截至 WWDC 2026(6 月 8 日),iOS 27 仍处于 beta 阶段——截至 8 月 10 日为 beta 5(24A5408d)——并新增了与智能体相关的框架(Foundation Models 工具调用控制、App Intents 后台执行,以及新的 Core AI 和 Evaluations 框架)。这些名称值得写入智能体的上下文,因为在 2026 年 6 月前训练的模型并不了解它们。Xcode 26.6(2026-06-25,Swift 6.3)是当前稳定工具链;Xcode 27 beta(Swift 6.4、iOS 27 SDKs)则跟随 iOS 27 的发布周期。1718

我已经借助 AI 编程智能体构建了 8 款 iOS 应用。它们并非原型,而是已在 App Store 上架的应用,涵盖 HealthKit 集成、Metal 着色器、SpriteKit 物理效果、iCloud 同步、Live Activities、Game Center 排行榜,以及横跨 iOS、watchOS 和 tvOS 的多平台目标。这些应用中的每一行 Swift,要么由智能体编写并经我审阅,要么由我编写后交由智能体重构。依我估计,智能体完成了绝大多数逐行代码创作;我负责审阅、范围把控,以及需要人类判断的部分(视觉打磨、签名、性能调优和 App Store 提交)。

这是我刚开始时希望能找到的参考指南。它覆盖完整技术栈:该选择哪种智能体运行时、如何配置 MCP 服务器以获得结构化构建访问、CLAUDE.md 应包含什么、哪些 Hook 能阻止智能体破坏 Xcode 项目,以及——至关重要的是——智能体会在哪些地方失效、何时需要您亲自接手。

核心要点

面向刚接触 AI 智能体的 iOS 开发者:

  • 从 Claude Code CLI + XcodeBuildMCP 开始。这是最成熟的运行时,拥有最全面的 MCP 工具覆盖。只需执行两条安装命令,在项目中添加 CLAUDE.md,智能体便可构建、测试和调试,无需您手动复制错误信息。
  • 绝不要让智能体修改 .pbxproj。这是最重要的一条规则。通过 PreToolUse Hook 阻止对 .pbxproj.xcodeproj/ 的写入,可为您节省数小时恢复时间。
  • CLAUDE.md 是智能体的入门文档。投入数小时编写它,会在之后每个接触该项目的智能体会话中获得回报。

面向准备将 iOS 纳入工作流的资深智能体用户:

  • MCP 改变了 iOS 构建循环。在 MCP 出现前,智能体能编写 Swift,却无法验证代码能否编译。借助 XcodeBuildMCP,智能体会编写代码、构建、读取结构化错误、修复问题并运行测试——全程自主完成。
  • 3 种运行时服务于不同需求。Claude Code CLI 适合深度智能体会话,Codex CLI 适合无头批处理,而 Xcode 自身的智能体——在 Xcode 27 中已不再只是行内修复工具,新增了插件、MCP 服务器以及驱动模拟器的能力。22
  • Hook 基础设施可直接沿用。现有的 PostToolUse 格式化器、PreToolUse 拦截器和测试运行器 Hook,只需对路径稍作调整,便可同样用于 iOS 项目。

面向评估 AI 辅助 iOS 开发的团队负责人:

  • 智能体的有效性取决于项目文档,而非项目规模。一款拥有详尽 CLAUDE.md 的 63 文件应用,比一款没有任何文档的 14 文件应用能产出更好的智能体结果。
  • .pbxproj 边界不容妥协。智能体无法可靠地编辑 Xcode 项目文件。您的工作流必须考虑到,需要手动将文件添加到 Xcode 目标。
  • 坦诚的 ROI:在文档完善的项目中,智能体可承担大部分实现工作——下方案例研究中的 15 文件 TV 应用,借助智能体在 3 小时内完成发布,正说明了这一点。剩余工作——视觉打磨、签名、性能调优和 App Store 提交——仍需人类判断。

选择您的路径

您需要什么 前往此处
首次设置 MCP MCP 设置:完整配置——安装两台服务器、验证并配置智能体
为您的 iOS 项目编写 CLAUDE.md iOS 项目的 CLAUDE.md 模式——来自 8 款应用的真实示例
比较 3 种智能体运行时 面向 iOS 的 3 种智能体运行时——Claude Code、Codex 与 Xcode 原生智能体对比
了解智能体能做与不能做什么 智能体擅长什么智能体不擅长什么
为 iOS 开发设置 Hook iOS 开发的 Hook——保存时格式化、.pbxproj 保护、测试运行器
深入参考(本页) 继续阅读——从设置到高级模式,一应俱全

如何使用本指南

这是一份超过 3,000 行的参考资料。请从符合您经验水平的部分开始:

经验水平 从这里开始 接着探索
刚接触 iOS + 智能体 前置条件MCP 设置您的第一个智能体会话 CLAUDE.md 模式哪些有效/无效
iOS 开发者,刚接触智能体 3 种运行时MCP 设置CLAUDE.md Hook架构模式
智能体用户,刚接触 iOS 架构模式智能体不擅长什么CLAUDE.md 框架特定上下文高级工作流
两者均有经验 高级工作流Hook多平台模式 运行时比较应用作品集

目录

  1. 应用作品集:8 款应用,293 个文件
  2. 前置条件
  3. 面向 iOS 的 3 种智能体运行时
  4. MCP 设置:完整配置
  5. iOS 项目的 CLAUDE.md 模式
  6. 您的第一个智能体会话
  7. 智能体在 iOS 中擅长什么
  8. 智能体在 iOS 中不擅长什么
  9. iOS 开发的 Hook
  10. 适合与智能体配合的架构模式
  11. 框架特定上下文
  12. 多平台模式
  13. 高级工作流
  14. 真实案例研究
  15. 使用智能体的项目生命周期
  16. 配置智能体定义
  17. AI 辅助 iOS 的测试模式
  18. iOS 项目的上下文窗口管理
  19. 故障排除
  20. iOS 中常见的智能体错误及预防方法
  21. 坦诚评估
  22. 常见问题
  23. 快速参考卡
  24. 参考资料

相关资源

主题 资源
面向 Xcode 的 MCP 设置(较短的博客文章) 两台 MCP 服务器让 Claude Code 成为 iOS 构建系统
Claude Code CLI 完整参考 Claude Code CLI:完整指南
Codex CLI 参考 Codex CLI:完整指南
Hook 系统深入解析 Claw 的剖析:作为编排层的 84 个 Hook
智能体架构模式 智能体架构指南
Mac 桌面应用 + 远程控制 Claude Code Mac Desktop + Remote Control:CLI 用户指南

Apple 生态系统系列。21 篇关于 SwiftUI 应用的生产级文章,涵盖与 Apple Intelligence、MCP、Foundation Models、Vision、Core ML 及 iOS 26 框架栈的集成。内容源自 Water、Get Bananas、Return,以及 941 作品集中的其他应用:

系列主页:Apple 生态系统系列

Agentic Apple(E4):

主题 资源
Apple Intelligence 的意图接口 App Intents 是 Apple 面向您应用的新 API
与 iOS 应用并存的 MCP 服务器 两个智能体生态系统,一个购物清单
何时使用哪一种 App Intents 与 MCP 工具:路由问题
设备端 LLM:运行时功能与工具的区别 Foundation Models + 智能体工作流
Apple 开发的 Hook Apple 开发的 Hook
跨进程状态 单一事实来源:SwiftData + MCP + iCloud

框架(E2/E3):

主题 资源
Foundation Models 设备端 LLM Foundation Models 设备端 LLM
Vision 框架(CV 基础能力) Vision Framework:内置了什么
Core ML 推理模式 Core ML 设备端推理
RealityKit 空间心智模型 RealityKit 与空间心智模型
SwiftUI 内部机制 SwiftUI 的构成
Symbol Effects 动画词汇 Symbol Effects:SwiftUI 内置动画词汇
iOS 26+ 上的 Liquid Glass SwiftUI 中的 Liquid Glass:3 种模式

已发布代码(E1):

主题 资源
Live Activities 状态机 Live Activities 状态机
watchOS 运行时契约 watchOS 运行时契约
SwiftData 架构约束 SwiftData 架构约束
HealthKit + SwiftUI 模式 iOS 26 上的 HealthKit + SwiftUI
多平台 SwiftUI 5 个 Apple 平台,3 个共享文件
XcodeBuildMCP 集成 两台 MCP 服务器,一个 Xcode 项目

综合(E5):

主题 资源
iOS 应用的 3 个界面 iOS 应用的 3 个界面
平台目标决策 Apple 平台矩阵
我拒绝撰写的内容 我拒绝撰写的内容

iOS 27 与 WWDC 2026:您的代理现在能构建什么

WWDC 2026(2026年6月8日)发布了 iOS 27 beta。本指南中的代理开发工作流并未改变:您仍通过 MCP 驱动 Claude Code、Codex 或 Xcode 的 Intelligence 代理,仍会编写 CLAUDE.md,并依旧通过 hooks 对破坏性操作设置关卡。变化在于代理所面对的功能范围。iOS 27 引入了多个与代理相关的新框架,实际做法是有意识地让编码代理使用它们,因为在2026年6月前训练的模型并不知道它们的存在。iOS 26 仍是正式发布版本;当您针对 iOS 27 beta SDK 构建时,请将下列内容视为目标。

与代理相关的 iOS 27 功能范围及其深入参考:

  • Foundation Models 新增了工具调用控制。 GenerationOptions.ToolCallingMode 允许您按请求控制设备端模型调用工具的积极程度,并且该框架可在首次调用后切换模式,以限制某个请求的工具活动。Vision 框架现已提供现成的 OCRToolBarcodeReaderTool,可直接附加到 LanguageModelSession,无需自行编写识别代码。请参阅Foundation Models in iOS 27: Tool-Calling Control12
  • App Intents 突破了30秒限制。 LongRunningIntent(通过 performBackgroundTask(options:operation:),需要报告进度)可延长 intent 的后台运行时间,用于同步、文件处理和设备端推理;SyncableEntityAppEntity 提供跨设备身份;IndexedEntityQuery 允许系统请求您的查询修复其 Spotlight 索引。请参阅App Intents in iOS 27: Background, Sync, Spotlight13
  • Core AI 是用于在 Apple Silicon 上运行模型的新框架。 在您自行提供模型而非使用 Apple 系统模型的场景中,它位于 Foundation Models 之下。请参阅Core AI: Running Models on Apple Silicon14
  • Evaluations 是用于衡量模型质量的 XCTest。 这是一个新框架(macOS 27),用于在测试套件中衡量模型输出质量;它补上了发布由代理协助构建的 AI 功能所缺失的一环。请参阅Evaluations: XCTest for Model Quality15
  • SwiftData、HealthKit 和 SwiftUI 也有更新。 SwiftData 在 iOS 27 中新增了观察和历史记录;HealthKit 新增了训练区间和类型;SwiftUI 的 iOS 27 新增内容则一如既往地覆盖广泛。请参阅SwiftData in iOS 27HealthKit in iOS 27以及What’s New in SwiftUI for iOS 2716

用于 iOS 27 开发的工具链是 Xcode 27 beta。 Xcode 27 于 WWDC 首日(6月8日,build 27A5194q)以 beta 形式发布,截至8月10日已更新至 beta 5(27A5237l)。它包含 Swift 6.4 和 iOS 27 / iPadOS 27 / tvOS 27 / watchOS 27 / macOS 27 / visionOS 27 SDKs,并要求 macOS Tahoe 26.4 或更高版本。18 有4项 release notes 内容与代理工作流相关:Coding Intelligence 新增了计划模式——说明通过“Implement the plan?”确认栏的已知问题(178673449)提及该功能,因此请等待代理完成流式输出后,再确认或关闭计划;RenderPreview MCP 工具现在能够渲染 Preview 组(174692209),并可在不同本地化设置下预览您的 UI(181040291);面向代理的“Prepare Project for Localization”工具现在会报告因不再出现在源代码中而被移除的 String Catalog key(179755385);当应用使用 Xcode 26.4 或更早版本构建时,Address Sanitizer 可能无法在 27.0 target 上启动——请使用 Xcode 26.5+ 运行 ASan(178072780)。18 Beta 5 还新增了另外两项相关内容。代理现在可以验证 watchOS app,包括“旋转和按下 Digital Crown,以及按下侧边按钮和操作按钮(Apple Watch Ultra)”(181147968)——这是 Apple 的代理首次能够操作 watch app 的实体输入,弥合了本指南所述视觉验证缺口的一部分。Apple 还预览了无需打开 Xcode 的 MCP server;请参阅下方关于 Apple MCP server 的章节。22 MCP 工具也已跟上 beta:XcodeBuildMCP v2.7.0(2026-07-23)通过 Device Hub 使其 UI 自动化工具完全支持 Xcode 27 simulator,包括启动 simulator 窗口和键盘控制——在该版本之前,运行时 UI 自动化仅能可靠地用于 Xcode 26 simulator,这让 iOS 27 beta 上的代理驱动 UI 验证只能手动进行。21

从操作层面而言,教训与本指南其余部分一致:代理编写代码,但您需要提供它所缺失的知识。对于 iOS 27 beta,这意味着要在 prompt 或 CLAUDE.md 中明确列出这些框架,并将代理链接至 Apple 文档,否则模型会沿用每个 API 的 iOS 26 形态。本指南中的其他内容(runtime、MCP、hooks、失败模式)均可原样用于 iOS 27 开发。


项目集:8 个 App,293 个文件

在深入配置之前,先介绍本指南的实践来源。这些并非玩具项目——它们覆盖5个 Apple framework、3个平台,以及从14个文件的训练追踪器到63个文件的多平台冥想计时器的完整 iOS 复杂度范围。

App 技术栈 文件数 复杂度
Banana List SwiftUI + SwiftData + iCloud Drive 同步 + 用于 Claude Desktop 的 MCP server 53 完整 CRUD、iCloud 同步、自定义 MCP server,可将 app 数据暴露给 Claude Desktop
Ace Citizenship SwiftUI 学习 app + FastAPI backend 26 客户端-服务器、REST API 集成、测验引擎
TappyColor SpriteKit 颜色匹配游戏 30 游戏循环、物理效果、触控处理、粒子效果
Return 禅修计时器——iOS 26+、watchOS、tvOS 63 HealthKit、Live Activities、Watch 延长运行时、TV 焦点导航、iCloud 会话同步
amp97 Metal shader + 音频可视化 41 自定义 Metal 渲染管线、音频分析、实时 GPU 计算
Reps SwiftUI + SwiftData 训练追踪 14 最小可行 app、清晰的 SwiftData 模式
Water SwiftUI + SwiftData + Metal + HealthKit 饮水追踪 34 Metal 流体模拟、HealthKit 饮水记录、widget
Starfield Destroyer SpriteKit + Metal 太空射击游戏 32 99 个关卡、8 艘飞船、Game Center 排行榜、Metal 后处理

文件数量为何重要:代理的有效性与项目的可理解性相关,而非项目规模。Return(63个文件)比 amp97(41个文件)产生更好的代理输出,因为 Return 具有详细的 CLAUDE.md,其中包含文件注释、架构图和明确模式。无论文档质量如何,amp97 的 Metal shader 天生更难让代理进行推理。


前置条件

在为 iOS 开发配置任何代理 runtime 之前:

App Store Connect 截止要求:2026-04-28 起,上传至 App Store Connect 的 app 必须使用 Xcode 26 或更高版本并采用适用于 iOS 26、iPadOS 26、tvOS 26、visionOS 26 或 watchOS 26 的 SDKs 构建。26(macOS 提交不受此要求约束。)如果您的团队仍在使用 Xcode 16.x,本指南中的代理辅助工具链也会成为推动升级的因素——反正下方的 MCP server 均无法在没有 Xcode 26.3+ 的情况下工作。

必需: - macOS 15+(Sequoia)或 macOS Tahoe(Xcode 26.6 要求 macOS Tahoe 26.2+;Xcode 27 beta 要求 Tahoe 26.4+) - 已安装并配置 Xcode 26.3+(xcrun mcpbridge 的最低版本);建议使用 Xcode 26.6+。 Xcode 26.6(2026-06-25,build 17F113)是最新稳定版,带来3项与代理相关的 Coding Intelligence 变更:将 Google Gemini 作为编码助手提供方、支持 Agent Client Protocol(ACP),以及在预览 MCP 工具中支持变体渲染——浅色/深色、方向、字体大小;它还修复了两项代理 turn 崩溃问题,以及代理提问时发生的卡顿,并随附 Swift 6.3 和 iOS 26.5-generation SDKs。17 26.5 的工作流升级——编码助手中的消息队列和澄清问题支持——以及 26.4 的 Swift Testing 图像附件、录制问题严重性、带 crashlog 的 UI 测试崩溃警告和 String Catalog editor 改进,也都延续至此。2728 较早稳定版:26.5(2026-05-11,build 17F42)和 26.4.1(2026-04-16,build 17E202)。29 - 至少安装一个 iOS Simulator runtime - 一个 Anthropic API account(用于 Claude Code)或 OpenAI account(用于 Codex)

建议: - 已安装 SwiftFormatbrew install swiftformat)——用于保存时格式化 hooks - 已安装 SwiftLintbrew install swiftlint)——可选,但有助于执行代码风格规范 - 熟悉终端——这3个 runtime 都通过命令行运行或与其集成

验证您的 Xcode 安装:

# Check Xcode version
xcodebuild -version
# Expected: Xcode 26.3 or later (26.6+ recommended)

# Check available simulators
xcrun simctl list devices available
# Expected: at least one iPhone simulator

# Verify xcrun mcpbridge is available
xcrun mcpbridge --help
# Expected: usage information (not "command not found")

如果 xcrun mcpbridge 返回“command not found”,则需要 Xcode 26.3 或更高版本。请通过 App Store 或 developer.apple.com 安装或更新 Xcode。请注意:xcode-select --install 仅安装 Command Line Tools,其中不包含 mcpbridge——您需要完整的 Xcode.app。

适用于 iOS 的三种 Agent 运行时

三种不同的运行时都可以编写、构建和测试 iOS 代码。它们不可互换——每种运行时都有不同的优势、不同的 MCP 集成方式,以及不同的理想使用场景。

1. Claude Code CLI

它是什么: Anthropic 的基于终端的智能编码助手。它可以读取您的代码库、执行命令、修改文件,并通过 MCP 连接外部工具。7

MCP 集成:全面支持 XcodeBuildMCP 和 Apple 的 Xcode MCP。Agent 通过 MCP 协议发现工具,并使用结构化参数调用它们。两个服务器共提供82+20个工具。

设置:

# Install Claude Code (if not already installed)
claude --version  # verify installation

# Add XcodeBuildMCP (82 tools — builds, tests, simulators, debugging)
claude mcp add XcodeBuildMCP \
  -s user \
  -e XCODEBUILDMCP_SENTRY_DISABLED=true \
  -- npx -y xcodebuildmcp@latest mcp

# Add Apple Xcode MCP (20 tools — file ops, diagnostics, Swift REPL, previews)
claude mcp add --transport stdio xcode \
  -s user -- xcrun mcpbridge

替代方案——xcodebuildmcp init 自动安装程序(v2.1.0+,2026年2月23日):

如果您希望跳过手动配置 MCP,XcodeBuildMCP v2.1.0+ 提供了 init 子命令,可自动检测 Claude Code、Cursor 或 Codex,并一步完成 Agent skills 和 MCP 配置的安装:

xcodebuildmcp init
# Or without a global install:
npx -y xcodebuildmcp@latest init

标志:--print(为不受支持的客户端将配置写入 stdout)、--uninstall(移除)。如果您希望明确控制接入哪些 MCP 服务器以及接入范围,请跳过此方式;上面的手动 claude mcp add 调用可让您实现这一点。30

最适合:深入的实现会话——构建新功能、跨多个文件重构、调试复杂问题,以及自主运行构建-测试-修复循环。Claude Code 的1M上下文窗口(配合 Opus 5)意味着 Agent 可以将大多数中小型 iOS 项目保留在工作记忆中——根据我的经验,具体取决于文件大小,最多大约可处理50个文件。25

典型会话:

You: Add a new SettingsView with toggles for notifications and haptic feedback.
     Use the existing Settings.swift pattern from TimerManager.
     Build for simulator after implementation and fix any errors.

Claude: [reads Settings.swift, TimerManager.swift, existing views]
        [creates SettingsView.swift]
        [calls build_sim via MCP]
        [reads structured error: missing import HealthKit]
        [fixes import]
        [calls build_sim again  success, 0 errors, 1 warning]
        [calls test_sim  all tests pass]

与 MCP 之前的工作流相比,关键差异在于:Agent 不再要求您手动构建或粘贴错误输出。构建-错误-修复循环可自主完成。

2. Codex CLI

它是什么:OpenAI 基于终端的编码 Agent。其概念与 Claude Code 相似,但运行 OpenAI 的 Codex 模型,并采用不同的权限模型。目前的产品阵容包括 GPT-5.6 Sol(旗舰型号,最擅长复杂编码)、GPT-5.6 Terra(均衡的日常默认选择)和 GPT-5.6 Luna(最快且最经济),另有作为仅文本研究预览版的 GPT-5.3 Codex Spark。GPT-5.4 和 GPT-5.4-mini 将于2026年8月31日从 Codex 退役——请分别将这些配置迁移至 Terra 和 Luna。23

MCP 集成:Codex 通过 codex mcp add 命令支持 MCP。Apple 的 Xcode MCP 可直接使用:

# Add Apple Xcode MCP to Codex
codex mcp add xcode -- xcrun mcpbridge

XcodeBuildMCP 也可通过相同的 npx 命令与 Codex 配合使用:

# Add XcodeBuildMCP to Codex
codex mcp add XcodeBuildMCP -- npx -y xcodebuildmcp@latest mcp

最适合:无头批处理操作、CI/CD 集成,以及希望从不同模型家族获得第二意见的任务。Codex 的沙箱模式会在隔离环境中运行代码,这对于会修改状态的破坏性操作(例如运行测试套件)很有帮助。

与 Claude Code 的主要差异: - 使用 OpenAI 模型,而非 Claude 模型 - 上下文窗口大小和 token 成本不同 - 以沙箱优先的权限模型(默认限制更多) - MCP 生态更小(经过测试的社区服务器较少) - 提供 hooks 系统(v0.119.0+),但成熟度不及 Claude Code——事件类型更少,也没有条件 if 字段

何时应在 iOS 开发中选择 Codex 而非 Claude Code:

当您需要模型多样性时,选择 Codex——让第二个 Agent 审查第一个 Agent 编写的代码,能够捕获不同类别的错误。协作工作流(Claude 负责构建,Codex 负责审查)对于 iOS 很有效,因为某一模型家族认为正确的 SwiftUI 模式,可能存在另一模型家族能够发现的细微问题。Metal 着色器和并发模式尤其适合双模型审查。

3. Xcode 原生 Agent

它是什么:Apple 将 AI 编码 Agent 直接集成到 Xcode 的 Intelligence 面板中。截至 Xcode 26.3,您可以在 Xcode Settings > Intelligence 中将 Claude Agent 和 Codex 配置为智能服务提供商。10 Xcode 26.6 进一步扩展了阵容:Google Gemini 现已在编码助手中可用(171990272),Xcode 还增加了对 Agent Client Protocol(ACP)的支持(178294840)——最初是双服务提供商集成,如今已扩展为三个服务提供商,加上一个开放协议,使任何兼容 ACP 的 Agent 都能接入 Intelligence 面板。17

设置:

  1. 打开 Xcode 26.3+
  2. 导航至 Settings > Intelligence
  3. 添加新的服务提供商:
  4. 对于 Claude:选择“Claude Agent”,输入您的 Anthropic API 密钥
  5. 对于 Codex:选择“Codex”,输入您的 OpenAI API 密钥
  6. 对于 Gemini:选择“Google Gemini”(Xcode 26.6+)
  7. 对于其他方案:连接兼容 ACP 的 Agent(Xcode 26.6+)
  8. Agent 会显示在 Intelligence 侧边栏中,并可内联调用

最适合:快速内联编辑、具备 Agent 级推理能力的代码补全,以及偏好不离开 Xcode 的开发者。原生集成意味着 Agent 可直接访问 Xcode 的项目上下文——打开的文件、构建目标和 scheme 配置——无需通过 MCP 桥接。

与 CLI Agent 相比的限制——在 Xcode 26.x 中: - 没有 hooks 系统——无法强制保存时格式化或阻止 .pbxproj 写入 - 不加载 CLAUDE.md——Agent 不会读取项目级配置文件 - 自主性有限——Agent 仅作用于当前文件或选区,无法覆盖整个项目 - 不支持子 Agent 委派——无法并行处理复杂的多步骤任务 - 无法配置 MCP 服务器——Agent 仅使用 Xcode 内置工具

Xcode 27 使上述大部分限制不再成立。从 beta 1(6月8日)开始,Xcode 的 Agent 已从内联助手演变为扩展平台:22

  • 插件:“Xcode 中的 Agent 现在可通过包含 skills、MCP 服务器和 ACP Agent 配置的插件进行扩展。Skills 可作为斜杠命令调用,并支持补全。”(178289210)——因此,“仅内置工具”和“无法配置 MCP”这两项限制已不复存在。
  • 模拟器控制:Agent“现在可以启动模拟器、安装和启动 App、合成触控事件,并捕获屏幕截图以验证 UI 行为”(175179787);在 beta 5 中,它们还能驱动 watchOS 硬件输入(181147968)。
  • 调试器访问:Xcode MCP 服务器新增了用于操控运行状态、读取调试器控制台、切换 scheme 和运行目标的工具,并可检查或修改“构建设置、编译器标志、entitlements 和 Info.plist 键”(176935844)。
  • 文件系统安全层:“监控并控制编码 Agent 及其生成的任何进程对文件系统的访问”(178289431);同时还提供一流的规划能力(172857081),以及涵盖崩溃、卡顿、能耗和启动问题的项目洞察(177568662)。

由176935844直接引出的一个警告:Xcode 的 Agent 现在可以编辑构建设置、entitlements 和 Info.plist 键。本指南通过 PreToolUse hook 构建的 .pbxproj 保护在 Xcode 内部不适用,因为该 hook 位于您的 CLI Agent 配置中,而不在 Apple 的配置中。如果您将该 hook 视为安全保障,请注意它对 Intelligence 面板没有管辖权。

何时使用 Xcode 原生 Agent:

适用于快速、范围明确的编辑,此时切换到终端反而增加开销。例如:“为这个模型添加计算属性。”“为这个函数编写单元测试。”“将此视图重构为使用 @Observable。”这类任务通常只涉及一两个文件,且不需要构建-测试循环。

对于任何需要构建、测试、多文件重构或自主错误修复的工作,请使用带有 MCP 的 CLI Agent。

运行时对比矩阵

功能 Claude Code CLI Codex CLI Xcode 原生(26.x → 27)
MCP 支持 完整(102个工具) 完整(102个工具) 26.x:仅内置工具;27:通过插件使用 MCP 服务器22
Hook 系统 是(成熟) 是(基础,v0.119.0+)
CLAUDE.md / 项目配置 等效的 codex.md
自主构建-测试-修复 是(通过 MCP) 是(通过 MCP) 26.x:部分支持(仅内联);27:启动模拟器并验证 UI22
子 Agent 委派 是(最多10个并行)
上下文窗口 1M token(Opus 5) 因模型而异 因服务提供商而异
多文件操作 完整代码库访问 完整代码库访问 26.x:当前文件/选区;27:通过规划实现项目范围操作22
.pbxproj 保护 通过 hooks 手动 不适用(原生使用 Xcode)
保存时格式化 通过 PostToolUse hooks 外部工具 Xcode 设置
离线能力
成本模型 Anthropic API 用量 OpenAI API 用量 服务提供商 API 用量

建议:将 Claude Code CLI 作为主要运行时。使用 Xcode 原生 Agent 处理快速内联编辑。使用 Codex CLI 进行审查和批处理操作。三者相辅相成,而非相互竞争。


MCP 设置:完整配置

MCP(Model Context Protocol)能让 agent 从“编写 Swift,然后希望您能构建成功”变为“编写 Swift、构建、读取结构化错误并修复”。2 本节比这篇博客文章11更深入,涵盖两个服务器、所有安装方式、验证方法,以及确保工具实际被使用的 agent 配置。

XcodeBuildMCP:用于无头 iOS 开发的 82 个工具

XcodeBuildMCPxcodebuildxcrun simctl和 LLDB 封装为 82 个结构化 MCP 工具(其公开工具清单已验证从 v2.6.2 到 v2.7.0 保持不变),分为 12 个工作流类别。31921 该项目的官方归属是getsentryGitHub组织,由 Sentry 维护;原始的cameroncooke/XcodeBuildMCPURL 现已重定向到此处,旧文章引用旧地址时,这一点尤为重要。21 无需运行 Xcode 即可使用——完整的构建、测试、调试循环通过 Apple 的命令行工具以无头方式运行。有两项工具清单说明值得了解:默认 stdio 会话仅公开模拟器工作流中的约 24 个工具,其余工具不会占用 agent 的上下文;如需加载更多工具,请设置XCODEBUILDMCP_ENABLED_WORKFLOWS(使用下表中的类别名称,以逗号分隔)。同一引擎也以 CLI 形式提供(xcodebuildmcp tools显示 100 个命令,其中 72 个为标准命令),若您希望在不使用 MCP 的情况下执行相同操作,可以选择它。9

安装选项:

# Option 1: Via npx (recommended — always uses latest version)
claude mcp add XcodeBuildMCP \
  -s user \
  -e XCODEBUILDMCP_SENTRY_DISABLED=true \
  -- npx -y xcodebuildmcp@latest mcp

# Option 2: Via Homebrew (pinned version, manual updates)
brew install xcodebuildmcp
claude mcp add XcodeBuildMCP \
  -s user \
  -e XCODEBUILDMCP_SENTRY_DISABLED=true \
  -- xcodebuildmcp mcp

# Option 3: Project-scoped (omit -s user)
claude mcp add XcodeBuildMCP \
  -e XCODEBUILDMCP_SENTRY_DISABLED=true \
  -- npx -y xcodebuildmcp@latest mcp

-s user标志会让服务器在所有项目中全局可用。省略该标志则为项目级安装(如果只希望在 iOS 项目而非 Web 项目中使用 MCP,这会很有用)。

环境变量-e XCODEBUILDMCP_SENTRY_DISABLED=true会禁用崩溃报告遥测。XcodeBuildMCP默认集成 Sentry,会发送包括文件路径在内的错误数据。除非您希望为该项目贡献诊断信息,否则建议退出。1

工具清单(12 个工作流类别中的 82 个工具——每类列出代表性工具):

类别 工具 功能
project-discovery discover_projs, list_schemes, show_build_settings, get_app_bundle_id 查找 .xcodeproj/.xcworkspace 文件,列出 scheme,检查构建设置
simulator build_sim, build_run_sim, test_sim, install_app_sim, launch_app_sim 按文件和行号提供结构化错误/警告输出来构建和测试;在模拟器上安装和启动
simulator-management list_sims, boot_sim, open_sim, erase_sims, set_sim_appearance, set_sim_location, session_set_defaults 启动、抹掉和配置模拟器(外观、位置、状态栏)
device build_device, test_device, list_devices, install_app_device, launch_app_device 真机构建、测试、部署和管理
macos build_macos, build_run_macos, test_macos 用于 Mac target 的相同构建—测试循环
swift-package swift_package_build, swift_package_test, swift_package_run 无需 .xcodeproj 即可执行 SwiftPM 构建/测试/运行
coverage get_coverage_report, get_file_coverage 从 .xcresult bundle 获取按 target 和函数划分的覆盖率
debugging debug_attach_sim, debug_breakpoint_add, debug_stack, debug_variables, debug_lldb_command, debug_continue, debug_detach 完整的 LLDB 集成,支持断点和变量检查
ui-automation snapshot_ui, wait_for_ui, batch, tap, drag, swipe, type_text, gesture, screenshot, record_sim_video 通过稳定元素引用进行运行时 UI 自动化(v2.6.0+),并支持视觉捕获
project-scaffolding scaffold_ios_project, scaffold_macos_project 基于模板创建新的 iOS/macOS 项目
utilities clean 清理构建产物
xcode-ide xcode_ide_list_tools, xcode_ide_call_tool 通过 XcodeBuildMCP发现并调用仅限 Xcode-IDE 的 MCP 工具(见下文)

日常工作中最重要的工具:

  1. build_sim——您会调用它数百次。它返回 JSON,其中按文件、行号和严重程度对错误分类。agent 会读取错误、定位文件并修复,无需您亲自操作。

  2. test_sim——返回每个测试方法的结果。agent 能准确知道哪个测试失败及其原因,而不只是“测试失败”。

  3. list_sims+boot_sim——无需记忆xcrun simctl标志即可管理模拟器。agent 会发现可用运行时并选择合适的设备。

  4. discover_projs+list_schemes——项目检查。agent 无需猜测您的 scheme 名称或 workspace 结构。

  5. debug_attach_sim+debug_stack+debug_variables——远程 LLDB 调试。agent 无需您打开调试器,即可设置断点、检查变量并单步执行代码。

v2.6.0 的变化(2026-06-01)——运行时 UI 自动化:

v2.6.0 版本围绕可复用上下文重建了 UI 自动化,而不再依赖一次性截图。19 snapshot_ui现在会返回稳定元素引用和屏幕哈希,并接受sinceScreenHash,以便屏幕未变化时 agent 跳过完整快照。3 个新工具形成闭环:wait_for_ui会轮询至谓词满足(元素存在、启用状态、焦点、可见文本或稳定布局),不再让 agent 通过 sleep 猜测;batch会在单次调用中执行一系列基于元素引用的操作;drag为 sheet 和列表滚动执行基于元素引用的拖动手势。type_text新增replaceExisting,可替换字段值而不是追加;候选控件会根据辅助功能数据排序;结构化结果现在还包含nextSteps提示(本版本将结果 schema 升级至 v2;v2.7.0 此后已将构建/测试结果升级为schemaVersion: 3——见下文)。设置XCODEBUILDMCP_HEADLESS_LAUNCH=true可在后台启动 app,避免抢占 macOS 焦点——这决定了您能否让 agent 会话持续运行,而不是不断把 Simulator 窗口拉到前台。在一个确定性的天气 app 任务中,项目自身的基准测试声称,与 2.6 之前的流程相比,墙钟时间约减少 70%、token 减少 68%、工具调用减少 76%。这些是项目方的数据,而非独立测量;但其机制——跳过未变快照、批量处理同屏操作——正是 UI 自动化消耗 token 的主要来源。19

v2.7.0 的变化(2026-07-23)——Xcode 27 模拟器、schema v3、遵循 scheme 的构建:

v2.7.0 版本相比 2.6.0 改动更小,但在升级前有一项破坏性变更和一项行为变更值得了解。21 核心变化是:UI 自动化工具现可通过 Device Hub 完整支持 Xcode 27 模拟器,包括启动模拟器窗口和键盘控制——弥补了运行时 UI 自动化此前仅能可靠用于 Xcode 26 模拟器的缺口。破坏性变更:构建和测试工具现在返回schemaVersion: 3结构化结果(自 2.6.0 起此前为 v2);任何固定校验或解析版本 2 结果的代码都需要更新。行为变更:当省略configuration时,构建、测试、清理和 app-path 工具现在会遵循 scheme action 的配置,而非始终默认 Debug——如果某个 scheme 的 Test action 设为 Release,未指定配置的test_sim现在会构建 Release,因此若工作流依赖特定配置,请显式传递configuration。其他虽小但实用的改进包括:可复用的.xctestproducts测试准备包让测试无需重新构建即可再次运行,同时每次仍生成新的.xcresult;会话默认extraArgs允许每个会话设置一次常用xcodebuild标志,而无需每次调用重复;新的xcodebuildmcp purgeCLI命令会报告并清理 XcodeBuildMCP的 workspace 存储(默认 dry-run,需显式选择删除);此外还修复了 MCP 客户端等待工具可用时需 10-17 秒的问题——这可能导致短暂健康检查报告连接失败。21

Apple Xcode MCP:桥接至 Xcode 的 20 个工具

Apple 的 MCP 服务器随 Xcode 26.3 通过xcrun mcpbridge提供。4 它通过 XPC(Apple 的进程间通信框架)与正在运行的 Xcode 进程通信,公开任何 CLI 工具都无法访问的内部状态。5

安装:

# Standard installation (global)
claude mcp add --transport stdio xcode \
  -s user -- xcrun mcpbridge

# For Codex CLI
codex mcp add xcode -- xcrun mcpbridge

要求 Xcode 26.3+以及正在运行的 Xcode 进程。如果 Xcode 未打开,通过该服务器进行的每个 MCP 调用都会失败或挂起。XcodeBuildMCP没有这一限制。

Xcode 27 beta 5 预览了摆脱此限制的方式。Apple 新增了“无需打开 Xcode workspace 即可运行的新 MCP 服务器体验”,通过sudo xcrun mcp-server enable启用,并使用xcrun mcp-server status检查。该预览还允许您向已代码签名的 agent 授予在目录树内工作的持久权限,无需每次重新批准。对于无人值守运行,sudo xcrun mcp-server enable --unsafe-always-allow-all-agents会预先批准所有操作——Apple 明确表示这“并非推荐的桌面使用配置”,我也不推荐:它移除了防止 agent 进入您无意公开目录的审批步骤。请将整套能力视为早期预览,在它结束预览前,仍应将 XcodeBuildMCP保留为无头路径。22

工具清单(5 个类别中的 20 个工具):

类别 工具 功能
文件操作 XcodeRead, XcodeWrite, XcodeUpdate, XcodeGlob, XcodeGrep 在 Xcode 项目上下文中读取/写入文件
构建和测试 BuildProject, GetBuildLog, RunAllTests, RunSomeTests 使用 Xcode 的内部构建系统进行构建和测试
诊断 XcodeListNavigatorIssues, XcodeRefreshCodeIssuesInFile 实时代码诊断(不只是构建错误)
代码和文档 ExecuteSnippet, DocumentationSearch Swift REPL 执行和 Apple 文档搜索
预览 RenderPreview 无头 SwiftUI 预览渲染

Apple MCP独有的工具(XcodeBuildMCP中不可用):

  1. DocumentationSearch——搜索 Apple 开发者文档,包括 WWDC session。对于 Apple API问题,它比 Web 搜索更快、更可靠。询问“HKQuantityType(.dietaryWater)是否有效?”即可从源头获得明确答案。

  2. ExecuteSnippet——在项目上下文中执行 Swift REPL。agent 无需构建完整 app,即可验证 API行为、测试类型转换并校验表达式。

  3. RenderPreview——以无头方式渲染 SwiftUI 预览。agent 可以检查 view 是否能够无错误渲染,但无法评估视觉正确性(渲染结果以数据形式返回,不会进行视觉检查)。截至 Xcode 26.6,预览 MCP 工具(26.6 发行说明称其为“Preview Snapshot”)可渲染不同变体——浅色/深色外观、纵向/横向方向和文字尺寸覆盖(178831772)——因此 agent 可以一次验证 view 在各种外观下的表现。17 Xcode 27 beta 进一步扩展了它:支持渲染 Preview group 并以不同本地化语言预览。18

  4. XcodeListNavigatorIssues——返回 Xcode analyzer 的实时诊断,而不只是构建错误。它能捕获构建系统未显示的问题,例如未使用变量、潜在 retain cycle 和弃用警告。

为什么需要两个服务器

它们在构建和测试方面重叠,但本质上有所不同:

┌─────────────────────────────────────────────────────────────────┐
                     MCP TOOL COVERAGE                           
├─────────────────────────────────────────────────────────────────┤
                                                                 
  XcodeBuildMCP (82 tools)        Apple Xcode MCP (20 tools)    
  ┌─────────────────────┐         ┌─────────────────────┐       
   Standalone                     Requires Xcode             
   (no Xcode process)            (XPC bridge)               
                                                            
    Simulators          BOTH     Documentation            
    Real devices       ┌─────┐   Swift REPL               
    LLDB debugging     Build   SwiftUI previews         
    UI automation      Test    Live diagnostics         
    Project scaffold   └─────┘   Analyzer issues          
    Screenshot                                             
  └─────────────────────┘         └─────────────────────┘       
                                                                 
└─────────────────────────────────────────────────────────────────┘

使用 XcodeBuildMCP处理:构建—测试—调试循环。它无需打开 Xcode,消耗的系统内存更少,并提供更丰富的模拟器和真机管理功能。这是您的主要构建工具。

使用 Apple Xcode MCP处理:文档查询、Swift REPL 验证、SwiftUI 预览渲染和实时诊断。在需要这些能力的会话期间保持 Xcode 打开。

实际使用中:我将约 90% 的 MCP 调用用于 XcodeBuildMCP,并使用 Apple Xcode MCP进行文档和 REPL 验证。agent 默认使用 XcodeBuildMCP进行构建和测试,因为它更快(没有 Xcode 进程开销),也更可靠(没有 XPC 依赖)。

双服务器的界限正在弱化。XcodeBuildMCP 2.6.x 新增了xcode-ide代理类别:xcode_ide_list_tools可发现仅限 Xcode-IDE 的 MCP 能力,xcode_ide_call_tool可调用它们(它们以xcode_tools_*名称呈现,例如xcode_tools_documentationsearch),因此单个 XcodeBuildMCP注册现在也能访问 Apple 的 IDE 端工具。19 关键限制并未改变:这些代理调用仍然需要正在运行的 Xcode 进程,与直接注册xcrun mcpbridge完全相同。如果您希望 Apple 工具以一等工具形式出现在 agent 工具列表中,请保持两个服务器均已注册;当您只想配置一个服务器条目、且只是偶尔读取 IDE 信息时,该代理最为实用。

验证

安装两个服务器后,验证它们是否已连接:

# List all configured MCP servers
claude mcp list

# Expected output includes:
# XcodeBuildMCP: npx -y xcodebuildmcp@latest mcp - Connected
# xcode: xcrun mcpbridge - Connected

如果服务器显示“Disconnected”或未出现:

  1. XcodeBuildMCP未连接:确认已安装 Node.js(node --version)。npx命令需要 Node.js 18+。

  2. Apple Xcode MCP未连接:确认已安装 Xcode 26.3+,且xcrun mcpbridge命令可在终端中运行。至少打开一次 Xcode,以接受许可协议。

  3. 两者均未出现:重启 Claude Code(在新终端中运行claude)。会话中途注册的 MCP 服务器可能要在重启后才会出现。

教会 agent 使用 MCP

安装 MCP 服务器是必要条件,但还不够。没有明确指引时,agent 可能会退回通过 Bash 运行xcodebuild(输出无结构,浪费上下文 token),或使用 Web 搜索查询 Apple 文档(更慢,也更不可靠)。

将以下内容添加到您的 CLAUDE.md 或 agent 定义中:

## Build & Test — Always Use MCP

Prefer MCP tools over raw shell commands for ALL build operations:

- **Build**: `build_sim` / `build_device` (NOT `xcodebuild` via Bash)
- **Test**: `test_sim` / `test_device` (NOT `xcodebuild test` via Bash)
- **Simulators**: `list_sims`, `boot_sim`, `open_sim` (NOT `xcrun simctl` via Bash)
- **Debug**: `debug_attach_sim`, `debug_stack`, `debug_variables`
- **Apple docs**: `DocumentationSearch` (NOT WebSearch for Apple APIs)
- **Swift verification**: `ExecuteSnippet` (NOT `swift` via Bash)
- **Previews**: `RenderPreview` for headless SwiftUI verification

MCP returns structured JSON. Bash returns unstructured text.
Structured data means fewer tokens consumed and better error diagnosis.

该指引可确保 agent 优先使用 MCP 工具。否则,您会看到 agent 通过 Bash 构造冗长的xcodebuild命令,消耗数千个上下文 token 解析输出,有时还会误判实际错误。6

XcodeBuildMCP v2.7.0 有一项行为变化应纳入本节的心智模型:省略configuration时,构建、测试、清理和 app-path 工具现在会遵循 scheme action 的配置,而不是始终使用 Debug。21 大多数 scheme 在 Debug 下运行和测试,因此多数项目不会察觉任何变化;但如果某个 scheme 的 action 设为 Release(常见于性能分析 scheme 或接近归档的配置),未指定配置的build_simtest_sim现在会构建 Release。如果您的 CLAUDE.md 或 hook 假设 Debug 产物,请在工具调用中明确说明,或通过session_set_defaults每个会话设置一次。

长时间构建:Claude Code现会在后台运行它们

Claude Code的两个版本改变了会话内长时间构建的表现。自 v2.1.212(2026-07-16)起,运行超过 2 分钟的任何 MCP 工具调用都会自动移至后台,以便会话保持可用;可通过CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS配置阈值,或禁用此行为。20 真实项目中的干净构建和通过build_sim/test_sim运行的完整测试经常超过 2 分钟,因此请预期 agent 会在构建后台完成时继续工作——读取文件、规划下一次编辑——而不是阻塞当前轮次。配套修复同样重要:在 v2.1.206(2026-07-09)之前,通过--mcp-config.mcp.json配置的每服务器request_timeout_ms在新会话中会被忽略,因此长时间 MCP 调用会在默认的 60 秒后超时——典型症状是首次干净构建超时,却在重试后“自行修复”。20 如果您曾使用包装脚本或预热构建来规避其中任一行为,现在可以删除这些变通方案。

iOS项目的CLAUDE.md模式

在智能体辅助开发中,CLAUDE.md是项目里最重要的文件。它是智能体的入职文档——决定了它像读过架构文档的新员工,还是只能靠猜的新员工。

我维护的每个iOS项目都有CLAUDE.md。下面这些模式来自全部8个应用,实践证明有效。

核心章节

每个iOS CLAUDE.md都需要这6个章节。其他内容都是可选的。

1. 项目身份信息

# Return - Zen Focus Timer

**Bundle ID:** `com.941apps.Return`
**Target:** iOS 26+ / macOS Tahoe / watchOS 26+ / tvOS 26+
**Architecture:** SwiftUI with @Observable pattern, companion Watch and TV apps
**Swift version:** 6.2
**Minimum deployment:** iOS 26.0

为什么重要:智能体在编写任何代码之前,都需要知道部署目标。面向iOS 17的智能体会使用NavigationView@ObservedObject。面向iOS 26的智能体会使用NavigationStack@Observable。Bundle ID会影响entitlements和HealthKit配置。Swift版本决定并发模型(async/await还是完成回调,严格并发还是宽松并发)。

2. 带用途标注的文件结构

## File Structure

```
Return/
├── ReturnApp.swift              # App entry, dark mode enforcement
├── ContentView.swift            # Main timer view with theme backgrounds
├── TimerManager.swift           # Timer state, logic, and repeat handling
├── AudioManager.swift           # Sound playback with AVAudioPlayer
├── Settings.swift               # Centralized settings with validation
├── SettingsSheet.swift          # Settings UI
├── HealthKitManager.swift       # Mindful session logging + cross-device sync
├── LiveActivityManager.swift    # Lock Screen/Dynamic Island
├── Theme.swift                  # Theme definitions
├── ThemeManager.swift           # Theme state management
├── VideoBackgroundView.swift    # AVPlayer video backgrounds
├── GlassTextShape.swift         # Core Text glyph paths for glass effect
├── GlassTimerText.swift         # Timer text with glass material
└── Constants.swift              # App constants
```

每个文件名后的内联注释不是装饰。它们是您能写下的最具杠杆效应的文档。当智能体决定在哪里添加新功能时,这些标注会让它第一次就找到正确文件,而不是读遍所有文件才理解项目结构。

反模式:只列文件、不写标注。TimerManager.swift无法告诉智能体它处理状态、UI,还是两者都处理。TimerManager.swift # Timer state, logic, and repeat handling则会明确告诉它哪些内容属于这里,哪些不属于。

3. 构建和测试命令

## Build & Test

Build for iOS simulator:
```bash
xcodebuild -scheme Return -destination 'platform=iOS Simulator,name=iPhone 16 Pro' build
```

Run tests:
```bash
xcodebuild -scheme Return -destination 'platform=iOS Simulator,name=iPhone 16 Pro' test
```

Run tvOS tests:
```bash
xcodebuild -scheme ReturnTV -destination 'platform=tvOS Simulator,name=Apple TV' test
```

**Prefer MCP tools** (`build_sim`, `test_sim`) over these raw commands.
MCP returns structured JSON with categorized errors.

即使智能体应优先使用MCP,也要包含原始命令。原始命令可作为备用文档,并明确scheme名称和destination。

4. 关键模式和规则

## Key Patterns

### Observable Architecture
- ALL view models use `@Observable` (NEVER `ObservableObject`)
- ALL navigation uses `NavigationStack` (NEVER `NavigationView`)
- State management via `@Observable` classes with `@MainActor` isolation

### Settings Pattern
- Centralized `Settings.shared` singleton
- All settings bounded to valid ranges with validation
- Sound names validated against whitelist
- Thread-safe access via @MainActor

### Audio System
- `AVAudioPlayer` with `.playback` category (plays in silent mode)
- Silent audio loop for background execution
- Bell playback with completion callbacks and token-based staleness

这些模式可以防止智能体引入不一致。没有明确的模式文档时,智能体有时会在一个文件中使用ObservableObject,在另一个文件中使用@Observable,或者创建新的设置机制,而不是使用现有的Settings.shared单例。

5. 智能体绝不能做的事

## Rules

- **NEVER modify .pbxproj files** — create Swift files, then I will add them to Xcode manually
- **NEVER modify .xcodeproj/ contents directly**
- **NEVER add new package dependencies** without asking first
- **NEVER change the deployment target**
- **NEVER modify entitlements files** unless explicitly asked
- **NEVER use NavigationView** — always NavigationStack
- **NEVER use ObservableObject** — always @Observable
- **NEVER use @StateObject** — always @State with @Observable

明确的禁令比隐含期望更有效。智能体对负面约束的遵循通常更可靠,因为它们是二元判断(做/不做),而不是启发式判断(优先这个/有时用那个)。

6. 特定框架上下文

本节因应用而异。对于任何配置不直观的框架,都应包含本节:

对于HealthKit应用:

## HealthKit Configuration

- Entitlement: `com.apple.developer.healthkit`
- Info.plist keys:
  - `NSHealthShareUsageDescription`: "Return reads your mindful minutes..."
  - `NSHealthUpdateUsageDescription`: "Return logs meditation sessions..."
- Category types: `HKCategoryType(.mindfulSession)`
- Authorization checked on every write (user can revoke at any time)
- HealthKit is unavailable on tvOS — guard with `#if canImport(HealthKit)`

对于SwiftData应用:

## SwiftData Models

### Model Relationships
- `GroceryList` has many `GroceryItem` (cascade delete)
- `GroceryItem` belongs to one `GroceryList`
- `GroceryItem` has optional `Category`

### Model Container Setup
- Configured in App struct with `modelContainer(for:)`
- Schema versioning: currently V2
- Migration plan: `GroceryMigrationPlan` handles V1 → V2

### Queries
- `@Query(sort: \GroceryItem.name)` for sorted fetches
- `@Query(filter: #Predicate { !$0.isCompleted })` for active items
- Always use `@Query` in views, `modelContext.fetch()` in managers

对于SpriteKit应用:

## SpriteKit Scene Hierarchy

```
GameScene (SKScene)
├── backgroundLayer (SKNode, zPosition: -100)
│   └── StarfieldNode (custom, parallax scrolling)
├── gameLayer (SKNode, zPosition: 0)
│   ├── playerShip (PlayerNode, zPosition: 10)
│   ├── enemyContainer (SKNode, zPosition: 5)
│   └── bulletPool (SKNode, zPosition: 8)
├── effectsLayer (SKNode, zPosition: 50)
│   └── ParticleManager (manages explosion/trail emitters)
└── hudLayer (SKNode, zPosition: 100)
    ├── scoreLabel (SKLabelNode)
    └── healthBar (HealthBarNode)
```

- Physics categories defined in `PhysicsCategory.swift` as bitmasks
- Contact detection via `didBegin(_ contact:)` on GameScene
- Bullet pooling: pre-allocate 50, recycle via `removeFromParent()` + re-add

对于Metal应用:

## Metal Pipeline

- Render pipeline: `MetalView``Renderer``ShaderLibrary`
- Compute pipeline: `AudioAnalyzer` → compute shader → texture output
- Shared uniforms struct: `Uniforms` in `ShaderTypes.h` (bridged to Swift)
- Frame timing: `CADisplayLink` drives render loop
- Buffer triple-buffering: 3 in-flight frames with semaphore

### Shader Files
- `Shaders.metal` — Main render shaders (vertex + fragment)
- `Compute.metal` — Audio analysis compute kernel
- `PostProcess.metal` — Bloom and color grading

### DO NOT modify Metal shaders without testing on device.
Simulator Metal is not representative of device GPU behavior.

真实CLAUDE.md:Banana List(SwiftUI + SwiftData + iCloud + MCP服务器)

下面是一个带标注的示例,展示这6个章节如何在一个中等复杂度应用中协同发挥作用。这是我在Banana List中使用的CLAUDE.md模式:它是一个包含53个文件的购物清单应用,支持iCloud同步,并带有一个自定义MCP服务器,可将应用数据提供给Claude Desktop:

# Banana List - Grocery List App

**Bundle ID:** `com.941apps.BananaList`
**Target:** iOS 26+
**Architecture:** SwiftUI + SwiftData + iCloud Drive sync
**Swift version:** 6.2
**Minimum deployment:** iOS 26.0

## Core Features

- Grocery lists with items, categories, and quantities
- iCloud Drive sync via SwiftData CloudKit integration
- Custom MCP server exposing list data to Claude Desktop
- Liquid Glass design system
- Haptic feedback on interactions
- Share sheets for list sharing

## File Structure

```
BananaList/
├── BananaListApp.swift           # App entry, model container setup
├── Models/
│   ├── GroceryList.swift         # @Model: list with name, items, color
│   ├── GroceryItem.swift         # @Model: item with name, quantity, category, isCompleted
│   ├── Category.swift            # @Model: user-defined categories
│   └── SampleData.swift          # Preview and test data
├── Views/
│   ├── ListsView.swift           # Main list of grocery lists
│   ├── ListDetailView.swift      # Items within a list
│   ├── ItemRow.swift             # Single item row with swipe actions
│   ├── AddItemSheet.swift        # New item form
│   ├── CategoryPicker.swift      # Category selection with create-new
│   └── SettingsView.swift        # App settings
├── Managers/
│   ├── CloudSyncManager.swift    # iCloud Drive sync status and conflict resolution
│   └── HapticManager.swift       # UIImpactFeedbackGenerator wrapper
├── MCP/
│   ├── MCPServer.swift           # MCP server for Claude Desktop integration
│   ├── ListTools.swift           # MCP tools: list CRUD operations
│   └── ItemTools.swift           # MCP tools: item CRUD operations
└── Extensions/
    ├── Color+Extensions.swift    # Custom color definitions
    └── View+Extensions.swift     # Reusable view modifiers
```

## SwiftData Models

### Relationships
- `GroceryList` has many `GroceryItem` (cascade delete)
- `GroceryItem` belongs to one `GroceryList` (required)
- `GroceryItem` has optional `Category`
- `Category` has many `GroceryItem` (nullify on delete)

### Container Setup
```swift
@main
struct BananaListApp: App {
    var body: some Scene {
        WindowGroup {
            ListsView()
        }
        .modelContainer(for: [GroceryList.self, GroceryItem.self, Category.self])
    }
}
```

### Query Patterns
- Lists: `@Query(sort: \GroceryList.name) var lists: [GroceryList]`
- Active items: `@Query(filter: #Predicate { !$0.isCompleted })`
- By category: filter in-memory after fetch (SwiftData predicate limitations)

## Build & Test

```bash
xcodebuild -scheme BananaList -destination 'platform=iOS Simulator,name=iPhone 16 Pro' build
xcodebuild -scheme BananaList -destination 'platform=iOS Simulator,name=iPhone 16 Pro' test
```

Prefer MCP tools (`build_sim`, `test_sim`) over raw commands.

## Key Patterns

### Observable + SwiftData
- SwiftData `@Model` classes are automatically Observable
- DO NOT add `@Observable` to `@Model` classes (redundant, causes warnings)
- Use `@Bindable` for two-way bindings to model properties in forms
- Use `@Query` in views, `modelContext.fetch()` in non-view code

### iCloud Sync
- Automatic via SwiftData CloudKit integration
- Conflict resolution: last-write-wins (CloudKit default)
- Sync status exposed via `CloudSyncManager.shared.syncState`
- Test sync by running on two simulators with same iCloud account

### MCP Server Architecture
- Runs as a local WebSocket server on port 8765
- Exposes 6 tools: listAll, getList, createList, addItem, completeItem, deleteItem
- Claude Desktop connects via MCP config in `~/.config/claude-desktop/config.json`

## Rules

- NEVER modify .pbxproj or .xcodeproj contents
- NEVER change the model schema without updating SampleData.swift
- NEVER use `ObservableObject` — SwiftData models are already Observable
- NEVER use `@StateObject` — use `@State` with `@Observable` classes
- NEVER use `NavigationView` — always `NavigationStack`
- NEVER add `@Observable` macro to `@Model` classes
- ALWAYS use `@Bindable` for form bindings to model properties
- ALWAYS test iCloud sync changes on two simulator instances

真实CLAUDE.md:Reps(最小SwiftData应用,14个文件)

对于小项目,CLAUDE.md可以很简洁。下面是Reps的模式,它是一个包含14个文件的健身训练记录应用。注意,即使是很短的CLAUDE.md,也覆盖了6个核心章节:

# Reps - Workout Tracking

**Bundle ID:** `com.941apps.Reps`
**Target:** iOS 26+
**Architecture:** SwiftUI + SwiftData
**Swift version:** 6.2

## File Structure

```
Reps/
├── RepsApp.swift              # App entry, model container
├── Models/
│   ├── Workout.swift          # @Model: workout with exercises, date, duration
│   ├── Exercise.swift         # @Model: exercise with sets, reps, weight
│   └── ExerciseTemplate.swift # @Model: saved exercise definitions
├── Views/
│   ├── WorkoutListView.swift  # Main list of workouts
│   ├── WorkoutDetailView.swift # Exercises within a workout
│   ├── ExerciseRow.swift      # Single exercise with inline editing
│   ├── AddExerciseSheet.swift # Exercise selection from templates
│   ├── NewWorkoutView.swift   # Start new workout flow
│   └── StatsView.swift        # Progress charts and summaries
├── Managers/
│   └── WorkoutTimer.swift     # Active workout timer
└── Extensions/
    └── Date+Extensions.swift  # Formatting helpers
```

## Build & Test

```bash
xcodebuild -scheme Reps -destination 'platform=iOS Simulator,name=iPhone 16 Pro' build
xcodebuild -scheme Reps -destination 'platform=iOS Simulator,name=iPhone 16 Pro' test
```

## SwiftData Relationships

- `Workout` has many `Exercise` (cascade delete)
- `Exercise` has optional `ExerciseTemplate`
- `ExerciseTemplate` standalone (nullify on exercise delete)

## Rules

- NEVER modify .pbxproj
- NEVER use ObservableObject — use @Observable
- NEVER use NavigationView — use NavigationStack
- @Model classes are already Observable — do not add @Observable macro
- Use @Bindable for form bindings to model properties

对于一个14个文件的项目,这份CLAUDE.md只有40行。写它花10分钟,却能省下数小时的智能体困惑时间。

真实CLAUDE.md:Starfield Destroyer(SpriteKit + Metal,32个文件)

游戏项目需要更多特定框架上下文。智能体需要理解场景图、物理类别和游戏状态机:

# Starfield Destroyer - Space Shooter

**Bundle ID:** `com.941apps.StarfieldDestroyer`
**Target:** iOS 26+
**Architecture:** SpriteKit + Metal post-processing + Game Center
**Swift version:** 6.2

## Game Overview

99 levels across 3 galaxies. 8 unlockable ships with different stats.
Game Center leaderboards and achievements. Metal shader post-processing
for bloom and screen effects.

## File Structure

```
StarfieldDestroyer/
├── StarfieldDestroyerApp.swift    # App entry, Game Center auth
├── GameScene.swift                # Main game scene, update loop
├── MenuScene.swift                # Title screen, ship selection
├── Entities/
│   ├── PlayerShip.swift           # Player node with physics, weapons, shields
│   ├── EnemyShip.swift            # Enemy base class with AI behaviors
│   ├── Bullet.swift               # Bullet pool node
│   ├── PowerUp.swift              # Collectible power-ups
│   └── Boss.swift                 # Boss enemies (levels 33, 66, 99)
├── Systems/
│   ├── LevelManager.swift         # Level progression, wave spawning
│   ├── PhysicsCategory.swift      # UInt32 bitmask categories
│   ├── CollisionHandler.swift     # Contact delegate methods
│   ├── ScoreManager.swift         # Score tracking, multipliers
│   ├── ParticleManager.swift      # Explosion, trail, shield emitters
│   └── AudioManager.swift         # Sound effects, background music
├── UI/
│   ├── HUDNode.swift              # Score, health, level display
│   ├── ShipSelectView.swift       # SwiftUI ship selection (UIHostingController)
│   ├── GameOverView.swift         # Game over screen with score submission
│   └── PauseMenu.swift            # Pause overlay
├── Metal/
│   ├── MetalRenderer.swift        # Post-processing render pipeline
│   ├── BloomShader.metal          # Bloom post-process effect
│   └── ShaderTypes.h              # Shared uniforms (bridging header)
├── Data/
│   ├── ShipData.swift             # 8 ship definitions (speed, damage, shields)
│   ├── LevelData.swift            # 99 level configurations
│   └── AchievementData.swift      # Game Center achievement definitions
└── GameCenterManager.swift        # Leaderboard/achievement submission
```

## SpriteKit Scene Hierarchy

```
GameScene (SKScene)
├── backgroundLayer (zPosition: -100)
│   └── StarfieldNode (parallax scrolling, 3 layers)
├── gameLayer (zPosition: 0)
│   ├── playerShip (zPosition: 10)
│   ├── enemyContainer (zPosition: 5)
│   ├── bulletPool (zPosition: 8) — pre-allocated 50 bullets
│   └── powerUpContainer (zPosition: 3)
├── effectsLayer (zPosition: 50)
│   └── ParticleManager (explosion + trail emitters)
└── hudLayer (zPosition: 100)
    ├── scoreLabel (SKLabelNode)
    ├── healthBar (custom SKShapeNode)
    └── levelLabel (SKLabelNode)
```

## Physics Categories

```swift
struct PhysicsCategory {
    static let none:      UInt32 = 0
    static let player:    UInt32 = 0b1        // 1
    static let enemy:     UInt32 = 0b10       // 2
    static let bullet:    UInt32 = 0b100      // 4
    static let powerUp:   UInt32 = 0b1000     // 8
    static let shield:    UInt32 = 0b10000    // 16
    static let bossBullet:UInt32 = 0b100000   // 32
}

// Contact pairs:
// player + enemy → damage
// player + powerUp → collect
// bullet + enemy → destroy
// player + bossBullet → damage
```

## Game State Machine

```
.menu → .playing → .paused → .playing
                 → .gameOver → .menu
                 → .bossIntro → .playing
                 → .levelComplete → .playing (next level)
```

## Metal Post-Processing

- Bloom shader: `BloomShader.metal` — multi-pass Gaussian blur + additive blend
- Uniforms: `PostProcessUniforms { float intensity; float threshold; float2 resolution; }`
- Applied after SpriteKit renders each frame via `SKView.presentScene(:transition:)`
- DO NOT modify Metal shaders without testing on device

## Build & Test

```bash
xcodebuild -scheme StarfieldDestroyer -destination 'platform=iOS Simulator,name=iPhone 16 Pro' build
xcodebuild -scheme StarfieldDestroyer -destination 'platform=iOS Simulator,name=iPhone 16 Pro' test
```

## Rules

- NEVER modify .pbxproj
- NEVER modify PhysicsCategory bitmasks (breaks all collision detection)
- NEVER change the scene hierarchy z-ordering without understanding render order
- NEVER modify ShaderTypes.h without updating both Swift and Metal references
- Add new enemies by subclassing EnemyShip, not by modifying it
- Bullet pooling: recycle via removeFromParent() + re-add, never allocate new
- Game Center: always check isAuthenticated before submitting scores

真实CLAUDE.md:amp97(Metal + 音频可视化,41个文件)

Metal项目最需要特定框架上下文,因为智能体无法验证视觉输出:

# amp97 - Audio Visualizer

**Bundle ID:** `com.941apps.amp97`
**Target:** iOS 26+
**Architecture:** Metal render pipeline + AVAudioEngine analysis
**Swift version:** 6.2

## Architecture

```
Audio Input (microphone/file)
    → AVAudioEngine tap
    → FFT (vDSP)
    → Frequency/amplitude buffers
    → Metal compute shader (analysis)
    → Metal render pipeline (visualization)
    → CADisplayLink (60fps)
    → MTKView
```

## File Structure

```
amp97/
├── amp97App.swift               # App entry
├── Audio/
│   ├── AudioEngine.swift        # AVAudioEngine setup, tap installation
│   ├── FFTProcessor.swift       # vDSP FFT, frequency bin extraction
│   ├── AudioBuffer.swift        # Ring buffer for audio data
│   └── MicrophoneManager.swift  # Microphone permission, session config
├── Rendering/
│   ├── MetalView.swift          # MTKView wrapper for SwiftUI
│   ├── Renderer.swift           # Main render loop, pipeline state
│   ├── ShaderLibrary.swift      # Compiled shader management
│   ├── BufferManager.swift      # Triple-buffered uniform updates
│   └── TextureManager.swift     # Offscreen render targets
├── Shaders/
│   ├── Shaders.metal            # Vertex + fragment shaders
│   ├── AudioCompute.metal       # Audio analysis compute kernel
│   ├── PostProcess.metal        # Bloom, color grading
│   └── ShaderTypes.h            # Shared uniforms (bridging header)
├── Visualizations/
│   ├── WaveformViz.swift        # Oscilloscope-style waveform
│   ├── SpectrumViz.swift        # Frequency spectrum bars
│   ├── CircularViz.swift        # Radial visualization
│   └── VizSelector.swift        # Visualization switching
├── Views/
│   ├── MainView.swift           # Full-screen viz with overlays
│   ├── ControlsOverlay.swift    # Play/pause, viz selection, gain
│   └── SettingsView.swift       # Audio source, sensitivity
└── Extensions/
    ├── SIMD+Extensions.swift    # Vector math helpers
    └── Color+Metal.swift        # UIColor → float4 conversion
```

## Metal Pipeline

### Uniforms (ShaderTypes.h)
```c
typedef struct {
    float time;
    float2 resolution;
    float audioLevel;       // 0.0-1.0 RMS amplitude
    float frequencyBins[64]; // FFT output, normalized
    float4x4 transform;
} Uniforms;
```

### Render Pipeline
1. Compute pass: AudioCompute.metal processes FFT data → texture
2. Render pass: Shaders.metal reads texture + uniforms → visualization
3. Post-process pass: PostProcess.metal applies bloom → final output

### Buffer Management
- Triple buffering with DispatchSemaphore(value: 3)
- Uniforms updated per-frame on CPU, consumed by GPU 1-2 frames later
- Audio data ring buffer: 4096 samples, lock-free single producer/consumer

## Rules

- NEVER modify ShaderTypes.h without updating BOTH Swift and Metal sides
- NEVER exceed 64 frequency bins (fixed buffer size in shader)
- NEVER test Metal visual output in simulator — device only
- NEVER modify the audio engine tap format (48kHz, mono, float32)
- Triple buffer discipline: always signal semaphore in completion handler
- Audio session: .playAndRecord category with .defaultToSpeaker option

根据项目规模扩展CLAUDE.md

合适的详细程度取决于文件数量和框架复杂度:

项目规模 CLAUDE.md深度 示例
小型(<20个文件) 身份信息+文件列表+规则 Reps(14个文件):基本SwiftData模式、构建命令、禁止事项
中型(20-40个文件) +框架上下文+关键模式 TappyColor(30个文件):SpriteKit场景层级、物理类别、游戏循环
大型(40+个文件) +架构图+关系映射+多目标信息 Return(63个文件):跨平台架构、会话同步图、各平台差异
专用型(Metal/GPU) +管线图+共享类型定义+缓冲区布局 amp97(41个文件):渲染管线阶段、uniform结构体、缓冲区管理

文档写得过多,成本几乎为零(智能体会跳过不需要的内容)。文档写得不足,成本很高(智能体会发明与代码库冲突的模式)。

CLAUDE.md检查清单

创建或审计iOS项目的CLAUDE.md时,请使用此清单:

  • [ ] 已指定Bundle ID和部署目标
  • [ ] 已命名Swift版本和架构模式
  • [ ] 文件结构包含内联用途标注
  • [ ] 构建命令包含正确的scheme和destination
  • [ ] 测试命令包含正确的scheme和destination
  • [ ] 已注明MCP偏好(”prefer build_sim over xcodebuild”)
  • [ ] @Observable规则(绝不使用ObservableObject)
  • [ ] NavigationStack规则(绝不使用NavigationView)
  • [ ] .pbxproj禁令
  • [ ] 特定框架上下文(HealthKit权限、SwiftData关系、SpriteKit层级、Metal管线)
  • [ ] 已记录平台可用性保护(#if canImport、#if os)
  • [ ] 已记录关键单例和共享模式
  • [ ] 已注明已知限制或易错点

您的第一次智能体会话

在配置好MCP,并且项目中已有 CLAUDE.md 后,下面是一段高效首次会话的演练。这里使用Claude Code CLI,但该工作流适用于任何运行时。

第1步:验证智能体能否看到您的项目

You: Summarize this project. What scheme should I build with?

Claude: [reads CLAUDE.md]
        [calls discover_projs via MCP]
        [calls list_schemes via MCP]

        This is Return, a zen meditation timer for iOS 26+, watchOS, and tvOS.
        Available schemes: Return, ReturnWatch, ReturnTV, ReturnTests.
        Primary scheme for iOS: Return.

如果智能体没有引用您的 CLAUDE.md 内容,请检查该文件是否位于项目根目录(与.xcodeprojPackage.swift同一目录)。

第2步:运行健康检查构建

You: Build the Return scheme for iOS simulator and report results.

Claude: [calls list_sims — finds iPhone 16 Pro on iOS 26.2]
        [calls boot_sim — boots the simulator]
        [calls build_sim — builds the project]

        Build succeeded. 63 source files compiled.
        2 warnings:
        - HomeView.swift:132 — UIScreen.main deprecated in iOS 26.0
        - LogWaterIntent.swift:61 — Result of try? is unused
        0 errors.

第3步:运行测试

You: Run all tests and report pass/fail.

Claude: [calls test_sim]

        12 tests executed:
         TimerManagerTests (5/5 passed)
         SettingsTests (4/4 passed)
         ConstantsTests (3/3 passed)
        All tests passed.

第4步:实现一项功能

You: Add a new "Rain" theme to the theme system. Follow the existing
     pattern in Theme.swift and ThemeManager.swift. Include a rain
     ambient sound. Build and test after implementation.

Claude: [reads Theme.swift  understands Theme struct pattern]
        [reads ThemeManager.swift  understands theme registration]
        [reads existing theme definitions]
        [adds Rain theme to Theme.swift following existing pattern]
        [registers Rain theme in ThemeManager.swift]
        [calls build_sim  build succeeds]
        [calls test_sim  all tests pass]

        Added Rain theme:
        - Theme.swift: new `static let rain` with video, cover, ambient
        - ThemeManager.swift: added to `allThemes` array
        - Build: success (0 errors, 2 existing warnings)
        - Tests: 12/12 passed

        Note: You'll need to add rain_ambient.wav to the project
        and add the new Theme.swift changes to the Xcode target manually
        (I did not modify .pbxproj).

智能体关于不修改 .pbxproj 的说明,来自 CLAUDE.md 中的规则。没有这条规则,智能体会尝试修改项目文件,而且很可能导致文件损坏。


智能体在 iOS 中擅长做什么

以下任务中,智能体通常能稳定产出正确、可用于生产的结果,并且只需很少的人工审查。

SwiftUI 视图和修饰符

智能体对 SwiftUI 声明式语法具备很强的模式识别能力。视图组合、修饰符链、状态绑定和布局——这些都非常适合智能体的训练数据,因为 SwiftUI 的API表面文档完善,模式也高度一致。

智能体擅长的场景: - 根据描述构建新视图(“创建一个设置表单,其中包含 X、Y、Z 的开关”) - 应用修饰符链(.glassEffect().sensoryFeedback().navigationTitle()) - 在不同布局模式之间转换(VStack 到 LazyVGrid,List 到 ScrollView) - 为 SwiftData 模型实现@Bindable表单绑定 - 使用示例数据构建预览提供器

能够产生优秀结果的示例提示:

Create a SettingsView that matches the existing pattern in SettingsSheet.swift.
Include toggles for:
- Enable haptic feedback (Settings.shared.hapticsEnabled)
- Enable HealthKit logging (Settings.shared.healthKitEnabled)
- Show session history (navigation link to SessionHistoryView)

Use Liquid Glass styling with .glassEffect() on section backgrounds.
Follow the @Observable pattern, not ObservableObject.

具体程度很重要。“Create a settings view”会产生通用输出。“Create a SettingsView that matches the existing pattern in SettingsSheet.swift”则会产生与代码库一致的输出。

SwiftData 模型和查询

智能体能够可靠处理 SwiftData 的@Model宏、关系和@Query模式。该框架的声明式特性(类似 Django ORM 或 SQLAlchemy)与智能体在大量代码库中见过的模式高度契合。

智能体擅长的场景: - 定义带关系的@Model类 - 编写带排序描述符和谓词的@Query - 通过modelContext实现 CRUD 操作 - 制定 schema 版本之间的迁移计划 - 预览数据和测试夹具

智能体需要指导的场景: - 复杂的#Predicate表达式(SwiftData 的谓词 DSL 存在一些限制,智能体并不总是了解——请在 CLAUDE.md 中记录已知限制) - CloudKit 同步配置(SwiftData 会自动处理,但智能体可能会尝试实现手动同步)

单元测试

智能体为 iOS 项目编写的单元测试质量一贯较高。它理解 XCTest 模式、async 测试方法,以及 setup/teardown 生命周期。

Write unit tests for TimerManager covering:
1. Initial state is .stopped
2. start() transitions to .running
3. pause() transitions to .paused
4. reset() returns to .stopped with original duration
5. Timer counts down correctly (test with 3-second duration)

智能体会生成结构清晰的 XCTest 用例,包含setUp()tearDown()、恰当的断言,以及针对基于定时器测试的 async 处理。

重构和模式应用

智能体擅长机械式重构:将视图提取为组件、将ObservableObject转换为@Observable、从NavigationView迁移到NavigationStack,并在多个文件中应用一致模式。

Refactor all views in the Views/ directory to use @Observable instead of
ObservableObject. Update @StateObject to @State, @ObservedObject to direct
property access, and @Published to plain properties.

智能体会有条不紊地处理每个文件,正确应用转换,并保持现有功能不变。这类工作杠杆很高——原本需要手动编辑一小时的重构,几分钟内即可完成,而且准确率接近完美。

通过MCP诊断构建错误

借助结构化的MCP输出,智能体诊断构建错误的速度比大多数开发者更快。智能体会读取错误JSON,定位到确切的文件和行,理解错误消息,并应用修复——通常一轮即可完成。

智能体可自主修复的错误: - 缺少 import - 类型不匹配 - 协议遵循缺口 - 使用已弃用的API(并替换为新写法) - 缺少必需的初始化参数 - 访问控制违规

智能体需要帮助的错误: - 类型解析存在歧义(多个模块定义了同一类型) - 复杂的泛型约束失败 - 宏展开错误(智能体无法看到展开后的宏输出)

Simulator 管理

智能体可通过MCP很好地处理 Simulator 生命周期:

Boot an iPhone 16 Pro simulator on iOS 26, install the app, and take a screenshot.

智能体会调用list_sims查找可用运行时,调用boot_sim启动模拟器,调用build_sim进行构建和安装,并调用screenshot捕获截图——所有操作都通过结构化MCP调用完成。


智能体在iOS中不擅长的事

如实说明智能体会在哪些地方失败。了解这些边界,可以避免挫败感和token浪费。

.pbxproj文件修改——绝对不要

这是iOS智能体开发中最重要的一条规则。.pbxproj文件是Xcode的项目配置,即一个包含UUID引用、构建阶段列表和target成员关系的结构化文本文件。它名义上可供人类阅读,但对AI智能体来说,实际几乎无法解析。

智能体为什么会在.pbxproj上失败: - 该文件使用自定义格式(不是JSON,不是YAML,也不是XML),且位置具有语义意义 - 每个条目都通过UUID交叉引用——添加一个文件需要在3-5个不同部分保持一致地更新 - 一个字符放错位置,就会损坏整个项目文件 - Xcode对.pbxproj的合并冲突处理本就脆弱,智能体编辑会让情况更糟

智能体编辑.pbxproj后会发生什么: 1. 编辑看起来成功了(智能体报告“文件已更新”) 2. Xcode拒绝打开项目(“The project file is corrupted”) 3. 您花15-60分钟从git历史中恢复 4. 您学会添加PreToolUse hook(参见Hooks

工作流:智能体创建Swift文件。您手动将它们添加到Xcode项目中(拖入Xcode,或使用File > Add Files)。每个文件只需5秒,却能避免数小时的恢复工作。

对于Swift Package Manager项目:这个限制没那么严重。Package.swift是标准Swift文件,智能体可以可靠地编辑。如果您的项目完全使用SPM(没有.xcodeproj),智能体就可以管理完整项目结构。

复杂的Interface Builder/Storyboard编辑

如果项目使用Interface Builder(.xib文件)或Storyboards(.storyboard文件),智能体无法进行有意义的编辑。这些XML文件包含自动生成的UUID、约束引用和outlet连接,本就是为可视化编辑设计的,不适合文本编辑。

缓解方式:新视图全部使用SwiftUI。如果项目中有遗留Interface Builder文件,不要动它们,新UI用SwiftUI构建。

性能优化

智能体会写出正确代码,但不一定是高性能代码。它们无法分析您的app、识别瓶颈或测量帧率。性能优化需要:

  1. Instruments分析(可视化工具,智能体无法访问)
  2. 理解特定设备的GPU/CPU特性
  3. 基于测量结果进行迭代修改

常见表现: - Metal shader优化(智能体能写出有效的Metal,但无法测量GPU帧时间) - SwiftUI view body复杂度(智能体会创建层层嵌套的视图,导致重绘开销) - Core Data/SwiftData获取优化(智能体写出的查询是正确的,但在大数据集上可能很慢)

缓解方式:用智能体做实现,手动用Instruments进行分析,然后让智能体应用您已确认的具体优化。

代码签名和Provisioning

除了读取错误消息,智能体无法调试代码签名问题。Provisioning profile管理、证书创建、entitlement配置和App Store提交,本质上都是需要人来操作的工作流,涉及Apple Developer门户、Keychain Access以及Xcode的签名UI。

智能体看到的是:“Signing for ‘Return’ requires a development team.”

智能体看不到的是:您的证书是否过期、provisioning profile是否包含该设备、bundle ID是否匹配App ID,或entitlements文件是否正确。

缓解方式:所有签名工作都在Xcode的Signing & Capabilities标签页中处理。不要让智能体调试签名失败。

复杂的Metal Shader调试

智能体能写出语法正确的Metal Shading Language(MSL),但无法验证视觉输出,也无法调试GPU侧问题。Metal shader在GPU上执行,智能体没有反馈机制来判断shader是否产生了正确的视觉结果。

智能体可以用Metal做什么: - 根据描述编写vertex和fragment shader - 在Swift中设置Metal渲染管线 - 为数据并行操作创建compute shader - 修复.metal文件中的编译错误

智能体不能用Metal做什么: - 验证shader输出的视觉正确性 - 调试GPU性能(帧时间、occupancy、内存带宽) - 诊断视觉瑕疵(色带、精度问题、错误的色彩空间) - 在不同GPU架构上测试(A系列与M系列的行为差异)

缓解方式:在真机上测试Metal shader。Simulator的Metal实现不能代表设备GPU行为。使用Xcode的GPUFrame Capture进行视觉调试。

视觉布局验证

智能体看不到您的app UI。它们会编写SwiftUI布局代码,并能验证代码是否编译通过,但无法判断最终屏幕看起来是否正确。一个视图即使偏离中心10像素、用了错误的字体粗细,或元素相互重叠,也不会产生构建错误,并且会通过所有逻辑测试。

缓解方式:目视检查UI改动。使用Xcode中的SwiftUI Previews(或通过Apple MCP使用RenderPreview进行无头渲染)来验证布局。可以考虑使用swift-snapshot-testing等库进行snapshot testing,以自动检测视觉回归。


iOS 开发 Hooks

Hooks 是在代理工作流的特定节点确定性执行的 shell 命令。它们是一种强制约束机制——“请勿编辑 .pbxproj”只是代理可能忽略的建议,而“您无法编辑 .pbxproj”则是硬性拦截。

有关 hook 系统的背景信息,请参阅Claude Code hooks 指南。本节介绍 iOS 专用的 hook 模式。

PreToolUse:禁止写入 .pbxproj

这是所有 iOS 项目中最重要的 hook。它会阻止代理写入 .pbxproj 文件、.xcodeproj/ 目录以及其他由 Xcode 管理的文件:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "bash -c 'INPUT=$(cat); FP=$(echo \"$INPUT\" | jq -r \".tool_input.file_path // empty\"); if echo \"$FP\" | grep -qE \"\\.(pbxproj|xcworkspace|xib|storyboard)$|xcodeproj/|xcworkspace/\"; then echo \"BLOCKED: Do not modify Xcode project files. Create Swift files and add to Xcode manually.\" >&2; exit 2; fi'"
      }
    ]
  }
}

将其放入项目根目录的 .claude/settings.json,或放入 ~/.claude/settings.json 以提供全局保护。

工作原理:当代理尝试使用 Edit 或 Write 工具操作任何与该模式匹配的文件时,hook 会运行并检测文件路径,然后向 stderr 输出警告,最后以代码 2 退出(从而阻止工具调用)。代理收到错误消息后,会相应调整处理方式。

可拦截的操作: - 直接编辑 .pbxproj - 编辑 .xcodeproj/.xcworkspace/ 目录内的任何文件 - 编辑 Interface Builder 文件(.xib.storyboard

PostToolUse:使用 SwiftFormat 保存时自动格式化

代理每次写入或编辑 Swift 文件时,自动进行格式化:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "bash -c 'INPUT=$(cat); FP=$(echo \"$INPUT\" | jq -r \".tool_input.file_path // empty\"); if echo \"$FP\" | grep -qE \"\\.swift$\"; then swiftformat \"$FP\" --quiet 2>/dev/null; fi'"
      }
    ]
  }
}

要求:必须安装 SwiftFormat(brew install swiftformat)。

为何重要:代理生成的 Swift 代码在语法上通常正确,但并不总能遵循统一的格式规范。SwiftFormat 会规范缩进、大括号位置和 import 排序。8借助保存时自动格式化的 hook,代理修改过的每个 Swift 文件都会在呈现给您之前自动完成格式化。

可选:在项目根目录添加 .swiftformat 配置文件,以自定义格式化规则:

# .swiftformat
--indent 4
--allman false
--stripunusedargs closure-only
--importgrouping testable-bottom
--header strip

PostToolUse:自动运行 SwiftLint

如果使用 SwiftLint,请在每次编辑 Swift 文件后运行它:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "bash -c 'INPUT=$(cat); FP=$(echo \"$INPUT\" | jq -r \".tool_input.file_path // empty\"); if echo \"$FP\" | grep -qE \"\\.swift$\"; then swiftlint lint --path \"$FP\" --quiet 2>/dev/null || true; fi'"
      }
    ]
  }
}

|| true 可防止 lint 警告阻塞代理。如果希望 lint 违规问题产生阻塞,请将其删除。

PostToolUse:更改后自动构建

若要获得更积极的反馈循环,可在每次更改 Swift 文件后触发构建:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "bash -c 'INPUT=$(cat); FP=$(echo \"$INPUT\" | jq -r \".tool_input.file_path // empty\"); if echo \"$FP\" | grep -qE \"\\.swift$\"; then xcodebuild -scheme Return -destination \"platform=iOS Simulator,name=iPhone 16 Pro\" build 2>&1 | tail -5; fi'"
      }
    ]
  }
}

警告:此操作开销较大。每次编辑文件都会触发构建,请谨慎使用。它最适合需要立即获取构建反馈的调试会话。对于常规开发,建议让代理准备就绪后通过 MCP 手动触发构建。

PreToolUse:禁止修改 Entitlements

保护 entitlements 文件,防止代理意外修改:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "bash -c 'INPUT=$(cat); FP=$(echo \"$INPUT\" | jq -r \".tool_input.file_path // empty\"); if echo \"$FP\" | grep -qE \"\\.entitlements$\"; then echo \"BLOCKED: Do not modify entitlements files without explicit permission.\" >&2; exit 2; fi'"
      }
    ]
  }
}

iOS Hooks 组合配置

以下是我在所有 iOS 项目中使用的完整 .claude/settings.json

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "bash -c 'INPUT=$(cat); FP=$(echo \"$INPUT\" | jq -r \".tool_input.file_path // empty\"); if echo \"$FP\" | grep -qE \"\\.(pbxproj|xcworkspace|xib|storyboard|entitlements)$|xcodeproj/|xcworkspace/\"; then echo \"BLOCKED: Do not modify Xcode-managed files. Create Swift files and add manually.\" >&2; exit 2; fi'"
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "bash -c 'INPUT=$(cat); FP=$(echo \"$INPUT\" | jq -r \".tool_input.file_path // empty\"); if echo \"$FP\" | grep -qE \"\\.swift$\"; then swiftformat \"$FP\" --quiet 2>/dev/null; fi'"
      }
    ]
  }
}

此配置提供两项保障: 1. 代理无法破坏 Xcode 项目文件(PreToolUse 拦截) 2. 代理修改的每个 Swift 文件都会自动格式化(PostToolUse 格式化)


适用于智能体的架构模式

并非所有Swift架构都同样适合智能体。以下模式明确、一致,并且在训练数据中有充分体现,因此效果最佳。

@Observable(切勿使用ObservableObject)

面向iOS 26及更高版本的项目应只使用@Observable。这既是现代模式,也是适合智能体的模式:

// CORRECT — @Observable
@Observable
@MainActor
final class TimerManager {
    var timeRemaining: TimeInterval = 0
    var state: TimerState = .stopped

    func start() {
        state = .running
        // ...
    }
}

// In a view:
struct TimerView: View {
    @State private var timer = TimerManager()

    var body: some View {
        Text(timer.timeRemaining, format: .number)
    }
}
// WRONG — ObservableObject (deprecated pattern)
class TimerManager: ObservableObject {
    @Published var timeRemaining: TimeInterval = 0
    @Published var state: TimerState = .stopped
}

// WRONG — @StateObject (deprecated pattern)
struct TimerView: View {
    @StateObject private var timer = TimerManager()
}

为何@Observable适合智能体:此模式更简单(无需@Published注解),所有权模型更清晰(使用@State,不必在@StateObject@ObservedObject之间选择),而且由于涉及的组件更少,智能体使用它时产生的错误也更少。

在CLAUDE.md中记录此要求:即使目标版本是iOS 26,智能体偶尔仍会沿用训练数据中的ObservableObject模式。明确禁止可避免这种情况。

// CORRECT
NavigationStack {
    List(items) { item in
        NavigationLink(value: item) {
            ItemRow(item: item)
        }
    }
    .navigationDestination(for: Item.self) { item in
        ItemDetailView(item: item)
    }
}

// WRONG
NavigationView {
    List(items) { item in
        NavigationLink(destination: ItemDetailView(item: item)) {
            ItemRow(item: item)
        }
    }
}

NavigationStack适用于iOS 16及更高版本,也是新代码唯一应采用的导航模式。类型安全的navigationDestination(for:)模式可防止智能体创建错误的导航链接。

使用SwiftData实现持久化

SwiftData模型是智能体辅助开发中最简洁的持久化模式:

@Model
final class GroceryItem {
    var name: String
    var quantity: Int
    var isCompleted: Bool
    var category: Category?
    var list: GroceryList?

    init(name: String, quantity: Int = 1) {
        self.name = name
        self.quantity = quantity
        self.isCompleted = false
    }
}

智能体使用SwiftData时的关键规则: 1. @Model类自动具备Observable能力——不要添加@Observable 2. 使用@Bindable实现表单绑定:@Bindable var item: GroceryItem 3. 在视图中使用@Query获取响应式数据:@Query var items: [GroceryItem] 4. 在非视图代码中使用modelContext.fetch() 5. 删除关系需要明确指定规则:.cascade.nullify.deny

Swift 6.2并发

新项目应以Swift 6.2严格并发模式为目标。这是语言模式的选择,而非工具链版本的选择——稳定版Xcode 26.6中的Swift 6.3编译器和Xcode 27测试版中的Swift 6.4均可原样构建这些模式:1718

// Actor isolation for shared mutable state
@MainActor
@Observable
final class DataManager {
    var items: [Item] = []

    func loadItems() async throws {
        let fetched = try await api.fetchItems()
        items = fetched  // Safe: @MainActor isolated
    }
}

// Sendable conformance for cross-actor transfers
struct Item: Sendable, Identifiable {
    let id: UUID
    let name: String
    let createdAt: Date
}

面向智能体的并发指导: - 为所有视图模型标记@MainActor(防止出现数据竞争警告) - 所有异步工作均使用async/await(不使用完成处理程序) - 跨actor传递时,让值类型遵循Sendable - 在视图中使用Task { }进行异步初始化 - 只有在测得确有性能需求时才使用nonisolated

Liquid Glass设计系统(iOS 26及更高版本)

iOS 26引入了Liquid Glass设计系统。只要提供明确指导,智能体便能妥善处理:

// Glass effect on containers
VStack {
    // content
}
.glassEffect()

// Glass effect with tint
Button("Action") { }
    .glassEffect(.regular.tint(.blue))

// Glass effect on navigation bars (automatic in iOS 26)
NavigationStack {
    // content
}
// Navigation bar automatically uses glass material

// Custom glass shapes
RoundedRectangle(cornerRadius: 16)
    .fill(.ultraThinMaterial)
    .glassEffect()

在CLAUDE.md中加入:“在分区背景和卡片容器上使用.glassEffect()。在iOS 26中,导航栏会自动采用玻璃材质。不要使用自定义材质手动重现玻璃效果——请使用系统修饰符。”


框架特定上下文

每个Apple框架都有智能体需要特别注意的事项。本节介绍这8款应用中使用的框架。

HealthKit

使用该框架的应用:Return、Water

HealthKit需要谨慎处理权限和平台防护:

// Always check availability and authorization
import HealthKit

@MainActor
@Observable
final class HealthKitManager {
    private let store = HKHealthStore()
    var isAuthorized = false

    func requestAuthorization() async {
        guard HKHealthStore.isHealthDataAvailable() else { return }

        let types: Set<HKSampleType> = [
            HKQuantityType(.dietaryWater),
            HKCategoryType(.mindfulSession)
        ]

        do {
            try await store.requestAuthorization(toShare: types, read: types)
            isAuthorized = true
        } catch {
            // User denied — do not retry automatically
        }
    }
}

面向智能体的HealthKit规则: - 始终使用HKHealthStore.isHealthDataAvailable()进行防护 - 切勿假定已获授权——每次写入时都要检查 - 多平台代码使用#if canImport(HealthKit)(tvOS不支持HealthKit) - 除HealthKit提供的数据外,切勿在本地存储健康数据 - 在Info.plist中同时加入NSHealthShareUsageDescriptionNSHealthUpdateUsageDescription

SpriteKit

使用该框架的应用:TappyColor、Starfield Destroyer

SpriteKit的场景图模型需要为智能体提供明确指导:

## SpriteKit Rules

- Scene hierarchy is a tree of SKNodes with zPosition ordering
- Physics bodies use category bitmasks (UInt32) for collision detection
- Node pooling: pre-allocate reusable nodes (bullets, particles)
- Never add nodes directly to the scene — use layer nodes for organization
- Update loop: `update(_ currentTime:)` runs every frame — keep it fast
- Actions: use SKAction sequences for animations, not manual property updates
- Textures: use texture atlases for performance (.atlas directories)

智能体使用SpriteKit时的优势: - 创建SKAction序列和组 - 设置物理体和接触检测 - 实现游戏状态机 - 构建HUD叠加层

智能体使用SpriteKit时的不足: - 对性能敏感的游戏循环(智能体会在每一帧中添加不必要的工作) - 复杂的物理模拟(若追求精度,自定义物理系统优于SKPhysicsBody) - 粒子效果调优(依赖视觉判断,需要反复迭代)

Metal

使用该框架的应用:amp97、Water、Starfield Destroyer

Metal是智能体最难驾驭的框架。GPU编程模型与CPU端Swift有着本质区别,而且智能体无法验证视觉输出。

## Metal Rules

- Shared types between Swift and Metal go in a bridging header (ShaderTypes.h)
- Triple buffer in-flight frames (semaphore with value 3)
- Test shaders on DEVICE, not simulator (Metal behavior differs)
- Compute shaders: threadgroup size must divide evenly into grid size
- Fragment shaders: output color must be in correct color space (sRGB or linear)
- DO NOT optimize shaders without Instruments GPU profiling data

Metal项目的CLAUDE.md中应包含: - Uniforms结构体定义(由Swift与MSL共享) - 渲染管线状态的设置模式 - 缓冲区索引及其用途 - 现有着色器及各自的作用 - 已知的精度问题(half与float)

Live Activities

使用该框架的应用:Return

Live Activities需要特定配置;一旦记录清楚,智能体便能妥善处理:

## Live Activities

- ActivityAttributes defined in `TimerActivityAttributes.swift`
- ActivityKit framework: `import ActivityKit`
- Widget extension: `ReturnWidgets/ReturnLiveActivity.swift`
- Start: `Activity<TimerActivityAttributes>.request(attributes:content:)`
- Update: `activity.update(ActivityContent(state:staleDate:))`
- End: `activity.end(ActivityContent(state:staleDate:), dismissalPolicy:)`
- Push token: register for updates via `activity.pushTokenUpdates`

Game Center

使用该框架的应用:Starfield Destroyer

## Game Center

- Authentication: `GKLocalPlayer.local.authenticateHandler`
- Leaderboards: `GKLeaderboard.submitScore(_:context:player:leaderboardIDs:completionHandler:)`
- Achievements: `GKAchievement.report(_:withCompletionHandler:)` (takes `[GKAchievement]` array)
- Always check `GKLocalPlayer.local.isAuthenticated` before submitting
- Handle authentication failure gracefully (offline play must work)

多平台模式

Return覆盖iOS、watchOS和tvOS。使用智能体进行多平台开发时,必须明确记录平台边界。

共享代码组织

Shared/
├── MeditationSession.swift    # Data model (all platforms)
├── SessionStore.swift         # iCloud sync (all platforms)
└── SessionHistoryView.swift   # UI (adapts per platform)

Return/                        # iOS-specific
ReturnWatch Watch App/         # watchOS-specific
ReturnTV/                      # tvOS-specific

智能体规则:“如果文件位于Shared/中,变更会影响所有平台。如果文件位于某个平台目录中,变更将被隔离。修改文件前,务必先检查其所在目录。”

平台可用性保护

// HealthKit: available on iOS and watchOS, not tvOS
#if canImport(HealthKit)
import HealthKit
// HealthKit code here
#endif

// ActivityKit: available on iOS only
#if canImport(ActivityKit)
import ActivityKit
// Live Activity code here
#endif

// WatchKit: available on watchOS only
#if os(watchOS)
import WatchKit
// Watch-specific code here
#endif

智能体指南:“使用平台专属框架时,始终采用#if canImport()#if os()保护条件。不要假设某个框架在所有目标中都可用。”

按平台适配UI

struct SessionHistoryView: View {
    @Query var sessions: [MeditationSession]

    var body: some View {
        List(sessions) { session in
            SessionRow(session: session)
        }
        #if os(tvOS)
        .focusable()
        #endif
        #if os(iOS)
        .swipeActions {
            Button("Delete", role: .destructive) {
                // delete
            }
        }
        #endif
    }
}

高级工作流

自主构建、测试与修复循环

最强大的模式是:向智能体提供功能规范,让它自主完成构建、测试和修复的迭代循环。

Implement a countdown timer that:
1. Starts from a user-selected duration (10, 20, or 30 minutes)
2. Shows remaining time with a circular progress indicator
3. Plays a bell sound on completion
4. Logs the session to HealthKit as mindful minutes

Build after each change. Fix all errors. Run tests when the build succeeds.
Continue until all tests pass and the build is clean.

智能体编写代码,通过MCP构建,读取结构化错误,修复问题后重复执行。原本需要人工经历5-10次构建、报错与修复循环的功能,可在一次自主循环中完成。

适用场景:验收标准明确、定义清晰的功能。

失效场景:开放式功能(“让它看起来更美观”)、对性能敏感的代码,或任何需要视觉验证的内容。

iOS的子智能体委派

Claude Code的子智能体系统适用于iOS项目:

Use a subagent to research the best approach for implementing
iCloud key-value store sync for meditation sessions across iOS,
watchOS, and tvOS. Report back with the recommended pattern.

子智能体会在独立的上下文窗口中探索文档和代码模式,返回摘要后,由主会话实施建议。这样可避免研究工作占用主要上下文。

跨应用模式应用

当您维护多个遵循一致模式的iOS应用时,智能体可以将一个应用中的模式应用到另一个应用:

Look at how Settings.swift works in the Return project
(centralized singleton with validation). Apply the same pattern
to create a Settings.swift for the Water project.

智能体会读取源模式、理解其结构,并在目标项目中创建一致的实现。

双智能体审查(Claude + Codex)

对于关键变更,请使用来自不同模型系列的两个智能体:

  1. Claude Code编写实现
  2. Codex CLI在独立流程中进行审查
# After Claude implements the feature:
codex "Review the changes in the last commit. Focus on Swift 6.2
      concurrency correctness, SwiftData relationship integrity,
      and potential retain cycles. Report issues only — no praise."

不同模型系列能够捕捉不同类别的错误。对于容易引入细微问题的Metal着色器和并发模式,这一点尤为重要。

双重审查能够发现而单次审查容易遗漏的问题:

问题类型 Claude优势 Codex优势
SwiftData关系循环 中等 强(GPT-5.6 Sol)
@MainActor隔离缺口 中等
Metal缓冲区对齐 中等 中等
保留循环检测 强(Opus) 强(GPT-5.6 Sol)
API弃用意识 强(较新的训练数据) 中等
并发竞态条件 强(捕捉到不同模式)

双重审查的目的不是发现更多错误,而是发现不同的错误。每个模型系列在模式识别中都有不同的失效模式。

跨多个应用的批量操作

当框架或模式变更会影响多个应用时:

# Update @Observable pattern across all projects
for project in BananaList Return Water Reps; do
  cd ~/Projects/$project
  claude -p "Audit all files for any remaining ObservableObject usage.
             Convert to @Observable following the pattern in CLAUDE.md.
             Build and test after changes." --dangerously-skip-permissions
done

请谨慎使用。非交互模式需要--dangerously-skip-permissions标志,但它会绕过所有安全检查。请确保已配置PreToolUse hooks,以保护.pbxproj文件。

使用Apple设备端LLM的应用

如果您的应用调用Apple的Foundation Models框架(例如用于离线摘要、分类或结构化输出生成),智能体需要了解提示词预算。iOS 26.4为SystemLanguageModel新增了两个API,取代了此前对4096个token的猜测:contextSize(模型在单次对话中可接受的最大token数)和tokenCount(for:)async throws,返回给定提示词实际消耗的token数)。31两者均为@backDeployed(before: iOS 26.4),因此无需使用#available分支,即可在所有支持FM的操作系统版本中使用。

智能体在生成提示词构建代码时应遵循的模式:

import FoundationModels

func budgetFor(prompt: String, reservedReply: Int = 256) async throws -> Int {
    let model = SystemLanguageModel.default
    let promptCost = try await model.tokenCount(for: prompt)
    let budget = model.contextSize - promptCost - reservedReply
    guard budget > 0 else { throw ContextError.promptTooLong }
    return budget
}

如果应用涉及SystemLanguageModel,请将此模式加入您的CLAUDE.md。否则,智能体会回退到旧的4096硬编码,并在上下文窗口更大的设备上悄然截断提示词。tokenCount(for:)async throws签名至关重要——粘贴同步版本的智能体将无法通过编译。


真实案例研究

抽象建议很容易写。下面是来自这8款应用的具体场景,展示agent辅助的iOS开发在实践中如何运作,包括失败案例。

案例研究1:为Return添加TV应用(成功)

任务:为Return添加tvOS target。Return是一款冥想计时器,已有iOS和watchOS版本。TV应用需要支持Siri Remote导航、大屏UI,以及与iOS应用同步设置。

agent做得好的地方: - 阅读现有iOS TimerManager,并创建了一个TVTimerManager,省略了tvOS不可用的Live Activities和HealthKit - 为Siri Remote焦点导航创建了自定义按钮样式(TVCapsuleButtonStyleTVCircleButtonStyle) - 构建了TVStepper组件,用+/-按钮替代滚轮选择器(Siri Remote无法使用滚轮选择器) - 通过App Groups(group.com.941apps.Return)实现设置同步 - 在共享代码中添加了#if os(tvOS)防护 - 通过MCP使用platform=tvOS Simulator,name=Apple TV进行构建和测试

我必须手动完成的工作: - 在Xcode中创建tvOS target(File > New > Target > tvOS App) - 将新target添加到Xcode项目中(.pbxproj变更) - 为TV target配置App Groups entitlement - 将TV target添加到现有scheme,或创建新的scheme - 手动将所有agent创建的Swift文件添加到TV target - 手动测试Siri Remote导航(agent无法评估焦点行为)

结果:新增15个Swift文件,TV应用功能完整,agent辅助工作耗时约3小时。据我估计,agent承担了大约80%的实现工作;我处理了需要Xcode UI交互的部分(entitlements、target设置、capability flags),并在真实Apple TV上手动测试焦点。基于我在这个代码库中未使用agent交付类似功能的经验,等量的单人工作通常需要数天。

案例研究2:amp97中的Metal Shader调试(部分失败)

任务:为示波器shader添加基于能量的强度系统。可视化效果应随音频能量脉动。

发生了什么: 1. agent编写了有效的Metal shader修改,添加了uEnergyuniform和HDR tonemapping 2. 代码编译无误 3. 在设备上,可视化效果完全变白,因为强度系数高了10倍(3.5而不是0.30) 4. agent看不到白屏,因此没有反馈信号 5. 我通过视觉确认了问题,并要求agent降低系数 6. agent降低了系数,但整体能量状态机过于复杂,以不同方式破坏了可视化器 7. 完全回滚,两个commit(67959edcda4830)在869d914中被回滚

经验教训:Metal shader是agent辅助开发中最困难的领域,因为反馈循环是断开的。agent可以验证语法(能编译)和语义(类型正确),但无法验证输出(看起来是否正确)。任何会改变视觉行为的shader修改,都需要人在设备上验证。

此后我添加到CLAUDE.md中的内容:“DO NOT attempt energy state modifications to the oscilloscope shader without extremely careful coefficient testing. Previous attempt broke the visualizer with coefficients 10x too high.”

案例研究3:Banana List中的SwiftData迁移(成功)

任务:将数据模型从V1迁移到V2,为GroceryItem添加quantity字段,并添加带关系的新Category模型。

agent做了什么: 1. 阅读现有V1模型定义 2. 创建带有新字段和关系的V2模型定义 3. 编写符合SchemaMigrationPlan协议的GroceryMigrationPlan 4. 实现V1toV2迁移阶段:添加默认quantity: 1category: nil 5. 更新所有视图以支持新字段 6. 更新SampleData.swift用于预览 7. 通过MCP构建并运行测试,全部通过 8. 创建迁移专用单元测试

关键点:agent之所以成功,是因为SwiftData迁移遵循定义明确的协议模式,并且Apple文档和训练数据中都有充分体现。CLAUDE.md明确记录了V1模型,因此agent理解自己正在从什么迁移。

案例研究4:Return中的iCloud会话同步(成功但复杂)

任务:实现跨设备冥想会话日志。Apple TV或Mac上完成的会话应同步到iPhone,以便记录到HealthKit。

agent产出的内容:

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
    tvOS              Mac              Watch     
 TVTimerMgr        TimerMgr          WatchTimer  
└──────┬──────┘     └──────┬──────┘     └──────┬──────┘
                                             
       └───────────────────┼───────────────────┘
                           
                           
              ┌────────────────────────┐
                   SessionStore       
                (iCloud Key-Value)    
              └───────────┬────────────┘
                          
                          
              ┌────────────────────────┐
                iPhone (on foreground)
                 Write to HealthKit  
              └────────────────────────┘

agent: 1. 创建了MeditationSession数据模型,包含UUID、日期、时长、来源设备和HealthKit同步状态 2. 构建了SessionStore单例,使用NSUbiquitousKeyValueStore管理iCloud同步 3. 实现合并冲突解决(基于UUID去重) 4. 添加SessionHistoryView,包含平台特定适配(iOS上滑动删除,tvOS上基于焦点) 5. 连接iPhone端HealthKit同步,用于同步来自其他设备的会话

需要迭代的地方:初始实现没有处理iPhone应用在后台启动的情况(没有用于同步的前台通知)。agent需要明确提示:“Use NSUbiquitousKeyValueStore.didChangeExternallyNotification to trigger sync on background KV changes.”得到这个提示后,实现就是正确的。

经验教训:当架构描述清晰时,agent能够很好地处理多平台架构模式。iCloud同步模式并不简单,但它遵循有文档可依的Apple模式,agent能够理解。边缘情况(后台同步)需要人的领域知识,因为它的文档并不充分。

案例研究5:Starfield Destroyer中的Game Center集成(成功)

任务:为空间射击游戏添加Game Center排行榜和成就。

agent做得好的地方: - 在应用入口点实现GKLocalPlayer.local.authenticateHandler - 创建GameCenterManager,包含分数提交和成就上报方法 - 在所有Game Center操作前添加认证状态检查 - 优雅处理离线情况(游戏可在没有Game Center时运行,重新连接后提交) - 创建与8艘飞船进度系统匹配的成就定义

需要手动完成的工作: - 在App Store Connect中创建排行榜和成就(网页门户,agent无法访问) - 在Xcode中配置Game Center entitlement - 使用沙盒Game Center账号测试(需要在设备上手动登录)


使用 Agents 的项目生命周期

启动新的 iOS 项目

在 Agent 辅助下启动新项目的最佳工作流:

阶段 1:人工设置(15-30 分钟) 1. 创建 Xcode 项目(File > New > Project) 2. 配置签名和功能 3. 设置部署目标和支持的目标设备 4. 添加所有必需的 entitlements(HealthKit、Game Center 等) 5. 创建初始 CLAUDE.md,写明项目身份和规则

阶段 2:Agent 实现(数小时到数天) 1. Agent 创建数据模型(SwiftData、Core Data 或普通 structs) 2. Agent 按照您记录的模式构建视图 3. Agent 在 manager/service 类中实现业务逻辑 4. Agent 编写单元测试 5. 通过 MCP 执行构建-测试-修复循环(自主)

阶段 3:人工集成(30-60 分钟) 1. 将 Agent 创建的文件添加到 Xcode targets 2. 验证签名和 entitlements 3. 在实体设备上测试 4. 审查视觉布局和 UX 5. 提交到 App Store Connect

维护现有项目

对于成熟应用的持续开发:

You: Here's the next feature for Return: add a "Focus Score" that
     calculates from session duration and consistency. Show it on
     the main timer view. Build and test.

Claude: [reads CLAUDE.md, understands patterns]
        [reads TimerManager.swift, Settings.swift]
        [creates FocusScore.swift  model with calculation logic]
        [creates FocusScoreView.swift  display component]
        [integrates into ContentView.swift]
        [calls build_sim  1 error: missing import]
        [fixes import]
        [calls build_sim  success]
        [writes FocusScoreTests.swift]
        [calls test_sim  all pass]

Agent 的效果取决于 CLAUDE.md 对项目当前状态的反映程度。添加重要新功能、改变架构模式或引入新 frameworks 时,请更新 CLAUDE.md。

何时让 Agent 参与,何时不应参与

任务 Agent? 原因
新 SwiftUI view Agents 擅长声明式 UI
SwiftData model 变更 定义明确、可测试
单元测试 机械化、基于模式
重构 系统化、多文件
构建错误诊断 是(通过 MCP) 结构化反馈循环
新 Xcode target 需要 Xcode UI 和 .pbxproj 变更
签名和 provisioning 基于门户,Agent 无法访问
视觉润色 需要人工审美判断
Metal 着色器调优 需要在设备上进行 GPU 测试
App Store 提交 需要门户和 Xcode Organizer
性能剖析 需要 Instruments
无障碍审计 部分 Agent 可以添加 labels,人工验证 VoiceOver

配置 Agent 定义

如果使用 Claude Code 的 Agent 定义系统(.claude/agents/),请创建一个 iOS 专用 Agent:

---
name: ios-developer
description: iOS development agent with MCP build tools and SwiftUI expertise
tools:
  - XcodeBuildMCP
  - xcode
---

# iOS Developer Agent

You are an iOS development agent for apps targeting iOS 26+ with SwiftUI.

## Architecture Rules
- @Observable for all view models (NEVER ObservableObject)
- NavigationStack for all navigation (NEVER NavigationView)
- SwiftData for persistence
- Swift 6.2 strict concurrency
- @MainActor on all Observable classes

## Build & Test — Always Use MCP

Prefer MCP tools over raw shell commands for ALL build operations:

- **Build**: `build_sim` / `build_device` (NOT `xcodebuild` via Bash)
- **Test**: `test_sim` / `test_device` (NOT `xcodebuild test` via Bash)
- **Simulators**: `list_sims`, `boot_sim`, `open_sim`
- **Debug**: `debug_attach_sim`, `debug_stack`, `debug_variables`
- **Apple docs**: `DocumentationSearch` (NOT WebSearch for Apple APIs)
- **Swift verification**: `ExecuteSnippet` (NOT `swift` via Bash)

MCP returns structured JSON. Bash returns unstructured text.

## File Management Rules
- NEVER modify .pbxproj, .xcodeproj/, .xcworkspace/, .xib, .storyboard
- Create Swift files in the correct directory
- Report files that need manual addition to Xcode targets

## SwiftData Rules
- @Model classes are automatically Observable — do not add @Observable
- Use @Bindable for form bindings to model properties
- Use @Query in views, modelContext.fetch() elsewhere
- Document relationship delete rules

## When You Get Stuck
- Build errors: use `build_sim` via MCP for structured output
- API questions: use `DocumentationSearch` via Apple MCP
- Swift verification: use `ExecuteSnippet` via Apple MCP
- Never guess — verify with tools

在 Claude Code 会话中使用 @ios-developer 引用此 Agent。


Agent 辅助 iOS 的测试模式

在获得清晰指导时,Agents 可以编写出色的单元测试。以下模式通常效果最佳。

测试文件组织

# In CLAUDE.md:
## Test Structure

Tests mirror source structure:
- `ReturnTests/TimerManagerTests.swift` tests `TimerManager.swift`
- `ReturnTests/SettingsTests.swift` tests `Settings.swift`
- `ReturnTests/ConstantsTests.swift` tests `Constants.swift`

Test naming: `test_<what>_<condition>_<expected>`
Example: `test_start_whenStopped_transitionsToRunning`

测试提示词

有效的测试提示词:

Write unit tests for TimerManager covering:

1. Initial state is .stopped with timeRemaining == selectedDuration
2. start() transitions state to .running
3. pause() from .running transitions to .paused
4. reset() from any state returns to .stopped with original duration
5. start() from .paused resumes (state becomes .running)
6. Edge case: reset() when already stopped is a no-op
7. Edge case: pause() when already paused is a no-op

Follow the existing test pattern in SettingsTests.swift.
Use setUp() to create a fresh TimerManager for each test.

为什么有效:编号式验收标准为 Agent 提供了清单。引用现有测试文件可以建立模式。指定 setUp() 用法能避免 Agent 创建纠缠不清的测试状态。

低效的测试提示词:

Write tests for TimerManager.

这会生成泛泛而浅层的测试,遗漏边界情况,并且可能不遵循项目模式。

Async 测试模式

针对基于 timer 和 async 的代码进行测试时:

// Agent produces this pattern when guided correctly:
final class TimerManagerTests: XCTestCase {
    var sut: TimerManager!

    @MainActor
    override func setUp() {
        super.setUp()
        sut = TimerManager()
    }

    @MainActor
    func test_start_whenStopped_transitionsToRunning() {
        // Given
        XCTAssertEqual(sut.state, .stopped)

        // When
        sut.start()

        // Then
        XCTAssertEqual(sut.state, .running)
    }

    @MainActor
    func test_timerCountsDown_afterOneSecond() async throws {
        // Given
        sut.selectedDuration = 10
        sut.reset()
        sut.start()

        // When
        try await Task.sleep(for: .seconds(1.1))

        // Then
        XCTAssertLessThanOrEqual(sut.timeRemaining, 9.0)
    }
}

需要提醒 Agents 的关键模式: - 测试 @MainActor 类的测试方法需要标注 @MainActor - 使用 Task.sleep 或 async 操作的测试需要 async throws - 基于时间的断言应留有容差(1.1 秒,而不是严格 1.0) - 使用干净的 setUp() / tearDown() 保持测试隔离

Snapshot Testing

对于视觉回归检测,可以考虑添加 swift-snapshot-testing

Add snapshot tests for the main timer view in three states:
1. Stopped (showing full duration)
2. Running (showing countdown)
3. Completed (showing 00:00 with completion state)

Use SnapshotTesting library. Create reference images on first run.

Agents 可以正确设置 snapshot tests,但无法审查参考图像。您负责审查初始 snapshots,随后 Agent 的测试会在未来变更中捕获视觉回归。

iOS 项目的上下文窗口管理

1M 上下文窗口(Opus 5)容量很大,但并非无限。iOS 项目在上下文管理方面有一些特定的注意事项。

iOS 文件的 Token 成本

文件类型 典型大小 估算 Token 数
SwiftUI 视图(简单) 50-100 行 500-1,000
SwiftUI 视图(复杂) 200-400 行 2,000-4,000
SwiftData 模型 30-80 行 300-800
管理器/服务类 100-300 行 1,000-3,000
Metal 着色器(.metal) 50-200 行 500-2,000
单元测试文件 50-200 行 500-2,000
CLAUDE.md 100-300 行 1,000-3,000
MCP 响应(构建) 不定 200-2,000
MCP 响应(测试) 不定 500-5,000

对于包含 50 个文件的项目:读取所有文件大约消耗 50,000-100,000 个 Token,远未达到 1M 窗口的上限。代理可以将整个项目保留在上下文中。

对于包含 100 多个文件的项目:必须有选择地读取。代理会先读取 CLAUDE.md(了解文件结构注释),再按需读取特定文件。因此,CLAUDE.md 中的文件注释至关重要——无需遍历所有内容,代理便能据此找到正确的文件。

大型项目的策略

  1. 详细的 CLAUDE.md 文件注释——代理读取文件映射后,可直接前往相关文件
  2. 委派给子代理——将探索和研究任务交给子代理(使用干净的上下文,并返回摘要)
  3. 聚焦明确的提示词——“修改 SettingsView.swift,添加一个新开关”优于“更新设置”
  4. 划分会话边界——对于彼此无关的功能,应启动新会话,而不是不断延长同一会话
  5. 使用 /compact——Claude Code 的压缩命令会总结对话并释放上下文空间

MCP 的 Token 效率

支持使用 MCP 的一个有力理由是:结构化的 JSON 响应所消耗的 Token 远少于原始 xcodebuild 输出。

场景 原始 Bash Token 数 MCP Token 数 节省比例
构建成功 3,000-10,000 200-500 85-95%
构建失败(1 个错误) 3,000-10,000 300-800 90-92%
测试结果(20 项测试) 2,000-5,000 500-1,000 75-80%
模拟器列表 500-2,000 200-400 60-80%

在一次包含 10-20 轮构建的典型开发会话中,与原始 xcodebuild 相比,MCP 可节省 30,000-150,000 个 Token,从而为实际的代码推理保留更多空间。


故障排除

“build_sim 失败——找不到方案”

代理猜错了方案名称。修复方法:

Use discover_projs and list_schemes to find the correct scheme name
for this project before building.

或者在 CLAUDE.md 中明确添加方案名称:

## Build
Primary scheme: `Return` (iOS)
Watch scheme: `ReturnWatch` (watchOS)
TV scheme: `ReturnTV` (tvOS)

“xcrun mcpbridge——找不到命令”

需要使用 Xcode 26.3 或更高版本。运行 xcodebuild -version 进行检查。如果已经安装 Xcode 26.3+,但命令仍然失败:

# Ensure Xcode command line tools are selected
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

# Verify
xcrun mcpbridge --help

“Claude Code 中未显示 MCP 工具”

在会话中途注册的 MCP 工具可能要等到重启后才会显示。退出 Claude Code,然后启动新会话:

# Exit current session (Ctrl+C or /exit)
# Start fresh
claude

接着进行验证:

You: List all available MCP tools from XcodeBuildMCP.

“代理一直通过 Bash 使用 xcodebuild,而不使用 MCP”

代理未通过工具搜索发现 MCP 工具。有两种解决方法:

  1. 在 CLAUDE.md 中添加明确说明(请参阅教代理使用 MCP
  2. 直接提示:“使用 build_sim MCP 工具,不要通过 Bash 使用 xcodebuild”

“构建成功,但代理报告失败”

XcodeBuildMCP 会解析 xcodebuild 输出。如果构建产生了看起来像错误的警告(弃用警告中很常见),代理可能会误判结果。请检查 MCP 响应中的实际状态字段。

“模拟器在启动期间无响应”

终止所有模拟器并重新启动:

xcrun simctl shutdown all
xcrun simctl boot "iPhone 16 Pro"

或者让代理执行:

Shut down all simulators, then boot a fresh iPhone 16 Pro.

“尽管 CLAUDE.md 中有相关规则,代理仍尝试修改 .pbxproj”

CLAUDE.md 规则只是建议,Hooks 才能强制执行。如果没有通过 PreToolUse hook 阻止写入 .pbxproj,代理迟早会尝试修改它。请安装该 hook:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "command": "bash -c 'INPUT=$(cat); FP=$(echo \"$INPUT\" | jq -r \".tool_input.file_path // empty\"); if echo \"$FP\" | grep -qE \"\\.(pbxproj|xcworkspace|xib|storyboard)$|xcodeproj/|xcworkspace/\"; then echo \"BLOCKED: Do not modify Xcode project files.\" >&2; exit 2; fi'"
      }
    ]
  }
}

规则表达的是“请不要这样做”,Hooks 表达的则是“您无法这样做”。

常见问题

我应该从哪种代理运行时开始?

Claude Code CLI 搭配XcodeBuildMCP。它拥有最深入的MCP集成、最成熟的钩子系统,以及可将整个iOS项目保留在工作内存中的100万token上下文窗口(Opus 5)。建议从这里起步。随着工作流日趋成熟,再加入Codex进行审查,并使用Xcode原生代理快速完成行内编辑。

我需要同时使用两个MCP服务器吗?

对于大多数开发者,仅XcodeBuildMCP就能满足90%的需求(构建、测试、模拟器和调试)。如果需要搜索文档、通过Swift REPL进行验证或渲染SwiftUI预览,可以再添加Apple的Xcode MCP。以后随时都能添加——两个服务器彼此独立。

代理能否从头创建新的Xcode项目?

XcodeBuildMCP包含脚手架工具(scaffold_ios_projectscaffold_macos_project),可基于模板创建新的Xcode项目。不过,对于生产应用,建议先在Xcode中创建项目(确保签名、功能和目标配置正确),然后再让代理完成所有代码实现。在Xcode的新建项目向导中花费5分钟,可以避免耗费数小时处理代理生成的项目配置问题。

代理如何处理Swift Package Manager依赖项?

处理得很好。Package.swift是标准Swift文件,代理可以可靠地读取和编辑。添加依赖项、更新版本范围和配置目标均可顺利完成。其局限在于基于.xcodeproj的依赖项管理(Xcode的软件包解析界面)——这部分由Xcode管理,不应让代理编辑。

代理能否将应用提交至App Store?

不能。提交至App Store涉及Xcode的Organizer、配置描述文件、屏幕截图、元数据以及App Store Connect门户。代理无法通过MCP或命令行工具有效操作这些内容。代理可以处理归档之前的所有工作——实现、测试、错误修复和文档编写。提交的最后环节仍需人工操作。

不过,代理可以协助编写App Store元数据。可以要求代理根据最新变更撰写应用描述、关键词和新版说明。这类文本生成工作正是代理的用武之地。

在代理辅助的iOS开发中,如何处理密钥和API密钥?

切勿提交密钥。对于连接后端API的iOS应用:

  1. 使用.xcconfig文件存储特定于环境的配置
  2. .xcconfig文件添加到.gitignore
  3. 通过Info.plist构建设置引用配置值
  4. 在CLAUDE.md中记录所需密钥,但不要包含实际值
## Configuration

API base URL and keys are in `Config.xcconfig` (not committed).
Required keys:
- `API_BASE_URL` — Backend server URL
- `API_KEY` — Authentication token

Create `Config.xcconfig` from `Config.xcconfig.template`.

代理知道这些密钥存在及其使用位置,但绝不会看到实际值。

SwiftUI动画呢——代理能编写吗?

代理能够编写语法正确的动画代码,但无法直观验证效果。简单动画(.animation(.spring()).transition(.slide)withAnimation { })通常能产生正确结果。具有精确时序的复杂多步骤动画需要反复进行视觉调试,而代理无法完成这项工作。

有效:“在计时器切换状态时添加弹簧动画。”

无效:“让计时器动画带来令人满意的感觉。”(过于主观,需要视觉微调。)

代理如何处理错误处理模式?

处理得非常好。代理理解Swift的do/catchResultasync throws模式:

Implement error handling for the HealthKit authorization flow:
1. Check HKHealthStore.isHealthDataAvailable()  show alert if not
2. Request authorization  handle denial gracefully
3. On write failure  retry once, then show error
4. All errors should be user-facing with localized descriptions

代理可以生成结构清晰的错误处理代码,并提供恰当的用户提示信息。但有时会过度处理错误(捕获本应继续向上传播的异常),因此请审查catch代码块。

我能否使用代理实现无障碍功能?

可以,但只能完成一部分。代理能够正确添加无障碍标签、提示和特征:

Add accessibility labels to all interactive elements in TimerView:
- Timer display: current time remaining
- Start/Pause button: current state and action
- Reset button: "Reset timer"
- Duration picker: selected duration

代理无法完成的工作包括:验证VoiceOver导航顺序是否正确、测试Dynamic Type缩放,以及评估颜色对比度。请使用Xcode的Accessibility Inspector进行验证。

代理如何处理Core Data迁移(未使用SwiftData时)?

代理可以编写Core Data迁移映射和模型版本,但无法自动完成Xcode中的手动步骤(创建新模型版本、选择当前版本)。如果仍在使用Core Data而非SwiftData,请在CLAUDE.md中记录模型版本历史:

## Core Data Model Versions
- V1: Initial (GroceryList, GroceryItem)
- V2: Added Category model (current)
- Migration: Lightweight automatic for V1→V2

代理如何处理SwiftUI预览?

有两种方式: 1. Apple Xcode MCP的RenderPreview工具可在无界面模式下渲染预览并返回结果。代理可以验证预览能否成功编译和渲染,但无法判断视觉效果是否正确。 2. 基于构建的验证通过build_sim确认预览提供程序能够编译。如果预览在运行时崩溃,构建仍会成功——只有当Xcode尝试渲染预览时,崩溃才会显现。

如需对预览进行视觉验证,仍需打开Xcode。

visionOS和Apple Vision Pro呢?

同样的模式依然适用。XcodeBuildMCP支持visionOS模拟器,架构模式(@Observable、NavigationStack、SwiftData)也完全一致。RealityKit特有代码(3D内容、沉浸式空间、手部追踪)与Metal面临相同的局限——代理可以编写正确的代码,但无法验证空间输出效果。

项目达到多大规模后,代理会难以应对?

上下文窗口大小是主要限制因素。借助Opus 5的100万token窗口,Claude Code可以同时在活动工作内存中容纳约50至70个Swift文件。对于更大的项目,代理会通过文件搜索和选择性读取来处理代码库的局部内容。拥有100多个文件的项目也能正常处理——代理只需按需读取文件,而不必将所有内容都保留在上下文中。

实际限制并非文件数量,而是代码库的一致性。一个拥有详细CLAUDE.md且文档完善的200文件项目,比一个缺少文档的30文件项目更容易获得理想结果。

使用代理进行iOS开发需要掌握Swift吗?

您需要能够审查代理输出并作出架构决策。不必亲自编写每一行代码,但需要充分理解Swift,以便发现代理作出的错误选择——尤其是并发、内存管理和框架特有模式方面的问题。代理可以将您现有的能力放大10倍,但无法取而代之。

代理如何处理Swift文件中的合并冲突?

代理能够可靠地解决Swift源文件中的合并冲突。所有代理运行时都能正确理解标准冲突标记(<<<<<<<=======>>>>>>>)。但是,.pbxproj文件中的合并冲突仍需手动解决——不要让代理解决.pbxproj冲突。

使用代理进行iOS开发的成本是多少?

使用Anthropic的Max计划(Opus 5、100万上下文)时,典型的iOS开发会话持续30至120分钟,处理20万至80万token。MCP工具调用带来的额外开销很小(与原始构建输出相比,结构化JSON响应更节省token)。其成本与在其他任何代码库中运行Claude Code相当——iOS开发并不会明显比Web开发更昂贵或更便宜。

我能否在UIKit项目中使用代理?

可以,但代理处理SwiftUI的效果更好。UIKit需要更多样板代码,声明式结构较少,并且经常涉及代理无法编辑的Interface Builder文件。如果您有UIKit项目,可以考虑让代理处理模型层和业务逻辑,手动完成界面工作;也可以逐步将视图迁移至SwiftUI。

代理如何处理本地化?

代理能够有效创建和编辑.xcstrings(Xcode字符串目录)文件。它们可以添加新的本地化键、提供翻译,并保持不同语言之间的一致性。.xcstrings文件采用结构化JSON格式,非常适合代理处理。对于.strings文件(旧格式),代理同样表现出色——其键值格式简单明了。


iOS 中常见的 Agent 错误(以及如何预防)

以下是我在8个 iOS 项目的数千次 Agent 交互中反复观察到的错误。每种错误都有相应的预防策略。

错误1:混用可观察性模式

现象: Agent 在一个文件中使用 @Observable,却在另一个文件中使用 ObservableObject;或者为 @Model 类添加 @Observable(该类本身已经可观察)。

预防措施: 在 CLAUDE.md 中明确规定:

- NEVER use ObservableObject — use @Observable
- NEVER add @Observable to @Model classes (already Observable)
- NEVER use @StateObject — use @State with @Observable
- NEVER use @ObservedObject — access @Observable properties directly

错误2:在闭包中造成循环引用

现象: Agent 创建了对 self 进行强引用的闭包,尤其是在 Timer.publishNotificationCenter 和完成处理程序中。

预防措施: 在 CLAUDE.md 中加入闭包模式:

## Closure Pattern
- Timer callbacks: use `[weak self]` and guard
- NotificationCenter observers: store in `Set<AnyCancellable>` and use `[weak self]`
- Completion handlers: use `[weak self]` for any closure stored beyond the call site

错误3:忽略 @MainActor 要求

现象: Agent 创建的 @Observable 类未通过 @MainActor 进行隔离,导致出现 Swift 6.2 并发警告;如果 UI 更新不在主线程执行,还可能造成运行时崩溃。

预防措施:

## Concurrency Rule
ALL @Observable classes MUST be @MainActor:
```swift
@Observable
@MainActor
final class SomeManager { }
```

现象: Agent 使用已弃用的 NavigationLink(destination:label:),而不是类型安全的 NavigationLink(value:).navigationDestination(for:) 模式。

预防措施:

## Navigation Pattern
ALWAYS use value-based navigation:
```swift
NavigationLink(value: item) { ItemRow(item: item) }
.navigationDestination(for: Item.self) { ItemDetailView(item: $0) }
```
NEVER use: `NavigationLink(destination: ItemDetailView(item: item)) { }`

错误5:硬编码模拟器名称

现象: Agent 编写的构建命令包含特定的模拟器名称(“iPhone 16 Pro”),但您的系统中可能并不存在该模拟器。

预防措施: MCP 会处理这一问题——list_sims 可发现可用的模拟器。在 CLAUDE.md 中写入:

## Simulators
Do NOT hardcode simulator names. Use `list_sims` MCP tool to discover
available devices, then `boot_sim` with the discovered device ID.

错误6:在错误的目录中创建文件

现象: Agent 将新视图文件创建在项目根目录,而不是 Views/ 子目录;或者将模型放入错误的分组。

预防措施: CLAUDE.md 中的文件结构注释可指导文件放置。此外,还应写入:

## File Placement Rules
- Views → `AppName/Views/`
- Models → `AppName/Models/`
- Managers → `AppName/Managers/`
- Extensions → `AppName/Extensions/`
- Tests → `AppNameTests/`

错误7:未处理平台可用性

现象: Agent 在会为 tvOS 编译的共享代码中使用 HealthKit(tvOS 不支持 HealthKit),或者在 watchOS 代码中使用 ActivityKit。

预防措施:

## Platform Guards
- HealthKit: `#if canImport(HealthKit)` (unavailable on tvOS)
- ActivityKit: `#if canImport(ActivityKit)` (iOS only)
- WatchKit: `#if os(watchOS)`
- UIKit haptics: `#if os(iOS)` (unavailable on tvOS, watchOS uses WKHaptic)

错误8:对简单功能过度设计

现象: 原本只需一个20行工具函数即可实现,Agent 却创建了协议、协议扩展、具体实现、工厂以及依赖注入容器。

预防措施: 加入一项简洁性原则:

## Architecture Principle
Prefer the simplest solution that handles the requirements.
- Direct implementation over protocol abstraction (unless you have 2+ conforming types)
- Concrete types over generics (unless reuse is proven)
- Extensions on existing types over new wrapper types

坦诚的评估

使用 AI Agent 发布8款 iOS 应用后,我得出以下结论:

Agent 带来了根本变化的方面: 实现速度。过去需要数天完成的工作,如今只需数小时。SwiftUI 视图、SwiftData 模型、单元测试和重构——现在主要由 Agent 产出,再由人工审核。

Agent 未带来根本变化的方面: 架构决策、视觉设计、性能优化以及 App Store 提交。这些工作仍由人来主导。

效率倍增确实存在,但并非没有上限。 根据我对这8款应用的主观估计:对于文档完善,并正确配置 MCP 和钩子的项目,功能交付速度可提升3至5倍。这并非与对照组进行的测量,而是对同一代码库中 Agent 辅助开发功能与纯人工独立完成同等工作的实际耗时进行比较。对于缺少文档且没有钩子的项目,提升幅度可能只有1.5至2倍——Agent 花费了太多时间揣测,而不是直接构建。33

真正有所回报的投入: 花在 CLAUDE.md、钩子和 MCP 配置上的时间。每投入1小时进行设置,都能节省数小时纠正 Agent 错误的时间。配置本身才是产品,Agent 则是执行引擎。

令我意外的是: MCP 服务器在很大程度上改变了协作模式。在使用 MCP 之前,Agent 只是恰好理解 Swift 的高级文本编辑器。接入 MCP 后,它们成为能够编写、构建、测试、调试和迭代的开发伙伴。结构化反馈闭环,正是“能够编写代码的 Agent”与“能够交付代码的 Agent”之间的分水岭。

如果能给过去的自己一条建议: 从最小的应用(Reps,共14个文件)开始,先正确设置 MCP 和钩子,编写一份详尽的 CLAUDE.md,再将这些模式扩展到更大的项目。不要一开始就挑战拥有63个文件的多平台应用。无论项目规模如何,基础设施投入都大致相同——先在小型项目中完成一次,再复制到其他所有项目。

未来展望: Xcode 26.3 的原生 Agent 集成只是开端,远非终点。Apple 提供 MCP 支持,意味着工具链正在迈向以 Agent 为先的开发模式。如今就投入建设 Agent 兼容项目结构的开发者——包括清晰的 CLAUDE.md 文件、可测试的架构和自动化钩子——将随着工具不断进步,持续获得复利回报。


快速参考卡

安装(一次性设置)

# XcodeBuildMCP (82 tools)
claude mcp add XcodeBuildMCP -s user \
  -e XCODEBUILDMCP_SENTRY_DISABLED=true \
  -- npx -y xcodebuildmcp@latest mcp

# Apple Xcode MCP (20 tools)
claude mcp add --transport stdio xcode -s user -- xcrun mcpbridge

# Codex MCP setup
codex mcp add xcode -- xcrun mcpbridge

# Verify
claude mcp list

CLAUDE.md 必备章节

1. Project identity (bundle ID, target OS, architecture)
2. File structure with annotations
3. Build and test commands
4. Key patterns and rules
5. Prohibitions (NEVER touch .pbxproj)
6. Framework-specific context

必备钩子

{
  "PreToolUse": [{ "matcher": "Edit|Write", "command": "block .pbxproj" }],
  "PostToolUse": [{ "matcher": "Edit|Write", "command": "swiftformat" }]
}

架构规则

@Observable         (not ObservableObject)
NavigationStack     (not NavigationView)
@State              (not @StateObject)
SwiftData @Model    (not Core Data)
async/await         (not completion handlers)
@MainActor          (on all Observable classes)
.glassEffect()      (Liquid Glass, iOS 26+)

MCP 工具优先级

Build:     build_sim          (not xcodebuild via Bash)
Test:      test_sim           (not xcodebuild test via Bash)
Sim:       list_sims/boot_sim (not xcrun simctl via Bash)
Docs:      DocumentationSearch (not WebSearch)
REPL:      ExecuteSnippet     (not swift via Bash)

更新日志

日期 变更 来源
2026-08-16 修正 Codex 模型,并纳入 Xcode 27 的代理平台。 修正(面向读者的错误): Codex CLI部分和双重审查矩阵声称 Codex“使用 OpenAI 模型(GPT-4o、o3)”。两者都不是 Codex 模型。当前阵容为 GPT-5.6 Sol / Terra / Luna,以及 GPT-5.3 Codex Spark(仅文本研究预览版);GPT-5.4 / GPT-5.4-mini 将于 2026-08-31 从 Codex 中退役。23 Xcode 27 beta 5(27A5237l,8月10日)已全面取代 beta 4,其中两项 beta 5 更新值得纳入正文:代理可验证 watchOS App,包括 Digital Crown、侧边按钮和操作按钮输入(181147968);sudo xcrun mcp-server enable会预览一个MCP服务器,“无需打开 Xcode 工作区即可运行”——可通过 --unsafe-always-allow-all-agents 实现无人值守运行,但 Apple 和本指南均不建议在桌面环境中这样做(181836944)。7月29日更新遗漏的更大修正:“Xcode 26.3 Native Agents”部分描述的是一项内联助手,而 Xcode 27 在 beta 1(6月8日)时就已将其替换。代理现在可接入携带技能、MCP服务器和 ACP 配置的插件(178289210),启动模拟器并合成触控操作(175179787),操控运行状态及修改构建设置、权利和 Info.plist 键(176935844),并在文件系统访问安全层下运行(178289431)。该部分已更名,限制列表限定于 26.x 并补充了 27 的修正内容,矩阵按版本重新划分,且新增操作提醒:PreToolUse .pbxproj hook 对 Xcode 内部没有管辖权。另已记录:自 beta 2(176901842)起,LLDB 自带MCP服务器 lldb-mcp,因此“两个服务器”的表述现已变为三个。平台方面:iOS/iPadOS 26.6.1(23G82)和 macOS 26.6.2(25G82)于 8月10日发布。已验证未变:XcodeBuildMCP 2.7.0,以及 Xcode 26 / iOS 26 的SDK上传强制要求。 22 23
2026-07-29 平台观察结束:iOS、iPadOS 和 macOS 26.6 于 7月27日正式发布。 最近三行中持续追踪的未决项已解决。iOS 26.6 和 iPadOS 26.6 均以构建版本 23G71发布,macOS 26.6 为 25G72;同时发布的还有 tvOS 26.6(23L773)、visionOS 26.6(23O770)和 watchOS 26.6(23U67)。对于曾基于 RC 进行测试的用户,有一点值得注意:23G71 与 Apple 于 7月20日推送的 iOS 26.6 RC 构建号相同,因此 RC 原封不动地晋升为正式版——已在 RC 上验证过的代理配置无需重新验证。Xcode 27 beta 4(27A5228h,7月20日)仍是最新的 Xcode beta,XcodeBuildMCP仍为 2.7.0(7月23日发布),两者自上次更新以来均未变化。此前的更新日志条目保持原样;它们记录的是当时已知的信息。 24
2026-07-28 渲染修复:重新关联 10 个孤立引用,恢复更新日志的来源列。 脚注 2-11——本指南最初的一组引用——在后续更新循环将脚注 12-22 叠加其上时丢失了正文标记,导致参考列表中有 10 个条目的反向链接指向页面中不再存在的 #fnref:N锚点。现已将每项引用重新附加到其实际支持的主张:MCP规范对应协议定义,XcodeBuildMCP仓库和官方网站对应工具清单及CLI命令计数,Apple 的 Xcode 26.3 MCP服务器和 Rudrank Riyam 的独立确认对应 xcrun mcpbridge和 XPC 段落,Swiftjective-C 对应原生Claude Agent 和 Codex 提供方,Claude Code文档对应运行时描述,SWE-bench 对应结构化工具优于 shell 的论点,SwiftFormat 对应保存时格式化 hook。此外,本更新日志的表头声明了两列,而每行实际包含三列,因此 python-markdown 会将每行截断至表头宽度,并悄然丢弃其来源单元格;表头现已改为三列。已渲染页面中的有效引用:12 -> 22。 -
2026-07-25 Claude Opus 5 是默认 Opus 模型;Claude Code MCP诊断。 Claude Code v2.1.219(7月24日)将 Claude Opus 5(claude-opus-5)设为默认 Opus 模型——1M 上下文、基础价格为每 MTok $5/$25(与 Opus 4.8 相同)、快速模式为 $10/$50、知识截止日期为 2026年5月,effort默认值为 high;Opus 4.7 已从快速模式中移除,因此 /fast现在表示 Opus 5 或 Opus 4.8。指南正文中原先将其 1M 上下文窗口归于 Opus 4.6 的六处引用,现均改为 Opus 5(运行时比较、比较表、上下文管理部分、运行时建议,以及有关工作记忆容量和会话成本的两个 FAQ 答案)。1M 数值和约 50 个文件的工作记忆估算均未变化——这是模型名称时效性修正,而不是能力修订。同一版本还新增了 MCP连接诊断:当服务器连接失败时,claude mcp list/mcp现在会报告 HTTP 状态和错误文本;对于包含隐藏前导或尾随空白的MCP配置值会发出警告;无头 stream-json 初始化事件新增 mcp_server_errors,列出因验证而跳过的 --mcp-config条目。这一点值得了解,但验证部分保持原样:HTTP 状态部分仅适用于远程服务器,而本指南安装的两个服务器(npx xcodebuildmcpxcrun mcpbridge)均为 stdio——可能影响 iOS 配置的是空白警告和 mcp_server_errors,通常是意外复制到配置路径中的多余空格。v2.1.219 还新增 sandbox.network.strictAllowlist,用于在不提示的情况下拒绝沙盒命令访问未列入允许名单的主机;它与脚注 20 已追踪的 sandbox.allowAppleEvents条目并列。该功能为可选启用,且尚未在真实构建中测试;但 iOS 场景中一个合理的陷阱是,沙盒化的 SPM 解析或 xcodebuild -resolvePackageDependencies访问 github.com——启用前请将包依赖主机加入允许名单。v2.1.220(7月25日)仅包含“错误修复和可靠性改进”。平台观察:未变且仍未结束——iOS 26.6 和 macOS 26.6 正式版尚未发布(RC 于 7月20日推送;媒体预期约为 7月27日)。 2025
2026-07-24 XcodeBuildMCP 2.7.0。 npm latest 从 2.6.2 升至 2.7.0(发布于 2026-07-23)。重点:UI 自动化工具现在可通过 Device Hub 完整支持 Xcode 27 模拟器——包括启动模拟器窗口和键盘控制——因此在 iOS 27 beta 上进行代理驱动的 UI 验证不再需要回退到 Xcode 26 模拟器;iOS 27 部分和 XcodeBuildMCP部分现已说明这一点。破坏性变更:构建/测试工具返回 schemaVersion: 3结构化结果(自 2.6.0 起为 v2)——固定在 2 的验证器需要更新。行为变更:省略 configuration时,构建/测试/清理/App 路径工具现在遵从 scheme 操作的配置,而不再始终使用 Debug——Build & Test 部分补充了操作指导(若假定 Debug 构件,请显式传递 configuration,或使用 session_set_defaults)。此外:可复用的 .xctestproducts测试准备包(无需重新构建即可重新运行测试,每次运行生成新的 .xcresult)、会话默认 extraArgs、新的 xcodebuildmcp purge工作区存储命令,以及修复MCP客户端等待 10-17 秒才能使用工具的问题(曾导致健康检查误判失败)。维护事项:规范仓库主页为 github.com/getsentry/XcodeBuildMCP——npm 的 repository 字段指向此处,旧的 cameroncooke URL 会进行 301 重定向——因此已更新剩余的旧 URL 引用;已验证 2.7.0 的工具清单未变(文档仍宣称有 12 个工作流中的 82 项工具;针对 2.6.2 和 2.7.0 进行同类 stdio tools/list比较返回了相同清单,CLI仍为 100 条命令 / 72 条规范命令)。平台观察:延续上一行,仍未结束——iOS 26.6 RC(23G71)于 7月20日发布,iOS/macOS 26.6 正式版预计即将发布(约 7月27日)。 1921
2026-07-21 Xcode 26.6 正式版 + Xcode 27 修正,XcodeBuildMCP 2.6.x,Claude Code自动后台运行。 Xcode 26.6 于 2026-06-25 正式发布(构建版本 17F113;RC 为 6月8日,RC 2 为 6月18日),包含三项与代理相关的 Coding Intelligence 改进:Google Gemini 作为编码助手提供方(171990272)、Agent Client Protocol 支持(178294840),使任何兼容 ACP 的代理都能接入 Intelligence 面板,以及 Preview Snapshot MCP变体渲染——浅色/深色、方向、文字大小(178831772);它内置 Swift 6.3 + iOS 26.5 代SDK,要求 macOS Tahoe 26.2+,并修复了两个代理回合崩溃问题及代理提问时的卡死问题。前置条件现建议使用 26.6+。修正:下方 2026-06-08 条目称 Apple 尚未发布经验证的“Xcode 27”版本——这一说法在当时就是错误的:Xcode 27 beta(27A5194q)于 WWDC 当日便出现在 Apple 发布页面上,现在已至 beta 4(27A5228h,2026-07-20),配备 Swift 6.4 + iOS 27 SDK,要求 macOS Tahoe 26.4+;iOS 27 部分现已涵盖其内容(Coding Intelligence plan mode 的已知问题 178673449、RenderPreview 群组 + 本地化预览、“Prepare Project for Localization”移除键报告、在 27.0 上使用 ASan 需要 Xcode 26.5+)。XcodeBuildMCP从 2.5.2 升至 2.6.2(npm latest,6月2日):v2.6.0 的“运行时 UI 自动化”版本为 snapshot_ui新增稳定元素引用 + 屏幕哈希(sinceScreenHash跳过),新增 wait_for_ui / batch / drag工具,type_textreplaceExisting、v2 schema 结果中的 nextSteps,以及可选的 XCODEBUILDMCP_HEADLESS_LAUNCH;工具计数从“8 个类别中的 59 项”修正为 12 个工作流类别中的 82 项MCP工具(CLI:100 条命令,72 条规范命令),其中包括新的 xcode-ide代理,它可通过 XcodeBuildMCP调用仅限 Xcode-IDE 的MCP工具。Claude Code v2.1.212(7月16日)会将运行超过 2 分钟的MCP调用自动置于后台(CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS可调节/禁用)——xcodebuild 构建和测试通常会超过该时长——而 v2.1.206(7月9日)修复了每服务器 request_timeout_ms被忽略的问题(新会话中长调用会使用默认 60 秒超时);v2.1.181(6月17日)新增 sandbox.allowAppleEvents并修复沙盒会话中 open/osascript的 macOS 错误 -600,使 open -a Simulator工作流恢复可用。平台观察:iOS 26.6 RC(23G71)和 iOS 27 beta 4 均于 7月20日发布——iOS 26.6 正式版即将推出;App Store 年龄分级问卷于 7月9日新增社交媒体问题,2026年9月起新提交和更新必须作答。 17181920
2026-06-08 WWDC 2026 / iOS 27 beta。 新增“iOS 27 and WWDC 2026: What Your Agent Now Builds With”部分和 TL;DR 注释。截至 6月8日主题演讲,iOS 27 已进入 beta;iOS 26 仍是已发布版本,因此该部分将新框架定位为针对 iOS 27 beta SDK的目标,而代理开发工作流(运行时、MCP、CLAUDE.md、hooks)保持不变。每项与代理相关的新增内容均交叉链接至经验证的深度解析:Foundation Models GenerationOptions.ToolCallingMode + 内置 Vision 工具(OCRTool/BarcodeReaderTool);App Intents LongRunningIntent/performBackgroundTaskSyncableEntityIndexedEntityQuery;新的 Core AI 框架(在 Apple Silicon 上运行您自己的模型);新的 Evaluations 框架(面向模型质量的 XCTest);以及 SwiftData 观察/历史记录、HealthKit 锻炼区间和 SwiftUI iOS 27。Xcode 版本建议保持不变——Apple 尚未发布经验证的“Xcode 27”版本,因此指南仍建议使用 Xcode 26.5 正式版;操作备注是应在代理上下文中提及这些框架,因为 2026年6月之前的模型默认采用 iOS 26 的形态。 1213141516
2026-05-28 Beta 渠道 + WWDC26 定位。 Apple Developer(5月26日)宣布发布 iOS 26.6、iPadOS 26.6、macOS 26.6、tvOS 26.6、visionOS 26.6 和 watchOS 26.6 的 beta 版本,以及 Xcode 26.6 beta;行动号召明确指出应使用 Xcode 26.5 针对新的 beta SDK进行构建和测试,因此代理工作流应将 xcode-select固定在稳定版 Xcode 26.5(构建版本 17F42),同时并行安装 beta SDK以进行前向兼容性测试,而不是将 DEVELOPER_DIR切换至 beta。WWDC26(5月18日公布)定于 2026年6月8日至12日举行——这很可能是 Swift、SwiftUI、App Intents、Foundation Models 和设备端代理API的下一处拐点。本指南中的 Coding Intelligence 和 Foundation Models 指导仍以 Xcode 26.5 稳定版为目标;beta 渠道的SDK尚不推荐作为生产代理工作流的基础环境。Apple Developer(5月21日)还宣布将于 2026年6月18日生效的澳大利亚和越南年龄分级变更——与代理无关的指导,但值得为作品集合规性作出提示。 27
2026-05-24 将 Xcode 26.5 正式版发布日期修正为 2026-05-11,并根据 Apple 发布页面将构建版本固定为 17F42。本轮本地验证:xcodebuild -version返回 Xcode 26.5 / Build version 17F42;npm latest 的 xcodebuildmcp返回 2.5.2time.modified2026-05-12T07:40:41.737Z27
2026-05-16 将推荐 Xcode 升至 26.5+(发布于 2026-05-11)。两项新的 Coding Intelligence 功能对代理工作流很重要:现在可以在编码助手中排队消息,无需等待响应即可安排下一项请求;代理也可在继续前提出澄清问题——两者都降低了将 Xcode 原生代理与Claude Code或 Codex 会话并行运行的阻力。27 XcodeBuildMCP时效性检查:v2.5.2(2026-05-12)为最新版本,新增内置 AXe 1.7.0,并修复日志捕获过滤器验证问题;v2.1.0+ 的 xcodebuildmcp init流程仍是推荐安装路径。
2026-04-28 将代理工作流推荐的 Xcode 升至 26.4+(26.4.1,2026-04-16,构建版本 17E202 是最新稳定版,仅修复错误)。引用了对代理编写测试和本地化有用的 Xcode 26.4 功能(2026-03-24,构建版本 17E192):Swift Testing 图像附件、Issue.record中的严重性、附带 crashlog 的 UI 测试崩溃警告(特别针对 XCUIApplication(bundleIdentifier:) / XCUIApplication(url:) App)、String Catalog 编辑器改进。新增 xcodebuildmcp init自动安装程序(v2.1.0+,2026-02-23),作为手动MCP设置的替代方案。
2026-04-27 App Store Connect:从 2026-04-28 起,必须使用 Xcode 26+ 提交。Foundation Models 新增 SystemLanguageModel.contextSizetokenCount(for:)API(回部署至 iOS 26.4)——新增了用于代理生成 FM 提示词预算代码的模式。iOS 26.4.2(4月22日)和 iOS 26.5 beta 3(4月20日)发布,未包含影响代理工具链的变更。
2026-04-13 首次发布。8 个 App、3 个运行时、MCP设置、CLAUDE.md 模式、hooks、案例研究。

参考资料


  1. XcodeBuildMCP 默认包含 Sentry 遥测。项目的隐私文档详细说明了会发送的内容:错误消息、堆栈跟踪,以及在某些情况下的文件路径。设置环境变量 XCODEBUILDMCP_SENTRY_DISABLED=true 可完全退出。 

  2. Anthropic,“Model Context Protocol Specification”,modelcontextprotocol.io/specification。MCP 规范定义了 JSON-RPC 传输、工具发现和资源协议,XcodeBuildMCP 与 Apple 的 Xcode MCP 均有实现。 

  3. XcodeBuildMCP,github.com/getsentry/XcodeBuildMCP。由 Sentry 维护的开源项目。覆盖模拟器、设备、调试、UI 自动化、覆盖率和 Swift 软件包,共有 12 类工作流中的 82 个工具(截至 v2.6.x)。采用语义化版本控制,并提供更新日志。 

  4. Apple 将 Xcode MCP 服务器作为 Xcode 26.3 智能开发者工具计划的一部分推出,将 MCP 定位为 AI 编程助手与 Xcode 工具链之间的接口层。官方文档请参阅 Xcode Release Notes。 

  5. Rudrank Riyam,“Exploring Xcode Using MCP Tools”,rudrank.com/exploring-xcode-using-mcp-tools-cursor-external-clients,2026。独立确认了 Apple 的 MCP 工具数量、XPC 依赖关系和文档搜索能力。 

  6. Jimenez, C.E., Yang, J., Wettig, A., et al.,“SWE-bench: Can Language Models Resolve Real-World GitHub Issues?” ICLR 2024。arxiv.org/abs/2310.06770。拥有结构化工具访问权限的 Agent 显著优于仅限使用非结构化 shell 命令的 Agent。这一发现验证了结构化 MCP 接口对 Agent 效能的价值。 

  7. Claude Code CLI 文档,code.claude.com。涵盖 Hook 系统、MCP 配置、子 Agent 委派和 Agent 定义。 

  8. SwiftFormat,github.com/nicklockwood/SwiftFormat。用于 PostToolUse hooks 的 Swift 格式化工具,以保持一致的代码风格。 

  9. XcodeBuildMCP 官方网站,xcodebuildmcp.com。工具参考页宣传了按工作流分组的 82 个 MCP 工具;CLI 列出了覆盖 12 个类别的 100 条命令(其中 72 条为规范命令)。可通过 Homebrew 或 npx 安装。 

  10. Swiftjective-C,“Agentic Coding in Xcode 26.3 with Claude Code and Codex”,swiftjectivec.com,2026年2月。确认 Xcode 26.3 通过“设置”>“Intelligence”提供原生 Claude Agent 和 Codex 运行时支持。通过 xcrun mcpbridge 暴露 20 个 MCP 工具。 

  11. Blake Crosley,“Two MCP Servers Made Claude Code an iOS Build System”,blakecrosley.com/blog/xcode-mcp-claude-code,2026年2月。介绍同一作者 iOS 开发工作流的配置过程和实际结果。 

  12. Foundation Models in iOS 27: Tool-Calling Control,内容源自 Apple 关于 Foundation Models 的 iOS 27 beta 文档(GenerationOptions.ToolCallingModeOCRToolBarcodeReaderTool)。WWDC 2026;已于2026年6月8日核实。 

  13. App Intents in iOS 27: Background, Sync, Spotlight,内容源自 Apple 关于 App Intents 的 iOS 27 beta 文档(LongRunningIntentperformBackgroundTask(options:operation:)SyncableEntityIndexedEntityQuery)。WWDC 2026;已于2026年6月8日核实。 

  14. Core AI: Running Models on Apple Silicon,介绍用于在 Apple Silicon 上运行自有模型的全新 iOS 27 / macOS 27 Core AI 框架。WWDC 2026;已于2026年6月8日核实。 

  15. Evaluations: XCTest for Model Quality,介绍全新的 macOS 27 Evaluations 框架,可在测试套件中衡量模型输出质量。WWDC 2026;已于2026年6月8日核实。 

  16. SwiftData in iOS 27: Observation and HistoryHealthKit in iOS 27: Workout Zones, New TypesWhat’s New in SwiftUI for iOS 27,均源自 Apple 的 iOS 27 beta 文档。WWDC 2026;已于2026年6月8日核实。 

  17. Apple,“Xcode 26.6 Release Notes”Apple Developer Releases。Xcode 26.6(构建版本 17F113)于2026年6月25日列出;RC(17F109)为2026年6月8日,RC 2(17F113)为2026年6月18日。引自发布说明:“Google Gemini is now available in the coding assistant”(171990272);“Xcode adds support for the Agent Client protocol”(178294840);“The Preview Snapshot MCP tool can now render variants such as light/dark appearance, portrait/landscape orientation, and various type size overrides”(178831772);修复了在活跃 Agent 回合中关闭窗口时崩溃的问题(174186260)、涉及非绝对路径的 Agent 文件操作期间崩溃的问题(174752919),以及“a bug that could cause Xcode to hang indefinitely when an agent asked the user a question”(177989242)。Xcode 26.6 包含 Swift 6.3,以及适用于 iOS 26.5、iPadOS 26.5、tvOS 26.5、watchOS 26.5、macOS 26.5 和 visionOS 26.5 的 SDKs;需要 macOS Tahoe 26.2 或更高版本。发布说明文本已于2026年7月21日核实。 

  18. Apple,“Xcode 27 Release Notes”Apple Developer Releases。Xcode 27 beta(27A5194q)于2026年6月8日列出,即 WWDC 第一天;beta 4(27A5228h)于2026年7月20日列出。Xcode 27 beta 4 包含 Swift 6.4,以及适用于 iOS 27、iPadOS 27、tvOS 27、watchOS 27、macOS 27 和 visionOS 27 的 SDKs;需要 macOS Tahoe 26.4 或更高版本。引用条目:计划模式确认栏(“Implement the plan?”)的已知问题——在 Agent 仍在流式输出时点击,可能触发重叠的 Agent 回合(178673449);RenderPreview MCP 工具支持使用新分组功能渲染 Previews(174692209),以及以不同本地化语言预览 UI(181040291);“Prepare Project for Localization” Agent 工具现在会显示因不再出现在源代码中而被移除的 String Catalog 键(179755385);使用 Xcode 26.4 或更早版本构建时,Address Sanitizer 在 iOS/tvOS/watchOS/visionOS 27.0 上可能无法启动——解决办法是使用 Xcode 26.5+(178072780)。发布说明文本已于2026年7月21日核实。 

  19. XcodeBuildMCP v2.6.0 release,2026年6月1日(“runtime UI automation”);随后发布了 v2.6.1 和 v2.6.2,v2.6.2 是 npm 最新版本(于2026年7月21日核实:npm view xcodebuildmcp dist-tags.latest2.6.2,发布于2026年6月2日)。工具数量来自官方文档(xcodebuildmcp.com/docs/tools:“All 82 tools XcodeBuildMCP advertises, grouped by workflow”),并于2026年7月21日在本地使用 v2.6.2 交叉验证:xcodebuildmcp tools 报告覆盖 12 个工作流类别(coverage、debugging、device、macos、project-discovery、project-scaffolding、simulator、simulator-management、swift-package、ui-automation、utilities、xcode-ide)的 100 条 CLI 命令(72 条规范命令);在启用全部 12 个工作流的情况下,stdio tools/list 返回了本指南清单表中使用的工具名称,包括 wait_for_uibatchdragxcode_ide_list_toolsxcode_ide_call_tool。约 70% 的实际耗时、约 68% 的 token 和约 76% 的工具调用缩减数据,是该项目在确定性 Weather 应用任务上的自有基准,并非独立测量。 

  20. Claude Code CHANGELOG。v2.1.212(2026年7月16日):“MCP tool calls running longer than 2 minutes now move to the background automatically so the session stays usable; configure the threshold or disable with CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS。”v2.1.206(2026年7月9日):“Fixed MCP servers configured via --mcp-config or .mcp.json ignoring a per-server request_timeout_ms, which caused long-running MCP tool calls to time out at the 60s default in fresh sessions。”v2.1.181(2026年6月17日):“Added sandbox.allowAppleEvents opt-in setting that lets sandboxed commands send Apple Events on macOS”以及“Fixed open, osascript, and browser-based auth flows failing with error -600 on macOS by adding the Apple Events entitlement。”v2.1.219(2026年7月24日):“Added HTTP status and error text to claude mcp list and /mcp when a server fails to connect”;“Added a warning for MCP config values with hidden leading or trailing whitespace”;“Added mcp_server_errors to the headless stream-json init event, listing --mcp-config entries skipped”;以及“Added sandbox.network.strictAllowlist setting to deny non-allowlisted hosts for sandboxed commands。”v2.1.220(2026年7月25日)仅为“Bug fixes and reliability improvements”。更新日志文本已于2026年7月21日核实;v2.1.218-v2.1.220 条目已于2026年7月25日核实。 

  21. XcodeBuildMCP v2.7.0 release,2026年7月23日;npm 最新版本已于2026年7月24日核实(npm view xcodebuildmcp dist-tags.latest2.7.0,发布于2026-07-23T14:07Z)。引自发布说明:Xcode 27 Device Hub——“UI automation tools now work fully with Xcode 27 simulators through Device Hub, including simulator window launching and keyboard controls”;破坏性变更——构建和测试工具返回 schemaVersion: 3,影响固定在版本 2 的验证器;行为变更——“Build, test, clean, and app-path commands now honor the scheme action’s configuration when configuration is omitted instead of always using Debug”;此外还有 .xctestproducts 可复用测试准备包、xcodebuildmcp purge 工作区存储命令(默认 dry-run)、带有每次调用覆盖项的会话默认 extraArgs,以及“Fixed MCP clients waiting 10–17 seconds for tools to become available, which could make short health checks report a failed connection。”仓库主页:npm 的 repository 字段指向 github.com/getsentry/XcodeBuildMCP,而 github.com/cameroncooke/XcodeBuildMCP 会返回 301 重定向至该地址(均于2026年7月24日检查)——应引用 getsentry URL。工具数量:发布说明未说明数量,官方文档(xcodebuildmcp.com/docs/tools)仍宣传“All 82 tools”(于2026年7月24日获取);本会话中使用 xcodebuildmcp@2.6.2 mcp@2.7.0 mcp 进行了同等 stdio tools/list 交叉验证(启用相同的 12 个工作流,并分别确认 serverInfo.version):两者返回字节级相同的工具清单(此环境中暴露 76 个——宣传的 82 个包含依赖环境条件的工具),且 2.7.0 的 xcodebuildmcp tools 仍报告相同 12 个类别中的 100 条命令、72 条规范命令。因此,覆盖 12 类的 82 个工具清单在 v2.7.0 中保持不变。 

  22. Apple,“Xcode 27 Release Notes”,于2026年8月16日从 DocC JSON 读取(HTML 页面通过客户端渲染,对抓取工具不返回文本)。Beta 5(27A5237l,2026年8月10日),原文:“Coding Intelligence agents can now verify watchOS apps, including rotating and pressing the Digital Crown, and pressing the side and Action buttons (Apple Watch Ultra). (181147968)”以及“Xcode 27 Beta 5 adds a preview of a new MCP server experience that runs without requiring an open Xcode workspace… You can turn this experience on by using sudo xcrun mcp-server enable. Check its state afterward with xcrun mcp-server status… Developers running agents in unattended environments can approve all permissions upfront with sudo xcrun mcp-server enable --unsafe-always-allow-all-agents. This is not a recommended configuration for at-desk use. (181836944)”。Beta 1(2026年6月8日):包含技能、MCP 服务器和 ACP 配置的插件(178289210);文件系统访问安全层(178289431);模拟器启动、安装、启动应用、触控合成和截图(175179787);MCP 调试器、scheme 以及构建设置/entitlements/Info.plist 工具(176935844);一流的规划功能(172857081);项目洞察(177568662)。Beta 2:“LLDB now ships with an MCP server (lldb-mcp)”(176901842)。构建版本和日期已根据 Apple Developer Releases 交叉核对。 

  23. OpenAI,Codex models(developers.openai.com/codex/models 重定向的规范目标),于2026年8月16日获取。推荐:“5.6 Sol — Flagship GPT-5.6 model with the strongest capability for complex coding, computer use, research, and cybersecurity”;“5.6 Terra — Balanced GPT-5.6 model for everyday work”;“5.6 Luna — Fast and affordable GPT-5.6 model”。GPT-5.3 Codex Spark 是仅文本的研究预览版。该页面说明,GPT-5.4 和 GPT-5.4-mini 将于2026年8月31日从 Codex 中退役,替代型号为 5.6-terra 和 5.6-luna。GPT-4o 和 o3 均未列为 Codex 模型。 

  24. Apple Developer releases feed。iOS 26.6(23G71)、iPadOS 26.6(23G71)、macOS 26.6(25G72)、tvOS 26.6(23L773)、visionOS 26.6(23O770)和 watchOS 26.6(23U67)均标注为2026年7月27日(周一)。7月20日的 iOS 26.6 RC 使用相同的 23G71 构建版本,因此该 RC 作为正式稳定版发布。标注为2026年7月20日(周一)的 Xcode 27 beta 4(27A5228h)仍是最新的 Xcode 条目。已于2026年7月29日根据 releases RSS feed 核实。 

  25. Anthropic,“Introducing Claude Opus 5”(2026年7月24日)和模型概览。Claude Opus 5(claude-opus-5):100 万 token 上下文窗口(默认值和最大值均为此数)、128K 最大输出、每 MTok $5 / $25——与 Opus 4.8 的基础定价相同——快速模式为 $10 / $50,可靠知识截止日期为2026年5月。effort 在 Claude API 和 Claude Code 中默认设为 high。Claude Code CHANGELOG v2.1.219(2026年7月24日):“Added Claude Opus 5 (claude-opus-5), now the default Opus model — 1M context, fast mode at $10/$50 per Mtok。”Opus 4.7 已从快速模式中移除;/fast 现在适用于 Opus 5 和 Opus 4.8。已于2026年7月25日核实。 

  26. Apple Developer News,“Upcoming Requirements”。2026年4月28日的条目:“Apps uploaded to App Store Connect must be built with Xcode 26 or later using an SDK for iOS 26, iPadOS 26, tvOS 26, visionOS 26, or watchOS 26。”此要求所列的平台中不包括 macOS。 

  27. Apple,“Xcode 26.5 Release Notes”“Xcode 26.5 (17F42) - Releases”。Apple 于2026年5月11日列出 Xcode 26.5,构建版本为 17F42。发布说明中引用了两项 Coding Intelligence 功能:无需等待当前响应完成,即可将消息排队发送给编程助手(174563016);Agent 可在继续之前提出澄清问题以收集上下文(175182375)。还包括对 12 个月承诺期按月订阅的 StoreKit Testing 支持(PricingTerms 模型、billingPlanType PurchaseOptionTransactionSubscriptionRenewalInfo 上的 CommitmentInfo),以及一项 Swift 调试器修复,用于处理在 async/await 操作中迁移线程的 Swift Tasks 的单步调试。当前会话于2026年5月24日验证:xcodebuild -version 返回 Xcode 26.5Build version 17F42npm view xcodebuildmcp version dist-tags.latest time.modified --json 返回最新版本 2.5.2,其中 time.modified2026-05-12T07:40:41.737Z。另请参阅:9to5Mac,“Xcode 26.5 adds two features that make agentic coding more useful”,2026年5月12日。 

  28. Apple,“Xcode 26.4 Release Notes”。Xcode 26.4(2026年3月24日,构建版本 17E192)。发布说明引用的功能:Swift Testing 现支持通过 CGImageNSImageUIImageCIImage 添加图像附件;Issue.record 接受严重性级别;某些 UI 测试应用崩溃——具体为通过 XCUIApplication(bundleIdentifier:)XCUIApplication(url:) 交互的应用——会报告为附带 crashlog 的警告,而非令测试失败;String Catalog 编辑器新增条目的剪切/复制/粘贴、移除语言,以及用现有语言预填译文,并加入 BUILD_ONLY_KNOWN_LOCALIZATIONS 设置。 

  29. Apple Developer News,“Xcode 26.4.1 (Build 17E202) Now Available”,2026年4月16日。仅包含 bug 修复的点版本——修复 iOS / macOS / visionOS 在 26.4 之前因缺少符号导致的 MetricKit 崩溃,以及 Swift async 栈分配 bug(swift_asyncLet_finish 中“freed pointer was not the last allocation”)。 

  30. getsentry/XcodeBuildMCP v2.1.0 release,2026年2月23日。新增 xcodebuildmcp init CLI 命令,可一步安装 Agent 技能和 MCP 配置,替代独立的 install-skill.sh 脚本。自动检测 Claude Code、Cursor 和 Codex;支持 --print(为不受支持的客户端将配置写入 stdout)和 --uninstall(移除)。 

  31. InfoQ,“Apple Adds Context Window Management to Foundation Models”,2026年3月。记录了新的 SystemLanguageModel.contextSizetokenCount(for:) APIs,并确认存在 @backDeployed(before: iOS 26.4) 注解。取代此前社区对 4096-token 硬编码的猜测。 

  32. 文件数量来自2026年4月27日在 8 个私有应用仓库中分别运行的 find . -name '*.swift' -not -path '*/Tests/*' | wc -l。不含测试文件。总数与 §The Portfolio 中的按应用细分表在内部保持一致。 

  33. 主观的实际耗时估计,并非与对照组比较得出的测量结果。3-5 倍这一数字源自作者对比:2026 年由 Agent 辅助完成的功能,与同一代码库中在 Agent 工作流之前由个人独自发布的同类功能,其实现所需时间的回忆。应将其视为完成 MCP + hook 配置后预期效果的启发式参考,而非基准。 

NORMAL ios-agent-development.md EOF