Skip to content
··阅读时间4分钟

没人会告诉你:当 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 → accessibility6
人类打开 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 做的是“合理默认”。但“合理”不等于“好”。

DIALØGUE iOS app podcast detail page with Studio Warmth dark theme showing amber radial glow header and integrated audio controls
这是做完 Studio Warmth 之后的播客详情页:琥珀色光晕、深色主题、整合播放控制。这些在 Claude 最初的 scaffold 里都不存在。

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,完事。

真实情况不是这样。真实情况是:

  1. Claude 先搭了一个架构扎实的骨架。 我决定走 Supabase-direct(不加自建 API 层),意味着 iOS 和 Web 用同一套后端。Auth、database、realtime、storage 全复用。服务端我只新增了一个组件(verify-ios-purchase Edge Function)。这个架构选择非常关键,省下了大量时间。

  2. Claude 把“难 API”部分做对了。 Apple Sign-In + CryptoKit nonce,StoreKit 2 购买流 + 服务端校验,AVAudioSession 后台播放配置。这些如果我自己啃文档,很可能要几天。

  3. Claude 把“产品感”部分做错了。 不是“bug 那种错”,而是“这像代码库,不像产品体验”那种错。

Claude 做出的东西实际需要的东西
一个写着 “Approve” 的按钮可展开 outline reviewer,带 research sources
所有页面用系统默认配色24 个文件的品牌 token + 强制 dark mode
按文档 schema 写的 JSON decoder能吃下数据库真实返回值的自定义 decoder
Realtime 订阅(web 思路)Realtime + polling fallback(mobile 思路)
一个“功能上可用”的创建向导一个真正适配手机屏幕的创建向导
DIALØGUE iOS creation wizard showing voice customization with speed and pitch sliders in dark theme
这是经过人工介入后的创建向导:语速/音高滑杆、可折叠分区,且完整适配手机屏幕。

左边是“正确代码”,右边才是“产品”。


我们应该怎么告诉下一代 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 v1MVP 播客生成器~6 个月
STRAŦUM10 个 AI agents、11 个框架、多租户75 天
站点重设计WordPress 前端 overhaul3 天
DIALØGUE v2Web App 全量重建14 天
Blog migrationWordPress → Next.js,490 篇文章,Sydney RAG4 天
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 下载了吗?

还不行。它仍在开发中,处于最后打磨阶段。我还在用生产数据逐项测试,并修复只有真实使用才会出现的问题。等它上架(或被拒)我会写下一篇更新。


还在做。还没完。也还在持续思考,该怎么跟我女儿谈这个时代。


继续阅读

我的旅程
联系
语言
偏好设置