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. CF单机版终极猎手30人版安装教程

    本游戏是CF的单机版本,内含终极猎手30人版,可变身四种终极猎手.这个版本只有这一种模式,没有其他的幽灵模式.生化模式.爆破模式.团队模式等等,如果想玩上述的模式,你可以在其他地方找.值得注意的是这个 ...

  2. vue跨行跨列动态表格生成

    一.思路步骤: 根据后台传输的数据进行格式转化: 索引为多少的时候进行跨行: <table id="table"> <thead> <tr> & ...

  3. 新发现的几个不错的c++库

    1.coost 包含了各种常用的库,比boost轻量级的基于c++11的库 https://github.com/idealvin/coost 2.ImGui 一个较少依赖的gui界面库 https: ...

  4. 前端下载csv文件

    var str = [ 'ssssssssssssssssssssssssssssssssssssssss' ]; var uri = 'data:text/csv;charset=utf-8,%EF ...

  5. vue 中使用 XLSX 和 xlsx-style 实现前端下载Excel表格

    import XLSX from "xlsx-style"  //ps  需要修改源码:在\node_modules\xlsx-style\dist\cpexcel.js 807行 ...

  6. 解决在宝塔面板IIS服务器上部署svg/woff/woff2字体的问题

    部署网站的字体和服务器IIS有什么关系?如果你的职责只限于一名前端开发,那么你可能很"幸福"地与这些问题擦肩而过,浑然不觉.可是本人一直都是孤军奋战,连开发环境都要自己搭建,这次又 ...

  7. BGP知识点总结(一)

    动态路由协议(工作范围)    1.自治系统内部的路由协议-IGP:工作在同一个AS内,主要用来发现和计算路由,为AS内提供路由信息的交换(ospf,rip,isis)    2.自治系统之间的路由协 ...

  8. vuecli创建项目-vue项目目录介绍-es6导入导出语法-小练习登录功能-scoped

    目录 vuecli创建项目-vue项目目录介绍-es6导入导出语法-小练习登录功能-scoped 今日内容概要 今日内容详细 1 vue-ci创建项目 2 vue项目目录介绍 3 es6导入导出语法 ...

  9. FTP主动模式(Port)和被动模式(Passive)的区别

    1.FTP的PORT(主动模式): PORT中文称为主动模式,工作的原理: FTP客户端(1024以上端口)连接到FTP服务器的21端口,发送用户名和密码登录, 登录成功后要list列表或者读取数据时 ...

  10. C++11之线程库

    在 C++11 之前,涉及到多线程问题,都是和平台相关的,比如 Windows 和 Linux 下各有自己的接口,这使得代码的可移植性比较差.C++11 中最重要的特性就是对线程进行支持了,并且可以跨 ...