关于Xcode项目设置页的一些tab含义

16 阅读4分钟

image.png

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 代替。