同样是 Claude Opus 5.5,为什么有人用来做出 App,有人觉得它笨?
用 Claude Code 和 Opus 5.5 从零做一个 React Native + Expo 手机 App:界面被否三轮、放弃 uni-app x 和 Lynx、adb 真机测试踩坑、热更新和鸿蒙版。同一个模型,差距出在用的人身上。
同样是 Claude Opus 5.5,有人说它半天能干完一周的活,有人说它问三句错两句。
我最近用它做了一个手机 App,叫「如在」:人不在电脑前的时候,用手机查看电脑上 AI 助手的对话、给它发消息、批准它要执行的关键操作。
从产品设计、界面、代码,到 GitHub Actions 自动打包安卓 APK 和 iOS TestFlight、自建热更新、App Store 上架素材,基本都是 Claude Code 里的 Opus 5.5 做的。中间换过一次技术栈,评估过两个跨平台方案,界面被我否了三轮。
做完回头看,模型能力几乎没成为瓶颈。 同一个模型,结果好不好,差在用的人身上。这篇按项目里真实发生的事,拆成几个具体的差距。
先交代一下技术栈
| 部分 | 最后用的 | 中途试过 / 放弃的 |
|---|---|---|
| 手机端框架 | React Native 0.88 + Expo SDK 58 | uni-app x(放弃)、Lynx 4.0(小样后放弃) |
| 路由和编译 | Expo Router、React Compiler、TypeScript 6 | TypeScript 7(和 typescript-eslint 不兼容) |
| 手势和动画 | Reanimated 4.7、Gesture Handler 3.3 | |
| 打包 | GitHub Actions:安卓 APK、iOS 上传 TestFlight | |
| 热更新 | expo-updates 协议,自己的服务器托管 | |
| 鸿蒙 | ArkTS 原生版,CI 编译通过 | |
| 开发调试 | Expo Go 加真机,AI 通过 adb 直接操作手机 |
这张表里每一个“放弃”和“改用”,都是一次人和 AI 的分歧。下面一个个说。
差距一:只说“丑”,AI 只能猜三轮
第一版界面出来,我说:太丑。
第一轮,Opus 5.5 换了配色。它从网上找了三套成熟方案做进原型让我选:
| 方案 | 来源 | 主色 |
|---|---|---|
| A 暖米 | Claude 官方配色 | 陶土橙 #c96442,米白底 #faf9f5 |
| B 青绿 | Radix 的 Sage 灰 + Jade 绿 | #29a383 |
| C 靛蓝 | Radix 的 Slate 灰 + Indigo 蓝 | #3e63dd |
配色本身都很规矩,我还是觉得丑。
第二轮,它不再只换颜色,而是按 2026 年 Gemini App 的改版风格整套重做:纯白或纯黑底、去掉所有边框、大号问候语、悬浮的胶囊输入框。
这一轮它还查出一个我没想到的原因:截图本身就廉价。 效果图是在 Windows 上用无头 Chrome 截的,中文默认渲染成微软雅黑。换成思源黑体(Noto Sans SC)以后,观感一下接近手机上的 MiSans 和苹方。前两轮我嫌丑,有一部分是在嫌截图的字体。
第三轮,我觉得问题可能出在图标颜色上,干脆去掉所有渐变。它出了 6 个纯色图标方案(黑底黑体、黑底宋体、朱红印章……),最后定成纯黑底白字的“Z”。
三轮下来我才发现,自己一直只给了评价,没给方向。如果第一句就说“像 ChatGPT 那样以对话为主,黑白,不要渐变”,第一版就能接近定稿。
AI 没有审美偏好,它给你的是大量设计的平均值。 说不清要什么,就甩一张你喜欢的 App 截图,比十句“高级一点”管用。
差距二:需求文档写了什么,它就严格做什么
这个项目有两台电脑在干活:一台做服务端和手机 App,另一台做 Windows 客户端。两边的 AI 不共享记忆,靠代码仓库里的需求文档对接:协议、接口、这次要改什么,一边写完提交,另一边拉下来照着做,做完标上状态。
这套办法很好用。电脑客户端换新图标、接入手机中转,都是这边先写交接文档,那边照着就做完了。
但它也有副作用:写进文档的决定,AI 会不打折扣地执行。
有一次需求文档里把手机端技术改成了 uni-app x,Opus 5.5 就照着写了一整套 uni-app 代码,提交、修完问题,干得很漂亮。写完我才意识到,这等于把产品绑在 DCloud 一家平台上,推送、打包、热更新都离不开它,于是推倒重来,改成 React Native + Expo。
AI 不会主动问“这个选择三年后会不会后悔”。技术选型这种不可逆的决定,得人来拍板。
差距三:先让它写代码,还是先让它讲原因
后来我想试字节的 Lynx:一套代码出安卓、iOS,以后可能还有鸿蒙。Opus 5.5 很快搭出一个小样,能编译、能连服务器、能渲染对话。
但界面又丑回去了,和定稿完全不一样。
这次我没让它直接改,而是说:先不写代码,先讨论清楚为什么,再出方案,最后再写。
它给的原因很具体:
| 地方 | React Native 版 | Lynx 小样 | 原因 |
|---|---|---|---|
| 图标 | SVG 线条图标 | ☰ + ↑ 文字符号 | Lynx 默认不能显示 SVG |
| 侧边栏 | 从左滑出,占 84% 宽,带遮罩 | 整页换成列表 | 没有现成的抽屉和弹窗组件 |
| 底部面板 | 选电脑、确认详情带截图 | 没有 | 同上 |
| 整体 | 按原型一点点调出来的 | 一个小时拼出来验证可行性 | React Native 组件 Lynx 用不了,只能复用纯逻辑 |
再加上测试中发现的回归问题:Lynx 4.1.0 里 scroll-view 内的点击不触发,ReactLynx 0.128 干脆所有点击都失灵,只能退回 4.0.3 和 0.126。
原因摆出来,决定就很简单:继续用 React Native。
如果我当时说“把界面改好看”,它大概会在 Lynx 上花几个小时重调一遍,最后还是换回去。AI 写得越快,错的方向走得越远。
差距四:给它多大的权限,就要划多清楚的边界
为了真机测试,我让 AI 通过 adb 直接操作安卓手机:点按钮、输入文字、截图看结果。很多问题都是这样找出来的,电脑上的原型根本看不出:
| 现象 | 原因 | 怎么解决 |
|---|---|---|
| 键盘弹起挡住输入框 | 开了 edge-to-edge 后布局没让开键盘 | KeyboardAvoidingView 改成 padding |
| 屏幕变暗后点击没反应 | 第一下点击被用来唤醒屏幕 | 测试前先发 KEYCODE_WAKEUP |
| 侧边栏左滑手势开始就结束 | 原生 ScrollView 抢走了触摸 | 换成 Gesture Handler 的 ScrollView,再在左侧加一条 36dp 宽的透明感应区 |
| 打开长对话停在半截 | 分批排版时,代码自己滚到底也触发滚动事件,被误判成“用户往上翻了” | 只有手指拖动才改变“是否在底部”的判断 |
| adb 输入的文字没上屏 | 微信输入法拦截了输入 | 点一下候选词提交 |
但也出过状况:有一次它按了返回键,退回了手机桌面,后面几下点击直接落在微信和支付宝上。
没造成损失,但足够提醒我:只能聊天的 AI 只会说,接上工具的 AI 能自己验证,也能自己闯祸。 同一个模型,接不接工具,表现完全是两个级别;工具放开多少、在哪台设备上测、哪些应用不能碰,得提前讲清楚。
差距五:在什么环境里验收,决定你看到什么
前面截图字体的事,其实是一个验收问题:你在错误的环境里看结果,好的东西也会被嫌弃。
打包也一样。GitHub Actions 打出来的安卓包,每次签名的调试证书都不一样,装新版本就得先卸载旧版。最后把固定的 debug.keystore 提交进仓库才解决。不在真手机上装两次,根本发现不了。
App Store 上架素材更是细节堆出来的:
| 素材 | 要求的尺寸 |
|---|---|
| 标题素材 | 5244 × 2950 或 3840 × 1646 |
| 搜索结果素材 | 5244 × 2950、3840 × 2560 或 1920 × 1280 |
| iPhone 6.3 英寸截屏 | 1206 × 2622 或 2622 × 1206 |
这些尺寸 AI 一次就做对了,但截图里的示例数据,是我看了以后才让它换成中性内容的。
还有商店描述。它按我们内部真实的使用场景写,功能写得很全,但照实写很可能卡审核。这一点 AI 不知道,我知道。最后改成“手机遥控、查看电脑上的 AI 对话”这个角度,副标题是“遥控和查看电脑上的 AI”。
AI 能把事做对,但哪些事做对了反而有风险,只有做过的人知道。
差距六:你知不知道该问什么
做到后面,我问了一句:“以后界面小改动,是不是直接升级就行,不用每次都编译?”
这一句换来了整套热更新:用 expo-updates 协议,在自己的服务器上托管更新包;runtimeVersion 用 fingerprint 策略,只改 JS 的版本手机打开 App 就自动更新,动了原生代码才需要重新打包。
如果我不问,它不会主动做。不是它不会,而是它不知道这对我重要。
同样的,鸿蒙版是我问“能不能编译鸿蒙原生”才开始的。它用 ArkTS 写了一版,在 GitHub Actions 上编译通过,中间还解决了几个只有动手才知道的坑:华为的 ohpm 仓库对 GitHub 的机器经常返回 503,要加重试;imageknife 3.2.8 以上要求 API 18,只能用 3.2.7。
问题问到哪,AI 就做到哪。 会问问题的人,拿到的东西自然多。
差距七:你用的真是“同一个模型”吗
最后说一个经常被忽略的事实:两个人说“我用的是 Opus 5.5”,用到的可能根本不是同一个东西。
| 差别 | 具体是什么 |
|---|---|
| 客户端 | 网页聊天、Claude Code、各种套壳 App,系统提示词完全不同 |
| 工具 | 能不能读文件、跑终端、操作浏览器和手机 |
| 推理强度 | 思考档位、快速模式,同一个模型开高开低差很多 |
| 上下文 | 1M 上下文还是普通长度;旧对话会不会被压缩,压缩时丢了什么 |
| 线路 | 官方 API、云厂商还是各种中转,背后的版本和限制不一定一致 |
我做「如在」用的是 Claude Code:能读写整个代码仓库、跑命令、调 adb、调 GitHub。拿它和网页上一问一答的体验比,本来就不公平。
写在最后
把这七个差距放在一起:
| 用着“笨” | 用着“聪明” | |
|---|---|---|
| 审美 | 只说“丑” | 给参考截图,说清不要什么 |
| 需求文档 | 写了就当定了 | 不可逆的决定自己拍板 |
| 顺序 | 一上来就写代码 | 先讲原因和方案 |
| 工具权限 | 不给,或者全放开 | 给工具,同时划边界 |
| 验收 | 在电脑上看截图 | 在真机、真实字体、真实数据下看 |
| 提问 | 等它主动想到 | 自己知道该问什么 |
| 工位 | 只看模型名字 | 看客户端、工具、档位、线路 |
整个项目里,代码基本都是 Opus 5.5 写的,但每一个转折点都是人做的决定:放弃 uni-app x、不用 Lynx、去掉渐变、改商店文案、加热更新。
所以下次觉得 AI “降智”了,先别急着换模型。回头看看自己给它的那份工作说明,是不是本身就不太聪明。
更偏技术的做法,比如检索、上下文整理、推理预算和验证,我在《想让 AI 更聪明,先别急着换模型》里写过,可以一起看。
如果你也在用 Claude Code 或别的 AI 做自己的产品,欢迎来聊:linktr.ee/weiyii