Xcode基础文件概念
Xcode基础概念
Schema、Target、Project 和 Workspace 是组成一个 Xcode 工程最核心的单元,也是我们首先需要理解的部分。
Target
Target 是我们工程中的最小可编译单元,每一个 target 对应一个编译输出,这个输出可以是一个链接库,一个可执行文件或者一个资源包。它定义了这个输出怎样被 build 的所有细节,具体包括:
- 编译选项,比如使用的编译器,目标平台,flag,头文件搜索路径等等。
- 哪些源码或者资源文件会被编译打包,哪些静态库、动态库会被链接。
- build 时的前置依赖、执行的脚本文件。
- build 生成目标的签名、Capabilities 等属性。
在ios项目中, Build Settings,Build Phases 中配置的各种选项,大部分都是需要对应到指定的 target 的。
并且,每次我们在 Xcode 中 run/test/profile/analyze/archive 时,都必须指定一个 target。
工程中的 targets 有时候会共享很多代码、资源,这些相似的 targets 可能对应同一个应用的不同版本,比如 iPad 版和 iPhone 版,或者针对不同市场的版本。
Target:对指定代码和资源文件的具体构建方式,target 是project中最小的可编译单元,每一个 target 对应一个编译输出,这个输出可以是一个App包、一个链接库、一个可执行文件或者一个资源包。它定义了这个输出是怎样被 build 的所有细节,具体包括:
- 1.General:可以在里面调整常用的target设置,例如标识、签名和部署选项。
- 2.Signing & Capabilities:签名和功能,对target编译输出结果的签名和添加Apple提供的 “app 服务”功能。如 CloudKit、Game Center 或 App 内购买项目。要使用某些 app 功能服务,您必须对 app 进行预置,通过 Xcode 的项目编辑器添加功能。
- 3.Resource Tags:用来浏览和编辑工程中全部的tag和相关资源。 内容和使用详情可以查看这篇文章
- 4.Info:编辑project或target的属性,包括信息列表值、支持的文档类型和本地化。一个target对应一个info.plist文件。如果有多个target就有多个。
- 5.Build Settings:编译设置,编译时会根据里面的设置信息进行编译。内容和使用详情可以查看这篇文章
- 6.Build Phases:构建阶段,编辑和重新排序生成系统执行的任务,例如运行脚本、复制文件或链接到框架。内容和使用详情可以查看这篇文章
- 7.Build Rules:用来指定不同文件类型分别应该如何被编译。内容和使用详情可以查看这篇文章

Build Settings,Build Phases中配置的各种选项,大部分都是需要对应到指定的 target 的。project和target中都有Build Settings,如果设置矛盾会应用谁的?
分为两种情况:
1. project有设置,而taget没有设置,以project为准
2. project有设置,target有设置,以target为准
优先级关系(由高到低):
手动配置Target Build Settings > Target中配置的xcconfig文件 > 手动配置Project Build Settings > Project中配置的xcconfig文件
Project
Project 很好理解,Project就是一个 Xcode 工程,它管理工程下的所有targets 集合以及它们的源码,引用的资源,framework 等等。
Project 是管理资源的容器,本身是无法被编译的,所以每个 project 至少应该有一个可编译的 target,否则就是一个空壳。一个 target 编译时引用的资源是它所在 project 所有管理资源的子集。
我们也可以对 project 进行配置,包括基本信息和编译选项(Build Settings)等,这些配置会应用到它管理的所有 targets 中,但是如果 target 有自己的配置,则会覆盖 project 中对应的配置。
在很多情况下,我们的工程中只有一个 project。可以在 finder 中双击后缀名为.xcodeproj 的文件,就可以直接打开单个 project 了。
例如:cocoapods中,虽然Pods与主project在同一个workspace中,但是主project管理的资源与Pods的project管理的资源是互相独立的。编译时Pods会将管理的源码库编译成一个libPods.a文件,并导入到主project中,让主project对libPods.a进行资源管理。因此才得以正常引用使用
project包含的内容:
1.源文件
1.1 project中自己编写的.h和.m文件
1.2project中导入的静态库和动态库
1.3导入的资源文件(如.db文件、json文本、xml、plist等)
1.4图片资源
1.5界面资源文件(xib、storyboard等)
2.project中使用group去组织文件目录结构信息。 在文件结构的导航中,采用group去组织文件(实际开发中,尽量使用实体文件夹)
3.project的编译级别配置文件如(debug, release)
4.target
5.运行环境scheme

