跳到主要内容
教程目录

在 VS Code 里用 AI 编程助手写 iOS App,Windows 上也能用

AI 编程助手能帮你写 Swift 代码,但写出来的代码要编译、装到手机上跑过才算数。这篇用 KXBuild 负责代码提示、编译和真机调试,用 GitHub Copilot、Claude Code 这类 AI 助手负责写和改代码,在 Windows 上给一个待办 App 加一个小功能,走完「提需求、审代码、编译、真机验证、修 bug」的整个循环。

例子沿用第一个 SwiftUI App 做好的待办清单 MyTodo。没有这个工程也没关系,任何能用 KXBuild 编译的 iOS 工程都是同样的做法。

准备

先把 KXBuild 这一侧准备好。按安装页装好 KXBuild 和 VS Code 插件,用「文件 → 打开文件夹」打开工程目录,按一次 F5 确认能装到手机上运行。

然后确认代码提示正常。打开一个 Swift 文件,输入 Text("a"). 应该弹出修饰符列表,写错的地方会画红线。补全不出来时在命令面板运行 KXBuild: 重启代码提示,其他情况见代码提示与索引。代码提示正常时,AI 改完的代码哪里有问题会马上在编辑器里标出来,不用等到编译。

AI 助手按各自官方文档安装和登录,例如 GitHub Copilot、Claude Code。它们在 iOS 工程里的用法和在其他工程里一样。

让 AI 了解工程

AI 默认不知道这是一个 iOS 工程、最低支持哪个 iOS 版本、能用哪些依赖,容易写出部署目标不支持的 API,或者引入工程里没有的第三方库。在仓库里放一份说明文件,AI 每次对话都会先读它。

不同工具读取的文件不同,常见的有这几种,具体写法以各工具的文档为准。

工具 说明文件
GitHub Copilot .github/copilot-instructions.md
Claude Code 仓库根目录的 CLAUDE.md
Cursor .cursor/rules 目录下的规则文件

内容写 AI 自己看不出来、又会影响代码的事实。最低 iOS 版本在 KXBuild 视图中右键 target 选「KXBuild: 编辑目标设置」,在 General 页查看。下面是 MyTodo 的例子。

1# MyTodo
2
3- iOS App,SwiftUI,Swift 5,最低支持 iOS 15.0。不要用 iOS 16 及以上才有的 API(如 @Observable、SwiftData、NavigationStack),确实需要时用 if #available 包起来。
4- 没有第三方依赖,不要引入新的 Swift Package 或 CocoaPods。
5- 代码在 MyTodo/ 目录。ContentView.swift 里有 TodoItem(数据)、TodoStore(读写 Documents/todos.json)和 ContentView(界面)。
6- TodoItem 已经存进用户手机,新增字段必须是可选类型或带默认值,保证旧数据能读出来。
7- 改完代码后在工程目录执行 kxbuild build .\MyTodo.xcodeproj -D CODE_SIGNING_ALLOWED=NO 检查能否编译,有 error 就继续改,直到通过。
8- 不要读取或修改 keychain/ 目录。

最后两条让 AI 能自己检查编译,并且不碰证书,下面几节会用到。

写一个小功能

给待办加截止日期,并能按截止日期排序。功能不大,但同时涉及数据、界面和已有的存储,适合用来检验 AI 写的代码。

写提示词

提示词写清楚要什么、放在哪、不能动什么。越具体,生成的代码越接近你想要的。

1给待办加截止日期,要求如下。
21. TodoItem 加一个可选的截止日期。
32. 添加区域加一个开关,打开后显示日期选择器,添加时带上日期。
43. 列表每行在标题下方用小字显示日期,未完成且日期早于今天的显示为红色。
54. 导航栏左侧加「按日期排序」按钮,有日期的按日期从早到晚排在前面,没日期的排在后面。
6不要改 TodoStore 的存储方式。

审查生成的代码

AI 改完后先看改了什么,再决定要不要保留。VS Code 的源代码管理视图里能逐个文件看差异。下面是一种可以接受的写法,节选关键部分。

1struct TodoItem: Identifiable, Codable {
2    var id = UUID()
3    var title: String
4    var done = false
5    var dueDate: Date?
6}
1Toggle("截止日期", isOn: $hasDueDate)
2if hasDueDate {
3    DatePicker("日期", selection: $newDueDate, displayedComponents: .date)
4}
1if let due = item.dueDate {
2    Text(due, style: .date)
3        .font(.caption)
4        .foregroundColor(isOverdue(item) ? .red : .secondary)
5}
 1private func isOverdue(_ item: TodoItem) -> Bool {
 2    guard let due = item.dueDate, !item.done else { return false }
 3    return due < Calendar.current.startOfDay(for: Date())
 4}
 5
 6private func sortByDueDate() {
 7    store.items.sort { a, b in
 8        switch (a.dueDate, b.dueDate) {
 9        case let (x?, y?): return x < y
10        case (_?, nil): return true
11        default: return false
12        }
13    }
14}

