没人会告诉你:当 AI 说“完成”之后,真正的工作才开始
我第一次做 iOS App,而且完全不懂 Swift。Claude Code 一个晚上把骨架全搭好了。然后我打开 Simulator,真正的工作才正式开始。
我这辈子从来没打开过 Xcode。
我不懂 Swift,不懂 SwiftUI,不知道 @Observable macro 是干嘛的,也不明白为什么 AVAudioSession 还要设置 category。两天前如果你问我 StoreKit 是什么,我大概率会猜它是个卖家具的 App。
但现在我正在做一个原生 iOS App,而且我越来越确定:AI 生成代码最多把你带到 60%。最后那 40%,也就是让代码库真正变成“产品”的那部分,完全是人类工作。 这才是所有“我用 AI 做了 X”帖子很少提到的部分。
这个 App 是为 DIALØGUE 做的,也就是我的 AI 播客生成器。不是 web wrapper。不是 React Native。是一个真正的 SwiftUI App,包含 Apple Sign-In、应用内购买、带锁屏控制的音频播放器,以及 7 种语言本地化。
为什么是现在?
2 月 3 日,Apple 宣布 Xcode 26.3 支持 agentic coding,并且内置了 Anthropic 的 Claude Agent SDK。这不是自动补全,也不是一步步建议,而是完整自治代理:它能探索你的项目结构、搜索 Apple 文档、抓取 Xcode Previews 看自己做出来的 UI、并且自己循环 build 和修复。
Claude Code 现在可以通过 MCP 和 Xcode 对话。它能看到 Simulator,能读 build warning 和 error message,还能看真实 UI 长什么样,再决定要不要改。
这件事直接改变了我的决策模型。我几个月前就想做原生 iOS App,但一直拖着,因为我不会 Swift。有了 Xcode 里的 Claude Agent 之后,问题就从“我能不能足够快学会 Swift?”变成了“我能不能足够清晰地描述我要什么?”
它还没做完。我还在最后打磨阶段,还在不断发现不对劲的地方,还在通过阅读 Claude 给我写的代码学习 Swift。但到目前为止,这个过程和我之前的14 天重建 DIALØGUE一样,再次把同一个不太舒服的现实摆在我面前。
Claude Code 一个晚上到底做出了什么?
我的 git history 大概是这样的:
| 阶段 | 发生了什么 | Commits |
|---|---|---|
| 设计文档 + 实施计划 | 架构决策、12 个任务 | 2 |
| Claude 构建“整个 App” | Scaffold → auth → library → detail → studio → StoreKit → accessibility | 6 |
| 人类打开 Simulator | 修复、测试、重设计、修复、测试、重设计 | 12+(还在增加) |
第一阶段,也就是 Claude Code 把整套 App 框架搭起来,确实非常惊艳。一个晚上,我就从空的 Xcode project 到一个可编译 App,里面有:
- Apple Sign-In、Google OAuth、邮箱/密码登录和 MFA
- 5 步播客创建向导
- 支持搜索和下拉刷新的播客库
- 基于
AVPlayer的音频播放 - StoreKit 2 应用内购买 + 服务端校验
- Studio(常驻节目管理)
- 7 种语言本地化
- Blog webview 和 accessibility labels
69 个 Swift 文件,7,568 行代码。里面我亲手写的大约是 0 行。
这正是绝大多数 AI 博文会结束的地方。 一张“胜利截图”,一句“看我做出来了”,再配上 commit 数、代码行数、和一个按常理不可能的时间线。
但我当时并没有一个 App。我只有一个“能编译的代码库”。
真正使用 App 的时候,哪里坏了?
我点来点去。页面能加载。有些界面看起来还不错。我当时想:“也许这次真的可以了。”
然后我去创建一个播客。
“Done” 按钮会把你的修改吃掉
脚本编辑器支持你在生成音频前编辑每一条对话。有个“Done”按钮。我改了一行,点 Done,然后……修改没了。
这个按钮先退出编辑模式,再保存。代码看起来“逻辑正确”——editMode = false——但顺序反了。应该先保存,再退出。
这类 bug 会直接让用户砸手机。AI 会写出这种问题,是因为逻辑在技术层面“说得过去”,只是用户体验顺序完全反着来。
一上真实数据就崩
我打开一个来自生产后端的播客。直接 crash。research_facts 返回的是对象数组({fact, source, reference, confidence}),但 Swift model 期待的是字符串数组。其他地方也一样:状态枚举大小写敏感(completed vs COMPLETE),结果所有状态徽章都显示 “Unknown”。
Claude 是按设计文档来建的。生产数据库不这么配合。这种问题你只会在“真实数据”下发现,不会在假数据里暴露。
Realtime WebSocket 就是……连不上
在 Web 上,Supabase Realtime 很稳。在 iOS 上,WebSocket 静默失败。没报错,没崩溃,就是……不更新。
我最后用了“保险带+吊带”方案:Realtime 订阅继续保留,同时加一个每 5 秒轮询的 fallback,不管怎样都跑。它不优雅,但可靠。移动网络本来就不稳定,用户不会在意你“怎么”更新状态,他们只在意状态有没有更新。
整个 App 都是系统默认配色
所有界面都是 iOS 默认蓝灰色,还是 Light Mode。Web 端其实有完整设计过的 Dark Mode 美学——木炭底色上的琥珀金色,我叫它 “Studio Warmth”。Claude 很认真把所有页面做出来了,但颜色全是系统默认值。
我不得不改 24 个 view 文件。把每一个 Color.accentColor 换成 Theme.brandPrimary。然后在根节点强制 .preferredColorScheme(.dark)。
这不是 bug。AI 做的是“合理默认”。但“合理”不等于“好”。
Outline Review 只剩一个“Approve”按钮
播客生成流程里有一个交互阶段:AI 会先生成 outline,让你确认后再继续。Web 端是可展开卡片,能看每一段的描述、talking points 和 research sources。
而 iOS 上,Claude 给我做的是一个写着 “Approve” 的按钮。就这样。没有 outline 内容,没有办法知道自己在批准什么。script review 也是一样——只有按钮,没有编辑器。
音频根本播不起来
播放器 UI 看起来没问题。播放键、进度条、锁屏控制全有。但你点播放,什么都不会发生。URL 解析链坏了:开发环境里的签名下载 URL 会失败,fallback URL 又用了 Simulator 解析不了的内部 Docker hostname。
我把音频播放修好,并且重做了播客详情页,把播放控制整合进去后,原先每个 tab 底部常驻的 mini player bar 反而成了冗余。我直接删了。删掉“能工作但不该存在”的代码,这完全是人的判断。
AI 生成代码 和 真产品,到底差在哪?
AI 生成代码在架构上可以很靠谱,但在体验上往往很空。 我不是在抱怨——Claude Code 做到的事情真的很厉害。从“我不会 Swift”到一个可编译 App,里面有 auth、IAP、音频播放、7 语言本地化,而且只用一个晚上?如果没有它,我可能要花几个月。
但现在有一种叙事——博客、推文、Demo 视频里都在讲——AI 把 App 写好,你 review 一下,直接 ship,完事。
真实情况不是这样。真实情况是:
-
Claude 先搭了一个架构扎实的骨架。 我决定走 Supabase-direct(不加自建 API 层),意味着 iOS 和 Web 用同一套后端。Auth、database、realtime、storage 全复用。服务端我只新增了一个组件(
verify-ios-purchaseEdge Function)。这个架构选择非常关键,省下了大量时间。 -
Claude 把“难 API”部分做对了。 Apple Sign-In + CryptoKit nonce,StoreKit 2 购买流 + 服务端校验,
AVAudioSession后台播放配置。这些如果我自己啃文档,很可能要几天。 -
Claude 把“产品感”部分做错了。 不是“bug 那种错”,而是“这像代码库,不像产品体验”那种错。
| Claude 做出的东西 | 实际需要的东西 |
|---|---|
| 一个写着 “Approve” 的按钮 | 可展开 outline reviewer,带 research sources |
| 所有页面用系统默认配色 | 24 个文件的品牌 token + 强制 dark mode |
| 按文档 schema 写的 JSON decoder | 能吃下数据库真实返回值的自定义 decoder |
| Realtime 订阅(web 思路) | Realtime + polling fallback(mobile 思路) |
| 一个“功能上可用”的创建向导 | 一个真正适配手机屏幕的创建向导 |
左边是“正确代码”,右边才是“产品”。
我们应该怎么告诉下一代 AI 时代的孩子?
几周前我写过一篇文章(链接),提到我有个十几岁的女儿,我并不确定该怎么告诉她未来该怎么准备。执行型技能正在被自动化,而“我能独立思考”的门槛在不断抬高。
这次做 iOS App,让这个问题更尖锐了,但方向和我预期不一样。
实现层技能——Swift 语法、SwiftUI 布局、StoreKit API——我几乎没用上。Claude 都能处理。如果“学编程”还只是“学一种语言的语法和 API”,这个建议的保质期按月算,不按年算。
但我真正需要的是:产品品味、设计判断力,以及“真的打开 Simulator 去用”的纪律,而不是只看代码审阅结果就相信它。
这不只是“品味”。它本质上是批判性思维——真正的那种,不是口号版。那种你面对一个能编译、能过测试、AI 还信誓旦旦说“已经完成”的系统时,仍然能说:“不,这不对。我告诉你为什么不对。”
这部分现在还外包不了。也许以后也外包不了。AI 在“生成方案”上非常强,但在“识别那种日志里看不出来却会毁体验的问题”上非常弱。它不会真的使用你的产品。它不会把手机拿在手里。它不会感受到 Done 按钮吃掉你编辑内容的那种挫败感。必须有人掌舵。必须有人持续在回路里。必须有人给出那个关键判断:这东西能跑,但它不够好。
也许这才是我该对女儿说的话。不是“去学编程”,因为窗口在收窄;也不是“去学批判性思维”,因为太抽象。更具体一点:
学会成为那个会打开 Simulator 的人。
做那个拿真实数据测真实体验、在用户之前发现问题的人。通过体验好产品和烂产品建立品味,并且真正理解二者差别。培养在“技术上正确、体验上错误”的情况下提出反对意见的自信——哪怕和你争论的是一个语气非常笃定的 AI。
Human in the loop 不是流程装饰,它就是产品本身。
我仍然不确定这是不是“足够”的答案。但这是我目前能给出的最具体答案。
这个 iOS App 现在进度如何?
App 还在开发中。我现在处于打磨阶段——也是 AI 博文最喜欢假装不存在的阶段。用生产数据逐页测试,去挖那些只有真正使用时才会冒出来的边缘问题。
我过去两天的 git log 里,fix: commit 比 feat: commit 还多。这很合理。feature 很快,fix 才是产品。
当前状态如下:
| 已完成 | 剩余工作 |
|---|---|
| Auth(Apple、Google、email、MFA) | PDF 上传(document picker + Supabase Storage) |
| 5 步创建向导(完整可配置) | 离线 MP3 下载 |
| 播客详情页(含 outline/script review) | Push 通知(延期到 v1.1) |
| 音频播放 + 锁屏控制 | TestFlight beta 分发 |
| StoreKit 2 应用内购买 | App Store 提交 |
| Studio(常驻节目) | |
| 7 语言本地化 | |
| Studio Warmth 设计系统 |
等它上架 App Store 我会写后续。或者被拒之后再写。以 Apple 的风格看,被拒的故事可能更有意思。
AI 开发速度到底加速到了什么程度?
我再更新一次那张让我一直有点不安的表:
| 项目 | 复杂度 | 构建时间 |
|---|---|---|
| DIALØGUE v1 | MVP 播客生成器 | ~6 个月 |
| STRAŦUM | 10 个 AI agents、11 个框架、多租户 | 75 天 |
| 站点重设计 | WordPress 前端 overhaul | 3 天 |
| DIALØGUE v2 | Web App 全量重建 | 14 天 |
| Blog migration | WordPress → Next.js,490 篇文章,Sydney RAG | 4 天 |
| DIALØGUE iOS | 原生 iOS App,第一次用 Swift | 仍在进行中——但 scaffold 只用了一个晚上 |
我脑子里其实又多了一列:“Claude 的时间” vs “我的时间”。这个比例一直在变。Claude 那部分越来越短。我的那部分基本没变。(我在4 天重建博客后端时也看到同样模式:迁移很快,但后面那8 天持续打磨才是真正把产品做出来的关键。)
而且工具还在快速进化。2 月 3 日 Apple 和 Anthropic 公布 Xcode + Claude Agent SDK 集成时,那不只是一次 PR。它实质上改写了可能性边界。Claude 现在能看 Simulator、读 build error、抓 Preview、做可视化迭代——也就是 iOS 开发里最难的人类闭环,现在正变成 AI 的原生能力。
公告发布两周后,我就在“不会 Swift”的情况下开始做 iOS App。这不是巧合。
下一个这样做的人,甚至不需要写篇博客来解释这件事。它会变成……常态。这就是从内部看“加速”的感受:每个里程碑都比上一个更不稀奇,但你客观走过的距离还在不断变大。
这才是没人告诉你的部分。AI 越来越快,人类那部分还没变快。至少现在还没有。
常见问题(FAQ)
不会 Swift,真的能靠 AI 做出 iOS App 吗?
可以。Claude Code 在一个晚上就搭出了 69 个 Swift 文件、7,568 行代码,包含 Apple Sign-In、StoreKit 2 应用内购买、音频播放和 7 语言本地化。但这里的“做出来”需要打引号。AI 给你的是“可编译代码库”;要变成真正能上线的产品,还需要大量人工测试、设计判断和真实数据调试。
Xcode 26.3 + Claude Agent SDK 具体改变了什么?
2026 年 2 月 3 日发布的这套集成,让 AI agent 可以探索项目结构、搜索 Apple 文档、抓取 Xcode Preview、查看 Simulator、读取构建错误并自治迭代。对不会 Swift 的开发者来说,这改变了问题本身:从“我能不能学会语言”变成“我能不能把需求描述清楚”。
一个 AI 做出来的 App,到底还有多少必须人来做?
按我的经验,大约 60% 是 AI:架构、模板、复杂 API 对接。剩下 40% 是产品工作:修真实数据才会出现的 bug、重做“能用但不好用”的界面,以及决定哪些东西该保留、哪些该删除。产品真正活在这 40% 里。
和 AI coding agent 协作时,最重要的能力是什么?
产品品味、设计判断力、批判性思维。实现层技能(语法、API、框架)越来越多由 AI 处理。你外包不了的是:拿真实数据测真实产品、看出哪里不对,并且能对“技术上正确但体验上错误”的方案说不。
DIALØGUE iOS App 现在能在 App Store 下载了吗?
还不行。它仍在开发中,处于最后打磨阶段。我还在用生产数据逐项测试,并修复只有真实使用才会出现的问题。等它上架(或被拒)我会写下一篇更新。
还在做。还没完。也还在持续思考,该怎么跟我女儿谈这个时代。







