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:用来指定不同文件类型分别应该如何被编译。内容和使用详情可以查看这篇文章
 
image.png

Build SettingsBuild 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会创建一个Podsproject用于进行第三方库源码管理,然后创建一个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,内存管理,日志,帧率检测等调试选项。

Xcode基础文件概念的更多相关文章

  1. Xcode工程文件pbxproj

    Xcode工程文件pbxproj Xcode会去读Project.pbxproj文件,把pbxproj转成plist文件,看起根目录结构 rootObject:指向的是我们的工程对象.(对应一个24个 ...

  2. 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 百篇博客分析OpenHarmony源码 | v62.01

    百篇博客系列篇.本篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 51.c.h.o 本篇开始说文件系统,它是内核五大模块之一,甚至有Linux的设计哲学是" ...

  3. XCode编译文件过多导致内存吃紧解决方法

    XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧

  4. SVN版本更新后,upData工程之后,Xcode 工程文件打不开解决办法

    svn更新代码后,打开xcode工程文件,会出现  xxx..xcodeproj  cannot be opened becausethe project file cannot be parsed. ...

  5. Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.

    svn更新代码后,打开xcode工程文件,会出现  xxx..xcodeproj  cannot be opened because the project file cannot be parsed ...

  6. Windows 10开发基础——文件、文件夹和库(一)

    原文:Windows 10开发基础--文件.文件夹和库(一) 主要内容: 1.枚举查询文件和文件夹 2.文本文件读写的三种方法——创建写入和读取文件 3.获得文件的属性 枚举查询文件和文件夹 先了解一 ...

  7. Python 3 集合基础和概念!

    Python 3 集合基础和概念! Python 3中,集合是无序的,所以不能进行切片和索引操作. 创建集合有两个方法:set()方法创建的集合是可变的,可被迭代的:frozenset()方法创建的集 ...

  8. (代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

    上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现. 传统IO-intsmaze 传统文件IO操作的基础代码如下: FileInputStream in = new FileI ...

  9. Xcode工程文件打不开:cannot be opened because the project file cannot be parsed

    svn更新代码后,打开xcode工程文件,会出现  xxx..xcodeproj  cannot be opened because the project file cannot be parsed ...

  10. wordpress 基础文件

    需要用到的PHP基础文件有: 404.php 404模板  rtl.css  如果网站的阅读方向是自右向左的,会被自动包含进来 comments.php  评论模板 single.php 文章模板.显 ...

随机推荐

  1. 【C学习笔记】day3-3 编写程序数一下 1到 100 的所有整数中出现多少个数字9

    #include <stdio.h> int main() { int cou=0; for (int i = 1; i <= 100; i++) { if (i % 10 == 9 ...

  2. Windows 下安装 Bun:像 Node 或 Deno 一样的现代 JavaScript 运行时

    背景 最近前端工具链又火了一个项目 Bun,可以说内卷非常严重.Bun 是一个新的 JavaScript 运行时,内置了打包器.转译器.任务运行器和 npm 客户端. Bun 是像 Node 或 De ...

  3. nodejs web学习

    命令行 和python一样,出奇的简单 npm i serve -g serve -s softwares 如果当前目录,就直接 serve express /** * 服务器代码 * 启动方式: * ...

  4. PGSQL新建临时表

    初始化临时表,会话结束后自动删除 普通写法 CREATE TEMP TABLE tmp_student( id VARCHAR(10), name VARCHAR(3O), age INTEGER ) ...

  5. k8s安装gitlab-ce

    docker镜像打包 根据官方说明:gitlaby docker镜像中已经不包含邮件代理传输,需要重新打包镜像 FROM gitlab/gitlab-ce RUN apt-get update &am ...

  6. #Cisco——配置链路聚合

    Cisco--配置链路聚合 一.什么是链路聚合. 链路聚合(英语:Link Aggregation)是一个计算机网络术语,指将多个物理端口汇聚在一起,形成一个逻辑端口,以实现出/入流量吞吐量在各成员端 ...

  7. 【SQL SERVER】DATEDIFF() :两个日期的日期差

    定义用法 DATEDIFF() 函数返回两个日期之间的日期差. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 enddate 参数是合法的日期 ...

  8. Python爬取三国演义章节标题和内容(bs4爬取,解决中文乱码)

    import os.path import requests from bs4 import BeautifulSoup if __name__ == '__main__': if not os.pa ...

  9. vue组件自调用

    组件自调用 在vue中有些情况下我们会用到组件本身来遍历出自己想要的效果. 其实非常简单,可以在模板中使用name属性值,来调用自己 <template> <el-submenu v ...

  10. pycharm字体大小设置

    首先有两个方法 一个是滚轮放大缩小,一个是固定的字体大小. 调为固定的字体大小: 菜单栏:file--setting--editor--font--size 修改为需要大小字号,例如20,点击ok 滚 ...