审查时重点看这几处。

  • 数据兼容。dueDate 是可选类型,手机上已有的 todos.json 没有这个字段也能正常读出。写成 var dueDate: Date 这类非可选字段,旧数据会解码失败,用户的待办直接清空。
  • 排序方式。这里直接对 store.items 排序,排序结果会触发保存,勾选和左滑删除也照常工作。有的写法是另建一个排好序的计算属性给 ForEach 用,这时绑定和 onDelete 的下标对不上原数组,删错行。
  • API 版本。Text(_:style:)、DatePicker 在 iOS 15 都能用。出现 NavigationStack、@Observable 这类更高版本的 API 时,让 AI 按说明文件改回来。
  • 改动范围。只动了需要动的地方,没有顺手重写别的代码、没有加新的依赖。

编译并在手机上验证

按 F5,KXBuild 构建、签名、安装并启动 App。编译错误出现在问题面板,点一下跳到对应的行。

手机上依次试这几件事。添加两条带不同日期的待办和一条不带日期的,点「按日期排序」看顺序。把一条的日期设成昨天,确认显示红色,勾选后恢复灰色。把 App 从后台划掉再打开,确认日期和顺序都还在。

在 sortByDueDate() 里打个断点,点排序按钮停下来后,在调试控制台输入 po store.items 就能看到排序前的数据,断点和变量的用法见运行与调试。

把错误交给 AI 修

AI 修 bug 的效果取决于你给它的信息。只说「不能用」很难修,把完整的错误原文、出错的操作步骤和相关代码一起给它。

编译错误

按 F5 构建失败时,完整日志在「输出 → KXBuild」,错误在问题面板。把错误那几行连同文件名和行号复制给 AI。一条完整的编译错误长这样。

1MyTodo\ContentView.swift:21:29: error: cannot convert value of type 'String' to expected argument type 'Int'

同一个错误引出一连串报错时,只给第一条,后面的多半会跟着消失。

运行时的问题

App 能启动但行为不对时,先让 AI 在可疑的位置加 print,重新按 F5 复现,把「输出 → KXBuild Console」里的输出贴给它。也可以自己打断点,把调试控制台里看到的变量值告诉它。

崩溃报告

App 闪退时把手机上的崩溃报告下载到本地。

1kxdevice crash list MyTodo*
2kxdevice crash pull .\crashes MyTodo*

把报告交给 AI 时说明崩溃前做了什么操作。下载的 .ips 文件里的异常类型、Last Exception Backtrace 和崩溃线程的调用栈是 AI 定位问题的主要依据。调用栈里没有函数名时,用 Debug 配置按 F5 复现,调试器会停在崩溃的那一行,把那一行和调用栈给 AI 更直接。读报告的方法见真机调试。

让 AI 自己跑构建

Copilot、Claude Code 这类能执行终端命令的 AI 助手,可以自己运行 kxbuild build,看到错误后接着改,直到编译通过。说明文件里已经写了这条命令,也可以在提示词里直接要求「改完后编译,有错误就修」。

1kxbuild build .\MyTodo.xcodeproj -D CODE_SIGNING_ALLOWED=NO

-D CODE_SIGNING_ALLOWED=NO 只检查能否编译,不签名,AI 不需要接触证书。编译失败时命令返回非零退出码,错误按「文件:行:列: error: 说明」的格式输出,AI 能直接读懂并找到对应的代码。工程是 .xcworkspace 的把命令里的工程文件换成它,参数说明见构建与配置。

这样分工比较顺手。AI 负责「改代码、编译、看错误、再改」,编译通过后你来审查改动,再按 F5 在手机上验证界面和交互。编译能通过不代表功能正确,真机上的验证不能省。

注意事项

  • 每次改动都要审查。AI 可能改动你没要求的地方,或者写出能编译但逻辑不对的代码。改动小步提交,出问题容易回退。
  • 核对部署目标。AI 按它见过最多的写法生成代码,不一定适合你的最低 iOS 版本。编译报 is only available in iOS 16.0 or newer 这类错误时,让它换成低版本的写法或加 if #available。
  • 补上权限说明。AI 加了相机、相册、定位、麦克风这类功能时,要在 Info.plist 里加对应的用途说明,比如 NSCameraUsageDescription,缺了 App 会在访问时直接闪退,上架审核也会被拒。自动生成 Info.plist 的工程怎么加见图标、启动屏与多语言。
  • 证书和密码不进 AI 上下文。keychain 目录里的 .p12 和 password.properties 不要贴给 AI,也不要让 AI 读取。各 AI 工具都有忽略文件或排除设置,把这个目录排除掉。Apple 账号密码、App Store Connect 的 API 密钥同理。
  • 提交前自己测一遍。在手机上把新功能和受影响的旧功能都点一遍,数据相关的改动还要测覆盖安装后旧数据是否正常。