Xcode 27.2 用基于 JSON 的 project.xcproj 取代了沿用多年的 project.pbxproj。新建项目默认使用新格式,已有项目不会自动转换,两种格式可以并存。Xcode 27.0 和 27.2 都能打开 JSON 项目,Xcode 26 不行。
旧格式基于 NeXTSTEP 时代的 plist 语法,把项目存成一张扁平的对象表,对象之间靠随机十六进制 ID 互相引用。新增一个 Swift 文件,Xcode 要同时写 PBXFileReference、PBXBuildFile、PBXGroup 和 PBXSourcesBuildPhase 四处,ID 每次重新生成,多人分支上改同一批位置就会撞出经典的合并冲突。构建配置也是每个 configuration 各存一份完整副本,改一次部署目标要动两处。
新格式按 Xcode 界面里的结构组织,拆成 files、targets、build-settings 等区块,diff 看起来就是你在界面上做的事。最关键的改动是文件自己声明归属的 target,写成 "target-membership": ["Weather/compile-sources"],不再涉及 UUID,加文件变成一处一行。构建配置相同的只写一次,Debug 和 Release 不同时用 [config=...] 条件区分,和 .xcconfig 的写法一致。一次真实迁移中,161 行 XCBuildConfiguration 缩成一个 build-settings 块,整个文件从 300 行 property list 变成 123 行 JSON。ID 只在 target 和构建产物上保留,其余按名称或路径引用。
需要注意这个格式允许尾随逗号,普通 JSON.parse 读不了,Apple 的开源库用 JSON5 编码处理,写脚本时要用能容忍 JSON5 的解析器,别用 jq。切换方式有两种:在 Xcode 里选中项目,打开 File inspector(Option-Command-1),把 Project Document 下的 Project Format 设为 JSON;命令行可以用 xcodebuild -project MyApp.xcodeproj -convert-project "Xcode Project",适合 CI 或批量转换。转换会删除 project.pbxproj,建议单独提交、不带其他改动,方便审查和回滚。
Xcode 27.2 还在 /usr/bin 里带了 xcprojformatter,用于校验和重排已使用 xcproj 的文件,它不是 pbxproj 转换器,可以理解为项目文件版的 swift-format,适合加进 CI 防止手工或 AI 编辑破坏规范格式。Apple 同时开源了 Swift 库 xcode-project-format,供生成器、linter、校验器直接读写该格式。
直接解析 project.pbxproj 的工具都需要更新,包括通过 xcodeproj gem 的 CocoaPods、改版本号或设置的 fastlane action、项目生成器和自定义脚本。Swift XcodeProj 库已有实验性支持,9.17.0 版本于 2026 年 9 月 17 日加入,维护者提示细节仍会变化,提交前先检查转换结果。Capacitor 尚未支持,cap sync ios 目前只解析 .pbxproj。Tuist、XcodeGen、Bazel、SwiftPM 和基于 xcconfig 的工作流不受影响,可按自己的节奏迁移。
Apple 把这次公告归在 Coding Intelligence 下,明确表示新格式让编码 agent 更容易处理 Xcode 项目:改一个设置只需编辑一行可读文本,而不是更新多处 ID 交叉引用,出错的可能性大幅减少。