Xcode添加多个Target

Target概念

Target 是用来指定一个需要构建(build)的产品,其中包含了从project或workspace中的一系列文件在构建时的信息。Target定义了一个简单的产品;它将输入信息打包进编译系统(包含构建中必须的源文件和处理源文件的说明)。项目(Project)中可以包含一个或者多个Target,每一个都可以产生一个产品。

构建产品的说明是以构建信息(build settings)和构建阶段(build phases)组成,你可以在Xcode项目编辑器(product editor)中编辑这些说明。Target继承项目的构建设置(build settings),但是你可以通过在不同的target level指定不同的设置信息来重载它。(其实也可以在All中也可以自行修改。对应的在Level中系统会进行更新,如图-1)。同时只能存在一个可用的target;Xcode scheme来指定哪一个是可用的。

图1

target和它的产品可以跟另一个target关联。如果一个target进行构建时需要另一个target的输出作为输入信息,前者依赖后者。如果他们都是在同一个workspace,Xcode可以发现依赖关系,并按顺序来构建产品。这种关系成为隐性依赖(implicit dependency)。你也可以在构建设置(build settings)中指定依赖关系,并且指定两个实际上没有依赖关系的target成为隐性依赖关系。举个例子,你可能在同一个workspace中创建一个library和一个需要链接该library的application。Xcode可以发现这个关系,并且首先构建library。然而你想链接本workspace之外的library,你需要在构建设置(build settings)中创建一个显性依赖来重载这个隐性依赖。

优点:可以在一个项目中配置两个版本。减少切换环境的工作量。

创建一个新的Target

进入项目设置,右击当前的target,选择Duplicate
图2

图3
此时生成一个名为xxcopy的target。


配置Dev Target

双击更改新Target名字。

但是scheme的名字是通过点击设备左边的scheme->manage schemes,双击修改scheme名称,如下图
图8

注意左边目录会生成一个targetTest copy-Info.plist。
为了便于管理,进入该info.plist路径。将它移动到和Info.plist同级目录下,顺便给他改个名字加到工程目录中。我这里改成了devInfo.plist。

此时DevTarget一定会出问题。。。因为Info.plist路径变了

来到DevTarget构建设置(build settings)里搜索info.plist,并更改plist路径即可
图4

定义宏来配置代码中环境切换

本图是开启level窗口试图。更直观的看出继承关系一些。在构建设置中搜索preprocessorMacro,将DevTarget增加Dev=1,将原target增加Dev=0,反正这里的宏是由你自己定义的,只要代码中做出对应修改就可以了。
对于Objective-C的项目,拓展Preprocessor Macros在Rebug和Release区域添加一个变量。对于开发target(即testDev),将该值设置为DEVELOPMENT = 1。另一个,将值设为DEVELOPMENT=0来表示生产版本。
图5
对于swift的项目,编译器不再支持预处理指令。作为替代,它使用编译时的属性和build配置。选中开发target,添加一个标识表示开发版本。找到Build Setting往下滚动到Swift Compiler - Custom Flags部分。将值设为-DDEVELOPMENT表示这个target作为开发版本。
图9

刚才我在代码中配置好了环境切换开关,现在来试一下
图6
图7
OK!完工了


Tips:
在使用Git时,如果是在除主干分支的其他分支上创建的多Target而没有merge到主干分支上。当删除掉该git重新clone一份切换到之前创建target的分支上。你会发现之前设置的scheme消失了,但target仍然存在,记得重新添加一下scheme就可以了。

坚持原创技术分享,您的支持将鼓励我继续创作!