一个项目配置多个Target

在项目中我们有时候会有需要应对不同的开发环境,比如企业版本和AppStore版本等。由于不同的target,他的配置文件也不同,所以在打包的时候可以自定义不同的配置信息。今天我们通过在一个项目中使用多个Target来实现这一需求。

在学习之前最好对xconfig中的概念有所了解, 不了解的可以参看本文附件一.

如何创建多个Target

方式一:

直接复制原target,步骤: 选中project文件 -> 选中需要复制的Target -> 右键Duplicate(或者command + D), 如下图

图片

方式二:

菜单中: File -> New -> Target 弹出的窗口中选择 Single View App, 如下图

图片

图片

图片

两种方式的不同:方式一新建的target与源target共用一套代码, 方式二是一个全新的app(当然可以通过处理后共用一套公共资源,具体方法点我).

今天主要讲解共用一套代码的情况, 也就是方式一,所以下面的内容都是以方式一新建target为前提

做基本配置(能让新target跑起来)

修改新建的Target的名称(此步骤可无, 主要是方便区分)

直接双击新target,然后修改即可, 此处修改为MultiTargetTwo(源Target名为MultiTarge)

修改Scheme的名称(此步骤可无, 主要是方便区分,建议修改为和新建的Target名称一致)

工具栏点击target -> 选中 manage schemes -> 选中需要重命名的target, 然后再次点击即可修改(注意不要双击)

修改info.plist

新的Target还没有对应新的info.plist, 所以还无法运行,我们可以在项目文件夹中复制原来的info.plist命名为infoTwo.plist然后拖入工程中.注意拖入工程时选择对应的target, 如下图所示

图片

配置plist路径

如下图,info.plist file 的路径修改为上面的infoTwo.plist

OK, 至此两个target都能运行起来了, 接下来就讲解多个target的神奇功效.

多Target宏的用途

配置不同网络环境

先自定义宏(方法链接), 然后根据宏(#if, #elseif, #endif)判断编写不同的网络环境

配置不同证书

按照正常的方式, 在不同的target里面配置不同的证书即可.

配置不用资源文件

根据宏定义区分加载不同的资源

配置不同app名称, 启动图, icon

不同的app名称:

  • 方式一: 选中要修改的target –> Build Settings –> 搜索 product name –> 修改

  • 方式二: 选中要修改的target –> Build Setting –> 点击加号 –> 点击 Add User-Defined Setting –> 设置键名 Custom_Product_Name(名字随意取) –> 设置一个键值(此值即为即将使用的app名称) –> 打开对应target的info.plist文件 –> 找到 Bundle name 这个键 –> 修改其值为 $(Custom_Product_Name)

不同的启动图:

在Assets.xcasset文件中新建一个 LaunchImage 文件夹 –> 命名为 LaunchImage2 –> 然后按照常规方式设置应用icon –> 选中target –> info –> App icon and Luanch Images –> Luanch image sour 选择LaunchImage2(如下图)

图片

启动图设置有两种方式, 一种时LaunchScreen.storyboard方式, 第二种种你是通过资源文件的方式. 以上方式仅适用于第二种方式

不同的App icon

在Assets.xcasset文件中新建一个 AppIcon 文件夹 –> 命名为 AppIcon2 –> 然后按照常规方式设置应用icon –> 选中target –> Build Setting -> 搜索icon,找到Asset catalog App Icon Set Name, 修改为刚刚新建的AppIcon2即可

除了在build Settings 中设置之外, 还可以像设置不同的启动图方式那样直接在 info 中设置

还有一种方式可以实现多套环境区分 那就是配置configuration, 具体方法参考此文

附件一: xcconfig文件配置概念。(Xcode Workspace、Xcode Scheme、Xcode Project、Xcode Target、Build Settings)

Xcode Project

  • An Xcode project is a repository for all the files, resources, and information required to build one or more software products. A project contains all the elements used to build your products and maintains the relationships between those elements. It contains one or more targets, which specify how to build products. A project defines default build settings for all the targets in the project (each target can also specify its own build settings, which override the project build settings).

project就是一个个的仓库,里面会包含属于这个项目的所有文件,资源,以及生成一个或者多个软件产品的信息。每一个project会包含一个或者多个 targets,而每一个 target 告诉我们如何生产 products。project 会为所有 targets 定义了默认的 build settings,每一个 target 也能自定义自己的 build settings,且 target 的 build settings 会重写 project 的 build settings。

Xcode Project 文件会包含以下信息,对资源文件的引用(源码.h和.m文件,frame,资源文件plist,bundle文件等,图片文件image.xcassets还有Interface Builder(nib),storyboard文件)、文件结构导航中用来组织源文件的组、Project-level build configurations(Debug\Release)、Targets、可执行环境,该环境用于调试或者测试程序。

Xcode Target

  • A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defines a single product; it organizes the inputs into the build system—the source files and instructions for processing those source files—required to build that product. Projects can contain one or more targets, each of which produces one product.

target 会有且唯一生成一个 product, 它将构建该 product 所需的文件和处理这些文件所需的指令集整合进 build system 中。Projects 会包含一个或者多个 targets,每一个 target 将会产出一个 product。需要注意的是, Project 可以包含多个 target, 但是在同一时刻,只会有一个 target 生效,可用 Xcode 的 scheme 来指定是哪一个 target 生效。

Build Settings

  • A build setting is a variable that contains information about how a particular aspect of a product’s build process should be performed. For example, the information in a build setting can specify which options Xcode passes to the compiler.

build setting 中包含了 product 生成过程中所需的参数信息。project的build settings会对于整个project 中的所有targets生效,而target的build settings是重写了Project的build settings,重写的配置以target为准。

一个 build configaration 指定了一套 build settings 用于生成某一 target 的 product,例如Debug和Release就属于build configaration。

Xcode Scheme

  • An Xcode scheme defines a collection of targets to build, a configuration to use when building, and a collection of tests to execute.

一个Scheme就包含了一套targets(这些targets之间可能有依赖关系),一个configuration,一套待执行的tests。

可能遇到的问题

如果是OC和Swift混编, 那么可能回应为桥接文件, 或者一些其他配置导致编译不通过. 因为OC引用Swift文件,系统会自动生成一个 项目名称-Swift.h的文件, 在OC引用Swift时需要使用 #import “项目名称-Swift.h”来导入此文件, 我们新建新的Target时系统会自动生成 项目名称-Swift.h文件, 此时就会和原来项目中的不一致, 解决办法如下:

1
Build settings --> 搜索 swift compile --> 找到 Objective-C Generaged Interface Header Name ---> 更改其值和原来Target一致即可

联系方式

邮箱: objc_china@163.com