3. Xcode 基本配置与项目创建

说实话,很多新手拿到 Xcode 第一件事就是点「Create a new Xcode project」,接着一路 Next。结果编译时各种报错,传包时又发现签名不对。嗯,我这里花点时间,把最基本但最关键的几个配置讲清楚。你想象一下,地基没打好,后面盖多少层都得塌。

3.1 Xcode 安装与版本选择

去 Mac App Store 下载,或者从 Apple Developer 官网拿 dmg。我个人习惯用官网版,因为可以保留多个版本。为什么?

我经常需要同时维护旧项目和新项目。旧项目用 Xcode 13,新项目用 Xcode 15。如果你只装一个,哪天升级后发现第三方库不兼容,你就只能哭了。

这里有个要点:Xcode 的版本必须对应 macOS 版本。比如 Xcode 15 要求 macOS Ventura 以上。安装前看一眼你的系统版本。

Xcode 版本 最低 macOS 推荐场景
Xcode 13.x macOS Big Sur 11.3 维护老项目,兼容 iOS 14 以下
Xcode 14.x macOS Monterey 12.5 主流开发,Swift 5.7+
Xcode 15.x macOS Ventura 13.5 新项目,Swift 5.9+,Vision Pro 支持

安装完成后,打开 Xcode 第一件事是什么?不是新建项目,而是检查 Preferences → Locations → Command Line Tools。我见过太多同事这里没选对,导致终端里的 xcodebuild 找不到。选对版本,比如 Xcode 15.0 (15A240d)。

3.2 Xcode 偏好设置:必须动的那几项

Preferences 里一堆选项,但真正影响编译流程的就这几个:

  • Accounts:添加你的 Apple ID。不添加没法签名,没法真机调试。
  • Locations → Derived Data:默认在 ~/Library/Developer/Xcode/DerivedData。我建议放到一个单独的目录,比如 ~/XcodeDerivedData。为什么?方便清理。有一次我项目编译突然变慢,进去一看派生数据占了几十GB。删掉重建就好了。
  • Source Control → Enable Source Control:如果你们使用 git,保持开启。如果不用,可以关掉,省得每次打开项目都刷一遍。

曾经有个同事把 Derived Data 放在了 iCloud Drive 里,结果编译时一直卡住。为什么?iCloud 同步导致文件锁冲突。千万不要把构建缓存放在云同步目录里。

3.3 创建项目:选模板那点事儿

新建项目时,Xcode 会弹出一堆模板。别急着选「App」,先想想你的目标:

  • App:标准的 iOS/tvOS/watchOS 应用,带 SwiftUI 或 Storyboard。
  • Framework & Library:如果你要编译一个 SDK,选它。我这次课程后面会专门讲如何创建 SDK 项目。
  • Other → Empty:适合有经验的开发者,从零搭项目结构。

我习惯直接选 App,然后取消勾选「Include Tests」,因为测试目标的结构我自己单独配。勾了反而多出一堆没用的 target,编译时还多跑一遍。

3.4 项目配置:Info.plist 和 Build Settings

项目创建后,你会看到一堆配置。很多人不敢动,其实核心就这几个:

配置项 位置 说明
Bundle Identifier General → Identity 唯一标识,建议用反域名,比如 com.yourcompany.sdkdemo
Team Signing & Capabilities 选择你的 Apple 开发团队,用于签名
Deployment Target General → Deployment Info 最低支持版本。我一般选当前主流版本减一,比如现在选 iOS 16.0
Build System File → Project Settings 一定选 New Build System (默认就是)。不要用 Legacy

Build Settings 里我特别关注 ENABLE_USER_SCRIPT_SANDBOXING。Xcode 15 开始默认开启了用户脚本沙盒,如果你的构建过程用到了 shell 脚本(比如 CocoaPods 的 embed frameworks 脚本),可能会报错。我一般直接设为 NO。

核心原则:Info.plist 里存放的是应用元数据(版本号、权限声明等);Build Settings 里存放的是编译行为(优化等级、架构等)。两者不要搞混。

3.5 让编译「看得见」:调试日志与构建配置

SDK 编译最头疼的就是报错找不到原因。我建议一开始就开启详细日志:

// 在终端中执行
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES

这样编译时 Xcode 会显示每个阶段耗时,方便你定位瓶颈。另外,在 Xcode 菜单栏 → Product → Scheme → Edit Scheme 里,把 Build Configuration 从 Debug 切到 Release,再点 Archive,就能看到真实打包环境下的编译结果。

为什么要分 Debug 和 Release?因为 Debug 默认带调试符号、不做优化,编译快但体积大;Release 做优化、剥离符号,适合发布。我碰到过一个案例:Debug 下跑得好好的,Release 下就闪退,最后发现是编译器优化把某个局部变量优化掉了。嗯,所以一定要两个模式都测一遍。

3.6 项目创建后的「首跑」清单

项目建完,别急着写代码。走一遍这个清单,能省你后面一堆麻烦:

  1. 检查 Bundle Identifier 是否正确。
  2. 确认 Team 已选,自动签名打勾。
  3. 检查 Deployment Target 是否匹配你的测试设备系统版本。
  4. 打开 Build Settings,搜索 EXCLUDED_ARCHS,确保没有误排除 arm64。
  5. 在 General → Frameworks, Libraries, and Embedded Content 里,确认不需要的依赖已被移除。

我每次建新项目都会跑一遍 Cmd + B 看看能不能编译通过。如果第一次就红,多半是签名问题——去 TARGETS → Signing & Capabilities 重新勾一下「Automatically manage signing」就行。

3.7 知识体系图:Xcode 配置与项目创建要点

下面的 SVG 图把本章的核心逻辑串起来了。箭头方向代表依赖或流程关系。

Xcode 配置与项目创建知识体系 Xcode 安装与版本 Preferences 配置 项目模板选择 Info.plist / 签名 Accounts / Derived Data Build Settings 关键项 Bundle ID / Team 首次编译验证(Cmd+B) 提示:Debug/Release 两个配置都需验证,避免优化问题

3.8 避坑总结

最后,我把这些年踩过的坑列个清单:

  • 签名不一致:真机调试时突然提示 Failed to code sign,多半是你改了 Bundle Identifier 却没更新 Provisioning Profile。去 Signing & Capabilities 重新点一下「Automatically manage signing」,Xcode 会自动帮你修复。
  • 派生数据过大:Xcode 默认不清理中间产物。我习惯每个月清一次:Cmd+Shift+K 清理构建文件夹,或者直接去 Derived Data 目录 rm -rf *。
  • Deployment Target 设太高:如果你把最低版本设成 iOS 17,但同事的手机还是 iOS 16,他根本跑不起来。团队协作时,这个值应该写在项目文档里。
  • 忘记切换 Scheme:Archive 的时候一定要选 Generic iOS Device,而不是某个模拟器。我见过有人对着真机设备点 Archive,结果报错说设备不匹配。

基础配置做扎实了,后面编译 SDK 时才能心不慌。下一件事情就是真正的 SDK 项目创建与结构组织了。