Project 和 Target 的区别
Project
左侧 PROJECT 下只有一个:
homework
它对应工程文件:
homework.xcodeproj
Project 是整个 Xcode 工程的容器,主要管理:
- 工程中有哪些 Target
- 工程级 Build Settings
- Debug、Release 等构建配置
- 文件引用
- Swift Package 依赖
- Target 之间的依赖关系
Project 自己通常不会直接产出一个可以运行的 App。
Project 中的部分配置可以作为所有 Target 的默认配置:
Project 配置
↓ 继承
Target 配置
如果 Target 设置了同一个配置,通常以 Target 的配置为准。
Target
Target 表示“要构建出什么产品,以及如何构建”。
每个 Target 通常会产生一个独立产品:
Target 构建产物
homework 主 App
ZYBWidgetExtension 桌面小组件 Extension
LiveActivityExtension 实时活动 Extension
Notification 通知扩展
UnitTest 单元测试包
UITests UI 测试包
Intent Siri Intent 扩展
IntentUI Intent UI 扩展
例如你截图中选中的:
ZYBWidgetExtension
会编译小组件代码,最终产生类似:
ZYBWidgetExtension.appex
然后由主 App 在构建过程中把这个 Extension 嵌入 App。
因此,一个 Xcode Project 可以包含很多 Target:
homework Project
├── homework App Target
├── Widget Target
├── Notification Target
├── Live Activity Target
├── Unit Test Target
└── UI Test Target
每个 Target 都可以有自己的:
- 源文件
- Bundle Identifier
- Info.plist
- 最低系统版本
- 签名配置
- Build Settings
- Framework 依赖
- Swift/Objective-C 编译配置
这也解释了为什么 Bridging Header 是 Target 级别的:主 App 配置了桥接头,不代表 Widget Target 自动使用同一个桥接头。
右上方这些 Tab 是什么
你截图中的 Tab 是:
General
Signing & Capabilities
Resource Tags
Info
Build Settings
Build Phases
Build Rules
General:常用基础配置
这是最常用、最直观的配置页。
截图里能看到:
Supported Destinations
Minimum Deployments
Identity
Frameworks and Libraries
分别表示:
Supported Destinations:支持在哪些设备运行,例如 iPhone、iPad、Mac、Vision。Minimum Deployments:最低支持的系统版本。截图中的 Widget 最低支持 iOS 14。Display Name:安装后显示的名称。Bundle Identifier:系统识别这个 App 或 Extension 的唯一标识。Version:对用户展示的版本号,例如1.0。Build:内部构建号,例如1。Frameworks and Libraries:当前 Target 链接的系统库、第三方 Framework。
可以把 General 理解为“常用 Build Settings 的可视化简化版”。
Signing & Capabilities:签名和系统能力
这里管理代码签名:
- Apple Developer Team
- 开发证书
- Provisioning Profile
- Bundle Identifier
- 自动或手动签名
也在这里添加系统能力:
- Push Notifications
- App Groups
- Associated Domains
- iCloud
- Sign in with Apple
- Keychain Sharing
- Background Modes
- HealthKit
例如主 App 和 Widget 需要共享数据,通常会给两个 Target 都添加同一个 App Groups。
需要注意:给主 App 添加能力,不等于 Extension 自动获得这个能力。每个 Target 通常要分别配置。
Resource Tags:按需资源标签
主要用于 On-Demand Resources,也就是按需下载资源。
可以给图片、音频、关卡等资源设置 Tag,然后决定资源属于:
- 首次安装就下载
- 安装后预取
- 使用时再下载
普通项目很少直接使用这个页面。如果项目没有使用 On-Demand Resources,基本不需要关注。
Info:Target 的信息属性
这里主要展示和编辑 Info.plist 相关配置,例如:
- Bundle Display Name
- 支持的屏幕方向
- URL Schemes
- 相机、相册、定位等权限说明
- Application Scene Manifest
- Document Types
- Extension 配置
对于 Extension,这里尤其重要,因为它通常包含:
NSExtension
NSExtensionPointIdentifier
NSExtensionPrincipalClass
这些信息告诉系统:它是什么类型的 Extension,以及入口在哪里。
Build Settings:完整构建参数
这是最复杂也最重要的页面,管理编译、链接、搜索路径等底层设置。
例如我们前面讲的混编配置就在这里:
Objective-C Bridging Header
SWIFT_OBJC_BRIDGING_HEADER
其他常见配置包括:
- Swift Language Version
- Objective-C Generated Interface Header Name
- Product Module Name
- Header Search Paths
- Framework Search Paths
- Library Search Paths
- Other Linker Flags
- Preprocessor Macros
- Swift Compiler Flags
- Deployment Target
- Architectures
这里通常可以切换查看:
Basic / Customized / All
Combined / Levels
Debug / Release
Levels 很有用,可以看到某个配置究竟来自:
系统默认值
→ Project
→ xcconfig
→ Target
Build Phases:一次构建要执行哪些步骤
它决定 Target 构建时要做什么。
常见阶段包括:
Target Dependencies
Compile Sources
Link Binary With Libraries
Copy Bundle Resources
Embed Frameworks
Embed App Extensions
Run Script
其中:
Compile Sources:哪些.m、.mm、.swift文件参与当前 Target 编译。Link Binary With Libraries:链接哪些 Framework 和静态库。Copy Bundle Resources:复制图片、JSON、字体、资源包。Embed Frameworks:把动态 Framework 嵌入产品。Run Script:执行 CocoaPods、代码生成、Lint 等脚本。
如果一个 Swift 文件存在于工程目录,但没有加入当前 Target 的 Compile Sources,它就不会被这个 Target 编译。
Build Rules:自定义文件处理规则
用于告诉 Xcode:
遇到某种类型的文件时,应该用什么命令处理
例如:
- 自定义代码生成
- 特殊资源编译
- 使用脚本把某种输入文件转成源代码或资源
普通 App 很少手动配置它,大多数项目使用 Build Phases 中的 Run Script 代替。