Workspace
当一个 target 被多个不同的项目依赖,或者 project 之间互相引用,那么我们就需要把这些 projects 放到相同的层级上来。管理相同层级 projects 的容器就是 Workspace。
和 projects,target 不同,workspace 是纯粹的容器,不参与任何编译链接过程,它主要管理:
- Xcode 中的 projects,记录它们在 Finder 中的引用位置。
- 一些用户界面的自定义信息(窗口的位置,顺序,偏好等等)。 细心的童鞋可能已经注意到:当你把不同的 projects 放到一个 workspace 中管理后,你仍然可以用 Xcode 单独打开其中的某一个 project,但是如果它涉及到对其它 project target 的依赖,这时候你无法在这个单独的窗口中编译成功。
在 iOS 开发中,我们常常使用 Cocoapods 来管理三方库,它会把这些三方库的源码组装成一个 project,和主工程一起放入到 workspace 中,自动配置好主工程与 pods 库之间的依赖。所以如果引入了 Cocoapods,我们必须打开这个新的 workspace 才能正常 build 原来的项目。
例:以cocoapods为例,如果你原本的仅仅是一个project,那么cocoapods会创建一个Pods的project用于进行第三方库源码管理,然后创建一个workspace。workspace让Pods的project与主project产生关联关系,这样就可以在主project中使用Pods的project管理的资源(这里并不是直接使用Pods的资源,而是使用Pods打包生成的.a库)。因此主project如果使用cocoapods的库,就必须使用workspace打开进行编译,否则会因为找不到引用库而报错。

workspace是一个文档的集合,它可以包括许多个project,并管理着project之间的关系,它为不同project之间的调用提供了解决方法。需要指出的是,workspace在Xcode中以xcworkspace文件形式存在,就是我们使用CocoaPods后的产物。
可以吧project看成一个仓库,用来存放一个项目中所有用到的资源,它能包含多个target,并定义那个target作为最终产品被运行。在Xcode中一个xcodeproj文件就是一个project。
一个project可以独立存在,也可以包含在一个workspace下。
你可以用Xcode schemes来指定当前的target、编译配置、可执行文件配置。
Scheme
我们知道苹果手机中的每个APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的。我们可以通过系统的OpenURL来打开该app,并可以传递一些参数。
URL Scheme必须能唯一标识一个APP,如果你设置的URL Scheme与别的APP的URL Scheme冲突时,你的APP不一定会被启动起来。scheme的命名应该是只能纯英文字符,而不能含有下划线或者数字。
日常开发中我们常常点击 Xcode 左上角的 Run 箭头来运行调试代码,这其实就是执行了 Scheme 定义的一个任务。
针对一个指定的 target,scheme 定义了 build 这个 target 时使用的配置选项,执行的任务,环境参数等等。Scheme 可以理解为一个工作流,或者蓝图,当我们点击 debug,test 按钮时,Xcode 会按照 scheme 中的定义,去执行对应的工作流。
Scheme 中预设了六个主要的工作流: Build, Run, Test, Profile, Analyze, Archive。包括了我们对某个 target 的所有操作,每一个工作流都可以单独配置。
Scheme 中最重要的一个配置是选择 target 的 build configuration,对每一个 project,会有两个默认的 build configuration:debug 和 release。

每个 configuration 对应了 build target 时不同的参数集,比如宏,编译器选项,bundle name 等等。我们可以在 target 的配置页中更改这些选择项,也可以自己创建新的 build configuration,比如为 App 创建免费和付费版本的配置。

除了 build configuration 外,scheme 还可以配置:
- 运行时的环境变量(Environment Variables)
- 启动时设置给 UserDefaults 的参数(Arguments Passed on Launch)
- App 执行时的系统语言、模拟的定位坐标、国家等环境参数
- runtime,内存管理,日志,帧率检测等调试选项。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!