iOS 开发者的 AI 工作流,终于不用在「Xcode 的智能」和「自己习惯的 Agent」之间二选一了。
DeepSeek Harness 终于在千呼万唤中推出了公开测试版。我也是第一时间下载体验了一下,讲真确实让我大吃一惊。它的完成度已经很高,虽然 UI 还略显质朴,但是底层理解、分析和完成任务的能力已经超越了 Antigravity,和 Codex、Cloude 在一个水平上。当前后者在易用性上更成熟,对新手更友好。不过对于开发者而言,对 Harness 进行调教已经是一个必备技能了,下面我就作为一个 iOS 开发者,分享一下我是如何对 DeepSeek Harness 进行调教,并最终开发了一个 dsh-apple-mode 插件,以更好的适配 iOS/Apple 开发。
如果你做 Apple 平台开发(iOS / macOS / watchOS / visionOS),又正在用 DeepSeek Harness(以下简称 DSH)这类 Agent 工具,下面这个场景你一定不陌生:
- 想让 AI 直接改 Xcode 工程,但它只能读文件系统,看不懂
project.pbxproj的组织方式; - 想让 AI 遵循 SwiftUI / App Intents 的最佳实践,但通用模型的知识总是落后于 WWDC 之后的新 API;
- 想让 AI 像 Xcode Intelligence 那样「Swift 优先、先查后写」地干活,但每个工具都得自己拼 prompt。
自 Xcode 26 起,Apple 已经在 Xcode 中内置了大量的 AI 工具,直接使用内置的第三方模型插件,就能获得很好的效果。但是目前 Xcode 的 AI 插件只有 Codex 和 Cluade,Xcode 27 也仅仅是增加了 Gemini。对于其它 IDE/Harness,如何充分利用 Xcode 内置的 AI 能力,就成了我们调教的重点。
Xcode 26 其实已经把这三样「原材料」都给了我们------mcpbridge(官方 MCP 工具)、xcrun agent skills export(官方技能)、IDEIntelligenceChat 框架里的系统提示词。缺的只是一个把它们组合起来的载体。
于是有了 dsh-apple-mode:一个把「执行能力 + 知识能力 + 行为风格」打包成 DSH「模式」的插件,装完即可在会话里获得完整的 Xcode AI 能力栈。
1. 三样原材料,三个不同的层
在动手之前,先看清楚这三样东西各自是什么角色:
| 层 | 能力 | 来源 | 对应 DSH 机制 |
|---|---|---|---|
| 执行(手) | 26 个 Xcode MCP 工具 | mcpbridge(Xcode 官方 STDIO 桥) |
dsh-mcp-client |
| 知识(脑) | 10 个 Apple 平台技能 | xcrun agent skills export 本地导出 |
dsh-skill-filesystem |
| 行为(人格) | Xcode Intelligence 提示词风格 | IDEIntelligenceChat.framework |
agent preset 的 persona |
MCP 工具 解决「AI 能不能操作 Xcode 工程」:读写文件走 Xcode 工程组织而非文件系统、改构建设置不用手碰 pbxproj、能读 Issue Navigator、能切 scheme / 运行目标 / 测试计划、能直接读写 String Catalog。
技能 解决「AI 知不知道正确姿势」:swiftui-specialist(SwiftUI 最佳实践)、app-intents-specialist(App Intents 权威指南)、audit-xcode-security-settings(构建安全加固)、adopt-c-bounds-safety(C 语言边界安全)......这些是 Apple 官方发布、明确写着「无条件取代模型先前训练知识」的权威内容,且按需懒加载,不占上下文。
提示词解决「AI 怎么干活」:Swift 优先、工具辅助推理、先分类「解释 vs 改动」再动手------把 Xcode Intelligence 的工作风格移植到 DSH 会话里。
这三样东西是互补的,不是二选一。所以插件的核心设计决策是:用 DSH 的 agent preset(模式)机制把它们组合起来。
2. 核心设计决策:为什么是「模式」而不是全局接入
DSH 里最自然的组合单元是 agent preset(模式) ------本质上是一份 agent.cordis.yml 组合文件,可以自定义 persona、挂载工具、选择技能集,用户在新建会话时按需选择。
一开始我也想过把 MCP 直接全局接入(写进 profile 的 patch),但立刻被一个数字劝退了:26 个工具的大 schema 常驻上下文,每个请求大约多花 6k+ tokens。如果所有会话都背着这套 schema,等于让每一个无关任务都在为 Xcode 工具集买单。
挂在 preset 内则完全不同:
- 选「Apple Mode」的会话 → 26 个
mcp__xcode__*工具 + 10 个技能 + Xcode Intelligence 风格 persona,全套能力; - 其他会话 → 保持轻量,零额外负担。
这也是 DSH「一切皆插件、按需组合」哲学的实践:工具与行为跟着模式走,而不是跟着进程走。
3. 功能清单
26 个 Xcode MCP 工具(mcp__xcode__*)
| 分组 | 工具 |
|---|---|
| 工程读写 | XcodeRead XcodeWrite XcodeUpdate XcodeMV XcodeRM XcodeMakeDir |
| 检索 | XcodeGlob XcodeGrep XcodeLS |
| 目标与构建设置 | XcodeNewTarget XcodeListTemplates XcodeListTargets UpdateTargetBuildSetting``UpdateFileCompilerFlags |
| Scheme / 运行 / 测试 | XcodeListSchemes XcodeSwitchScheme XcodeListRunDestinations XcodeSwitchRunDestination``XcodeListTestPlans XcodeSwitchTestPlan |
| 诊断 | XcodeListNavigatorIssues XcodeRefreshCodeIssuesInFile |
| 本地化 | StringCatalogRead StringCatalogEdit |
| 窗口 | XcodeListWindows XcodeGetCurrentFile |
几个值得单独说的点:
- 改构建设置不用碰
pbxproj:UpdateTargetBuildSetting/UpdateFileCompilerFlags是 Xcode 官方给出的正确姿势,工具描述里直接写着「不要直接编辑 project.pbxproj」; - 诊断即上下文 :
XcodeListNavigatorIssues能拿到 Issue Navigator 里当前的问题(含 fresh/stale 状态),AI 修 bug 时不用再靠猜; - 本地化一条龙 :
StringCatalogRead能按翻译状态(未翻译/需校对/已翻译)分桶取 key,StringCatalogEdit直接写入。
10 个 Apple 平台技能
swiftui-specialist · swiftui-whats-new-27 · app-intents-specialist · app-intents-whats-new-27 · audit-xcode-security-settings · adopt-c-bounds-safety · uikit-app-modernization · modernize-tests · device-interaction · building-document-based-swiftui-applications
一个值得学习的合规设计
技能是 Apple 官方内容 (SKILL.md 里写着 "published by Apple")。直接把它们打进仓库重新分发有许可风险,所以仓库只包含我们自己的代码、配置和文档,技能由 install.sh 在用户机器上通过 xcrun agent skills export 本地生成------既保证内容最新,又零分发风险。
4. 多 Xcode 版本共存:安装时可以自己选
很多开发者机器上同时装着 Xcode.app 和 Xcode-beta.app,而 mcpbridge 只存在于 Xcode 26+ 的 Contents/Developer/usr/bin 下。插件给了三个层次的解决方案:
bash
./install.sh --list-xcodes # 列出所有含 mcpbridge 的 Xcode
./install.sh # 交互式选择(默认 xcode-select 选中项)
./install.sh --xcode /Applications/Xcode.app # 非交互指定
安装时的选择会直接渲染进 preset:默认用 xcrun mcpbridge(可移植、跟随 xcode-select),选了其他 Xcode 则写入绝对路径。
进阶场景------运行时切换、不重装:
ini
./install.sh --runtime-selectable # 安装 bin/mcpbridge 启动器
DSH_XCODE_DEVELOPER_DIR=/Applications/Xcode-26.2.app/Contents/Developer dsh web
如果想让 MCP 连接某个正在运行 的特定 Xcode 实例,还可以在 preset 里加 env: { MCP_XCODE_PID: '<pid>' }。
5. 快速开始
bash
git clone https://github.com/jihongboo/dsh-apple-mode.git
cd dsh-apple-mode
./install.sh
安装脚本做三件事:检测并让你选择 Xcode → 安装 Apple Mode preset → 本地生成 10 个技能。
使用:
- 重启
dsh(或直接新建会话------preset 只能在空白会话选择); - 建会话时选择 Apple Mode;
- 开始干活。
⚠️ 使用 MCP 工具前 :需要保证 Xcode 已启动并打开了相应的项目,并且在 Xcode 弹出的 MCP 接入对话框中点击「允许」------否则工具调用会被拒绝。这可能是新手最容易踩的坑。
如果希望所有会话都有 MCP 工具(不选模式),也有全局方案:
csharp
dsh plugin --profile web add "github:jihongboo/dsh-apple-mode"
6. 一些真实使用场景
- 修编译错误 :让 AI 先
XcodeListNavigatorIssues拿到真实错误清单,再XcodeRead定位、XcodeUpdate修复,最后XcodeRefreshCodeIssuesInFile验证------全程不用复制粘贴报错文本; - SwiftUI 新 API 迁移 :
swiftui-whats-new-27技能能处理 iOS 27 SDK 升级后@State宏化导致的「used before being initialized」这类编译错误(重排 init 是错误修法); - 本地化补全 :
StringCatalogRead拉出未翻译 key,AI 按 Apple 的引号规范批量StringCatalogEdit; - 安全审计 :
audit-xcode-security-settings技能 +UpdateTargetBuildSetting,逐步开启编译警告、静态分析器和 Enhanced Security,且每一步都有决策文档可回滚; - 新建扩展 target :
XcodeListTemplates查模板 →XcodeNewTarget创建(自动处理 bundle id 前缀、嵌入宿主 app 等规则)。
7. 需要注意的边界
- 审批边界 :MCP 工具调用不经过 DSH 的文件沙箱 ,走的是工具级审批流程------
XcodeUpdate/XcodeWrite会直接改真实工程文件(含project.pbxproj),审批时会看到对应工具名; - 构建/运行/测试仍走终端 :MCP 工具集负责工程手术和诊断,构建建议
xcodebuild管道到xcsift获得结构化输出; - 兼容性:DeepSeek Harness 处于开发者预览阶段,接口可能变化;插件本身是内容型(配置 + 脚本),不依赖 DSH 内部 API,升级风险很低。
8. 资源链接
- 仓库:github.com/jihongboo/d...(
dsh-plugin话题,MIT) - 发布:github.com/jihongboo/d...
- 收录 PR:github.com/awesome-dsh...
- 官方 DSH:github.com/deepseek-ai...
- 插件话题:github.com/topics/dsh-...
小结:dsh-apple-mode 做的事情很简单------把 Xcode 官方给出的 MCP 工具、技能和 Intelligence 提示词这三样「原材料」,用 DSH 的 preset 机制组装成一个开箱即用的模式。如果你既离不开 Xcode 的智能,又想在自己熟悉的 Agent 工作流里干活,值得一试。