"帮我写个APP"——如果你真的对AI说过这句话,大概率收到的是一堆代码片段,然后你发现自己根本不知道把它放哪儿。这不是AI不行,而是你还没进入正确的VibeCoding节奏。
VibeCoding这个词最近在开发圈里很火,它描述的不是什么玄学,而是一种全新的写代码方式:你不再逐行敲代码,而是用自然语言把需求、约束、验收标准讲清楚,让AI负责生成代码,你负责判断方向、验证结果、修补偏差。说白了,就是从"打字员"变成"甲方",从"写代码"变成"审代码"。
这篇教程不绕弯子,直接带你把"AI编程出双端APP"这件事完整走一遍:工具怎么选、提示词怎么写、项目怎么从零跑起来、安卓和iOS两个平台最后怎么打包上架。不管你是完全没写过代码的新手,还是想提效的老开发,这套流程都能直接复制到自己的项目里。
1. 搞懂VibeCoding:它不是"躺平式写代码",而是"意图驱动开发"
1.1 一句"帮我写个APP"为什么不够用
绝大部分人第一次尝试AI编程,都是开篇那句"帮我写个APP"。AI会礼貌地回一段代码,你复制到本地之后,大概率启动失败。原因很简单:这句话缺少上下文,没说是安卓还是iOS、没说需要什么功能、没说用什么框架、没说你自己的环境是什么。放到真实开发场景里,这就相当于给外包团队说了句"做个软件"然后就等交付,项目不跑偏才怪。
VibeCoding真正能用的姿势,是把AI当成一个"反应极快但需要你带节奏的初级工程师"。你要给足信息,它才能干对活。需要哪些信息?至少包括:产品形态(APP、小程序还是网页)、目标用户和核心场景、主要功能模块和优先级、运行平台和框架约束、UI风格偏好。
我平时最常用的需求描述模板是这样的:
我要做一个潜水日志APP,运行在安卓和iOS双端。用户可以新建一条日志,填写潜水地点、日期、深度、时长、水温,可以上传水下照片。主页按时间线展示所有日志,详情页展示单条日志的完整信息,统计页展示累计瓶数和总深度。要求用Flutter开发,数据保存在本地,使用SQLite,UI风格偏简洁、蓝白配色。
这段描述AI一眼就能听懂。里面有平台、有功能、有数据字段、有技术栈、有UI风格,信息密度足够高。你会发现,AI编程第一步根本不是学编程,而是学会"把需求说清楚"。
1.2 懂语法不再重要,懂逻辑成了新门槛
很多新手怕AI编程,是因为觉得自己不懂编程逻辑。但你去看那些用AI做出过完整APP的人,他们其实也不太会手写代码,真正拉开差距的不是代码能力,而是"系统该怎么拆"的判断力。
举个例子,你说"给APP加个提醒功能",AI可能会给你生成一个本地通知的页面和代码。但这背后有一连串隐藏逻辑:用户是否授权通知权限?拒绝之后怎么办?提醒时间是固定还是可设置的?用本地通知还是服务端推送?数据存哪里?这些如果全部交给AI自由发挥,它会把一个简单功能变成一团乱麻。
VibeCoding的过程里,你要做的是"架构判断"和"验收兜底"。AI生成代码之后,你要能回答几个问题:这个页面是不是用户要的?这个数据流是否合理?有没有明显的崩溃点?你不必读懂每一行,但必须看懂大概流程。这也是我为什么推荐新手从"工具型APP"入手,别一上来就做社交产品——工具型APP业务逻辑线性、数据简单、边界清楚,AI完全罩得住。
1.3 当前VibeCoding工具矩阵:不是越多越好
从我实际用下来的体验,VibeCoding工具大致分成三派:
- 对话式AI助手:适合做整体规划、需求拆解、给思路、给代码片段。优点是理解能力强、上下文长,缺点是不了解你本地项目的全貌。
- AI编辑器:适合直接在项目里改代码。它能把整个项目作为上下文,你说"给登录页加个手机号校验",它直接改文件,效率极高。
- 命令行编程Agent:适合自动化任务,能批量读文件、跑测试、改代码,但对新手的学习曲线稍陡。
我的建议是:新手先用对话式AI助手完成"项目蓝图",然后用带AI的编辑器打开项目做具体迭代。别一下装五个AI工具,工具越多上下文越分散,反而容易乱。
| 工具类型 | 代表 | 适合干什么 | 适合谁 |
|---|---|---|---|
| 对话式AI | ChatGPT、Claude、通义千问、Kimi、豆包等 | 需求拆解、技术选型、代码方案设计 | 新手、规划阶段 |
| AI编辑器 | Cursor、GitHub Copilot、通义灵码插件等 | 对照项目改代码、补功能、查报错 | 有一定项目基础的人 |
| 命令行Agent | Claude Code、Codex等 | 自动化批量修改、跑测试、重构 | 熟悉终端的老手 |
2. 为什么我做双端APP不选"原生双写",而是选一个跨端框架
2.1 原生开发的现实成本,个人开发者扛不住
如果你去搜"开发一个app并上架大概要多少钱",会发现报价高得离谱。其中一个核心原因就是双端要写两套代码:安卓用Kotlin,iOS用Swift,两套工程、两套UI、两套测试,本质上做了两个APP。对个人开发者来说,这个工作量几乎不可承受。
有了AI编程,双端并行的成本虽然降下来不少,我仍然不建议直接双写。原因很简单:你要维护两套代码库,AI在两套代码之间来回切换,改一个功能要改两遍,出问题的概率翻倍。跨端框架让你写一套代码,打包成安卓和iOS两个APP,维护成本瞬间降下来。这才是个人开发者的正确姿势。
2.2 Flutter、React Native、uni-app,到底怎么选
我实际用过的跨端方案有三个,简单说说感受。
Flutter是当前很主流的跨端框架,UI绘制不走系统原生组件,而是自己渲染,所以双端表现高度一致,动画流畅。它对AI非常友好,因为Flutter的组件树结构特别清晰,AI生成的代码通常能直接编译通过。缺点是包体偏大,首次安装包大概20MB起步。
React Native是把JS桥接到原生组件,生态大、社区资料多,但桥接层一旦出问题,报错信息很难查。AI写RN代码时经常写出依赖原生插件的新功能,导致配置复杂,对新手不友好。
uni-app是国内团队推出的框架,用Vue语法,最大的优势是一套代码可以同时编译到APP、小程序、H5,国内很多中小团队在用。如果目标是中国应用商店加小程序双栖,uni-app是效率之选。对AI来说,uni-app的资料多、示例多,生成质量也算稳定。
我的建议很直接:更看重双端UI一致性、颜值的,选Flutter;要同时覆盖小程序、快速验证业务的,选uni-app;RN目前不推荐新手作为VibeCoding的起点。
2.3 AI编程在这套方案里到底"写什么"
技术栈定了之后,AI在项目里的分工就很清楚了。我用Flutter举例,AI典型负责这几部分:
- 从零搭项目骨架:跑命令创建工程、配置依赖。
- 生成UI代码:每个页面的布局、组件、样式都由AI按你的描述生成。
- 编写数据层代码:本地数据库的表结构、增删改查方法、状态管理。
- 排查报错:把编译错误、运行日志粘贴给AI,它定位问题的速度通常比人肉搜快得多。
- 处理零碎配置:安卓的Gradle配置、iOS的Info.plist设置、权限声明,这些问AI效率极高。
你本人负责的是:决定功能优先级、验证每一步生成结果、在AI跑偏时把方向盘掰回来。这是很舒服的分工,后面实操环节我会完整演示一遍。
3. 实操前夜:先把需求和方案在对话里对齐,再动手
3.1 精确的需求描述是怎么写出来的
很多人在需求文档里总想写"全",我建议反过来,小步快跑。第一次给AI的需求不用覆盖所有功能,先描述一个"最小可用版本":核心场景是什么,必须能完成哪几件事,其他都算迭代。
我这篇以"运动打卡APP"为例,逐步演示。第一次对话,我给AI这样一段:
我想做一个运动打卡APP,支持Android和iOS。第一个版本只做三件事:
- 首页可以打卡:选择运动类型(跑步/游泳/骑行),填写时长和公里数,保存到今天
- 日历页可以查看每个月的打卡记录,有打卡的天显示一个小圆点
- 统计页可以查看本月打卡天数、总时长、总公里数 要求:用Flutter开发,数据存本地(SQLite),UI走Material Design风格,主题色用绿色。先不要登录、不要云端同步、不要社交功能。
这段描述的价值在于:给了完整功能清单,也给了"非目标"(明确不要什么)。AI接收到之后,会先给出一个整体方案建议。这一步特别关键——你不急着要代码,而是先让AI讲清楚它准备怎么实现。
3.2 让AI做"项目架构师":先方案,后代码
给完需求之后,我一般不马上说"开始写代码",而是追加一段:
请根据上面的需求,先不要写代码,帮我做三件事:
- 列出这个APP的页面清单和每个页面的核心组件
- 设计本地数据库的表结构(表名、字段名、类型)
- 推荐Flutter项目里需要用到的第三方依赖包,并解释每个包的作用
AI一般会产出这样一份方案:
页面清单:
- 首页(打卡页):运动类型选择、时长输入、公里数输入、打卡按钮、今日已打卡状态
- 日历页:月视图、打卡标记、点击日期查看当天记录
- 统计页:本月汇总卡片、打卡天数列表
数据库表:
- workout_record(id, sport_type, duration_minutes, distance_km, record_date, created_at)
依赖包:
- sqflite:SQLite数据库操作
- intl:日期格式化
- table_calendar:日历组件
- fl_chart:图表展示
这里有个核心经验:让AI在写代码之前先给你方案,能规避80%的返工。方案是你验收逻辑的第一道关卡,确认数据表设计合理、页面流程顺畅之后,再让它动手写代码。如果方案不对,改方案的代价远低于改代码。
3.3 搭好本地开发环境,这步别让AI替你决定
不管AI多强,开发和打包还是要在你电脑上完成。双端开发的最小环境如下:
- Flutter SDK(如果走Flutter路线)
- Android Studio(用于安卓打包和模拟器)
- Xcode(只在macOS上可用,用于iOS打包,Windows无法打包iOS应用,这点要提前知道)
- 一个支持AI功能的编辑器,推荐Cursor这类,或者普通编辑器配AI插件
很多教程会劝你先装一堆工具,其实按Flutter官方文档装完SDK和编辑器就能开始。第一次跑flutter doctor,看到所有检查项都是绿勾,环境就算就绪。如果哪一项不是绿色,直接把flutter doctor的完整输出丢给AI,它通常能准确告诉你缺什么、怎么补。这一步也是AI编程的高频使用场景:环境配置类的报错,AI几乎是秒懂。
4. 核心实战:我和AI一起把"运动打卡APP"从零做出来
4.1 第一步:让AI生成可运行的项目骨架
在AI给出架构方案后,下一步是生成项目骨架。这里有两种路径:
- 路径A:先自己用命令创建Flutter项目(flutter create sports_app),然后把项目里的核心文件交给AI逐个生成。
- 路径B:直接让AI生成整个项目需要的所有文件内容,你手动覆盖到本地。
我个人推荐路径A。Flutter的命令行创建工程是标准操作,稳定可靠;AI直接生成完整工程有时候会有文件遗漏或目录结构不标准,反而麻烦。先运行:
flutter create sports_app创建好之后,用AI编辑器打开这个项目。然后给AI发提示词:
请帮我在lib/main.dart里实现一个带底部导航的APP框架,包含三个页面:今日打卡、日历、统计。底部导航用Material风格。当前先实现框架和页面占位,不用写具体业务逻辑。
这个提示词好在它非常具体:指出了文件路径、实现边界(先占位,不写业务)。AI给的代码一般可以直接替换进去,然后运行 flutter run,APP有了三个Tab可以切换。这个小成功会给你很大的信心,而信心在VibeCoding里的价值被严重低估了——你越有信心,越敢指挥AI干大的。
4.2 第二步:逐个页面填充功能
框架通了之后,开始填核心页面。仍然是"一次只做一个功能"的策略。
做首页打卡功能时,我这样给提示词:
在今日打卡页面实现打卡逻辑:
- 运动类型用三个卡片横向展示:跑步、游泳、骑行,选中时高亮
- 时长用数字输入框,单位分钟
- 公里数用数字输入框,保留一位小数
- 点击"保存打卡"按钮,将记录写入SQLite,写入成功后弹出一个提示,并更新页面上"今日已打卡"的显示
- 如果今天已经打过卡,再次保存时提示"今天已完成打卡"且不重复写入 请给出完整的 lib/pages/home_page.dart 代码,并说明需要import的包。
这一段的亮点在第五条,即业务规则。AI默认不会想到"防止重复打卡",你需要把这种细节显式地告诉它。这也是我一直强调"懂逻辑比懂语法重要"的具体体现。
生成代码后,需要同步处理数据库工具类,我会继续追加提示词:
请创建一个lib/services/database_helper.dart,封装SQLite初始化,提供插入打卡记录、查询今日记录、查询某月全部记录的方法。表结构按之前设计的workout_record来。
两步走完,数据库层和页面层就都齐了。运行一遍,首页打卡已经能真实写入数据,日历和统计页面暂时显示占位,不影响整体跑通。
4.3 第三步:拿报错直接"喂"AI,排查效率翻倍
跑代码不可能一帆风顺。我印象最深的一次,是在安卓模拟器上跑起来之后,页面一打开就闪退,日志里有一行"Unhandled Exception: MissingPluginException(No implementation found for method...)"。这个报错在Flutter项目里很典型,通常是插件在安卓上没正确注册导致的。
以前遇到这个问题,人肉搜报错怎么也得折腾一阵,现在直接复制完整日志丢给AI:
我的flutter项目在模拟器上运行时闪退,完整日志如下:粘贴日志。请分析原因并告诉我怎么修复。
AI很快给出方案:这种插件未注册问题,建议先执行 flutter clean,删除build目录,再重新flutter run,让插件的原生代码重新编译注册。我照做,问题消失。
这个案例说明一个关键点:AI编程的排错模式已经变成"贴日志、拿方案"。日志越完整、越原始,AI的定位越准。千万注意:不要把报错的第一行单独丢给AI,要把完整日志全部贴过去,上下文越完整答案越靠谱。
4.4 第四步:跑通本地存储之后,继续加功能和调UI
第一个版本的三件事做完之后,接下来的迭代节奏完全看你的需求。我继续讲几个高频场景。
场景一:日历页。提示词:
在日历页用table_calendar实现月视图。数据从数据库读取当月所有打卡记录,有打卡的日期用绿点标记。点击某天时,下方列表展示当天的记录(运动类型、时长、公里数)。请给出完整代码。
场景二:统计页。提示词:
在统计页展示三个卡片:本月打卡天数、本月总运动时长、本月总公里数。数据从数据库聚合查询。再加一个简单的柱状图,用fl_chart展示最近7天打卡时长的趋势。请给出完整代码。
场景三:全局主题。提示词:
请把项目的主题色改成绿色系,背景改成浅灰白,AppBar用白色底黑色标题,整体风格走简洁运动风。修改main.dart即可。
你会发现,AI编程的日常就是"提需求—收代码—跑起来—验证—再提需求"的循环,每个闭环都很快。这种即时反馈是传统开发很难给的,也是VibeCoding会上瘾的原因。
5. 双端落地:安卓打包、iOS上架,每一步都写给你
5.1 安卓端:从APK到应用商店
功能在模拟器上跑稳后,开始正式打包。安卓打包的流程是固定的:
- 生成签名文件。用keytool命令生成一个.jks签名文件:
keytool -genkey -v -keystore release.jks -keyalg RSA -keysize 2048 -validity 10000 -alias release在项目里配置签名信息。可以把签名写到key.properties文件里,Gradle构建时读取。这几行配置可以让AI帮你写,但密钥文件路径要对。
执行
flutter build apk --release打出正式包。也可以执行flutter build appbundle生成.aab格式,用于Google Play上传。
国内的应用商店(华为、小米、OPPO、vivo、应用宝等)上架时,一般需要准备:应用签名、隐私政策网址、软件著作权证书。有的商店先让你软著后补,有的必须提前准备,具体看每个商店的规则。
这个环节新手最容易栽的坑是"丢了签名文件"。如果你已经上架了第一版,以后更新必须用同一个签名,换签名会导致"签名不一致无法覆盖安装"。强烈建议:keystore文件多处备份,密码单独记录,别放在项目目录里,更别传给AI。
5.2 iOS端:TestFlight是个人开发者的最佳拍档
iOS和安卓最大的差别在于:打包必须用macOS上的Xcode,而且需要99美元一年的Apple开发者账号。这两条不具备的话,iOS上架这步走不了,这是平台规则决定的,不是AI能帮你绕过的。
流程大概是:
- 在Apple Developer后台创建App ID,把需要的能力(如推送、支付)勾选好。
- 用Xcode打开Flutter生成的ios目录,配置Bundle Identifier和签名Team。
- 选择Device作为目标机型,执行Archive导出IPA。
- 上传到App Store Connect,先走TestFlight内测,再提交审核。
TestFlight是个好东西,它允许你先把APP分发给最多100名内部测试者,让真实设备提前找问题。这比直接提审稳妥得多。我个人的习惯是:任何修改在TestFlight上跑一周,确认没崩溃了再提审。
5.3 上架审核:常见的被拒原因与对策
审核被拒很常见,分享几个我反复遇到的点:
- 权限描述不完整。比如APP申请了相机权限,但iOS的Info.plist里缺少用途说明,苹果直接拒。对策是只申请真正用到的权限,并在系统要求的位置写清用途。
- 安卓商店要求隐私政策。只要APP涉及用户信息,哪怕只是头像昵称,商店基本都要求提供隐私政策链接。
- 占位内容未清理。测试数据、调试按钮、"TODO"字样出现在应用里,会被商店以"应用不完整"打回。
- 功能与描述不符。商店审核员会逐一核对你的功能说明。AI生成代码很快,但功能描述别夸大。
这些问题AI帮不了你,因为它不懂你产品对外承诺了什么。上架前的自查清单建议你手写一份,对着过一遍再提交,比自己焦虑地等审核结果强得多。
6. 踩坑实录:AI编程翻车的5个典型场景与我的兜底方案
6.1 环境版本不一致:AI写的是新版本,你装的是老版本
我见过太多人说"AI生成的代码我跑不起来",最后发现是版本问题。AI训练数据里的代码可能基于最新SDK,但你本地装的是几个月前的版本,API早就变了。
解法是:在项目里固定版本号,把pubspec.yaml(Flutter)或package.json(RN)展示给AI,让AI在当前版本约束内写代码。更进一步,可以在提示词里加一句:"请只使用Flutter稳定版API,不要使用实验特性。"这样生成的代码在你自己环境里才能编译通过。
6.2 AI会一本正经地"幻觉"出不存在的库或API
AI的知识广,但偶尔会编造。比如它告诉你"用某个包,功能完美",你去官方仓库一搜根本没有。应对方法有两个:
- 让AI给出第三方包的真实名称,并要求"必须是官方仓库上存在的包"。
- 每引入一个新依赖,先让AI解释它的出处和用法,确认无误再安装。
AI通常不是故意撒谎,更多是顺着你的需求给一个听起来合理的方案。多验证一步,能省掉不少麻烦。
6.3 功能越加越多,项目结构失控
VibeCoding特别容易产生"代码腐化"。原因是每加一个功能,AI都在原有文件里堆代码,久而久之一个文件几百上千行,逻辑耦合,改一处崩另一处。
我的应对策略是:定期让AI做重构,把大文件拆成独立的Service、Model、Widget。提示词示例:
当前home_page.dart已经有500行,请把它拆成多个文件:页面主文件、打卡表单组件、打卡记录卡片组件、运动类型选择组件,并保持功能不变。
让AI重构自己写的代码,是VibeCoding阶段一个很实用的玩法。效果通常比预期好,重构完跑一遍全流程测试,能帮你兜底。
6.4 权限和隐私,是AI最容易忽视的"隐形炸弹"
AI很擅长生成UI和业务代码,但不太擅长提醒你权限配置。举个例子,当你加拍照上传功能时,AI会把相关插件加进来,但可能不提醒你在安卓Manifest里声明相机权限,也不提醒iOS配置权限用途文案。结果就是:APP在真机上调用相机时直接闪退,模拟器上却好好的。
这块我建议形成自己的检查清单:涉及相机相册就用成熟封装组件;涉及定位就先请求位置权限再调用;涉及通知就先申请通知权限。权限相关代码可以单独问AI:"这个功能需要哪些权限?安卓和iOS分别怎么配?"比让它顺手一起写好。
6.5 我自己的三条VibeCoding底线
最后把个人习惯交个底,给新手做个定心丸:
- 每次迭代只动一个功能点,验证通过再进入下一个。
- 核心数据逻辑(记账、打卡、下单这类)先让AI讲逻辑,我判断无误后再让它写代码。
- 每次都要求AI在关键处写注释。虽然AI代码一般能读,但有了注释,你重构和排错时会轻松很多。
这三条说起来简单,真正落实到位,VibeCoding的项目基本不会失控。
如果你也想试着自己做一个双端APP,我的建议很朴素:别从"大想法"开始,从"一个小而完整的工具"开始。AI编程的门槛已经不是技术,而是你愿不愿意把一个想法持续拆成一件件小事,再持续地去验收每一件小事。这个过程很有意思,希望看完这篇,你也能写出属于自己的第一个双端APP。