- SignalDesk2小时前
本文以一个真实的小项目 FloatingBottomSheetsApp (一个 SwiftUI 底部浮层 Demo)为例,手把手带你搭好一套完全不打开 Xcode IDE 的 iOS 开发环境:工程生成、构建运行、调试、代码补全、格式化、热重载,一次讲清。 配套示例代码: cyub/sweetpad-demo ,文中所有配置文件都可以直接对照源码查看。 为什么是 VS Code + SweetPad? 很多从其他技术栈转来、或者常年写前端的开发者,对 Xcode 那套 IDE 并不亲近——窗口繁重、编辑器手感一般、和 git 工作流的结合也别扭。SweetPad 是一个 VS Code 扩展,它把 Xcode 的核心能力(构建、运行、调试、热重载)全部搬进了 VS Code,底层驱动的仍然是苹果官方的 xcodebuild 和 lldb ,所以构建产物、签名行为和 Xcode IDE 完全一致,团队成员可以混用两种开发方式,互不影响。 再配上 XcodeGen, .xcodeproj 不再是一个需要手工维护(和 git merge 时痛苦)的二进制格式文件,而是一个几十行的 YAML 清单。 一句话总结这套组合的分工: 工具 职责 XcodeGen 用 project.yml 声明工程,生成 .xcodeproj SweetPad 在 VS Code 里构建、运行、调试、热重载 VS Code + Swift 扩展 编辑器、代码补全(SourceKit-LSP)、格式化 准备工作 你需要一台装了完整 Xcode 的 Mac(Xcode 自带 xcodebuild 、模拟器、LLDB,这些是 SweetPad 的地基)。 安装 SweetPad 扩展 :打开 VS Code 扩展面板,搜索 "SweetPad" 安装即可(在 Cursor 里同样可用,它是 VS Code 的 fork)。 安装 SweetPad CLI (后面代码补全和调试会用到): brew install sweetpad-dev/tap/sweetpad 建议顺手把 xcbeautify 也装上,构建日志会好看很多: brew install xcbeautify 当然,SweetPad 侧边栏的 Tools 面板提供了一键安装这些工具的入口,不想敲命令行也可以。 用 XcodeGen 管理工程 为什么需要工程生成器 .xcodeproj 里的 project.pbxproj 是出了名的难合并、难 review 。XcodeGen 的思路是:整个工程用一个 YAML 文件描述, .xcodeproj 变成 生成产物 ,可以随时删掉重新生成,git 里甚至可以忽略它。 本项目根目录的 project.yml 长这样: name: FloatingBottomSheetsApp options: bundleIdPrefix: com.tink packages: Inject: url: https://github.com/krzysztofzablocki/Inject from: 1.0.0 targets: FloatingBottomSheetsApp: type: application platform: iOS deploymentTarget: "17.0" sources: - path: FloatingBottomSheetsApp dependencies: - package: Inject settings: GENERATE_INFOPLIST_FILE: YES 几行配置就声明了:应用 target 、iOS 17 起步、源码目录、一个 SPM 依赖(Inject,热重载一节会讲),以及让 Xcode 自动生成 Info.plist 。 在终端运行: xcodegen generate 就会在根目录生成 FloatingBottomSheetsApp.xcodeproj 。 一个新手常见坑 :如果 target 既没有 INFOPLIST_FILE 也没有 GENERATE_INFOPLIST_FILE: YES ,构建时会报: error: Cannot code sign because the target does not have an Info.plist file and one is not being generated automatically. 这就是上面配置里 GENERATE_INFOPLIST_FILE: YES 的来历(Xcode 16 起官方推荐的做法,纯 SwiftUI App 不需要手写 plist)。 让 SweetPad 自动重新生成工程 XcodeGen 的工作模式有一个隐患:它只在执行 xcodegen generate 的那一刻扫描源码目录,之后 新建的 Swift 文件不会自动进入工程 。如果你新建了 BottomSheetDemoView.swift 却忘了重新生成,编译时就会得到一个摸不着头脑的错误: error: cannot find 'BottomSheetDemoView' in scope SweetPad 可以替你盯着这件事。在 .vscode/settings.json 里加一行: { "sweetpad.xcodegen.autogenerate": true } SweetPad 会监听 Swift 文件的新增和删除,自动在后台重跑 xcodegen generate 。注意两点: 改完设置要重启 VS Code ,watcher 才会激活; watcher 只在 工作区根目录存在 project.yml 时生效。 也可以随时手动触发:命令面板( ⌘⇧P )运行 SweetPad: Generate an Xcode project using XcodeGen 。 进阶提示 :XcodeGen 2.44+ 支持给 source 加 type: syncedFolder (或在 options 下设 defaultSourceDirectoryType: syncedFolder ),生成的工程直接引用文件夹而不是罗列文件,Xcode 会自动感知磁盘上的文件增删,连重新生成都省了。不过修改 project.yml 本身仍然需要 regenerate 。 构建与运行 第一次构建 用 VS Code 打开 项目根目录 (即包含 .xcodeproj 的文件夹,不是 .xcodeproj 本身),点开左侧的 SweetPad 侧边栏(棒棒糖图标 🍭)。 侧边栏分三块: Build :所有 scheme,每个都有 ▶️ 构建运行按钮; Destinations :所有可运行的位置(模拟器、真机、macOS); Tools :辅助工具一键安装。 点击 scheme 旁边的 ▶️,SweetPad 会让你选一个模拟器,然后执行构建、启动模拟器、安装并拉起 App——全程不需要碰 Xcode 。官方的完整流程演示: 构建视图速览: ▶️ Build & Run :scheme 名字旁的播放键,构建并运行; ⚙️ Build
- 情报分类:技术学习与提效
- 分类依据:内容涉及技术、AI、软件工具或工程实践
- 信息来源:服务器 / V2EX
- 发布时间:2026/10/6 11:49:40
- 暂无回复