多个Target的使用
背景介绍
- 开发过程中,我们会在内网搭建一个测试服务器,开发、测试都是在内网进行的。这样产生脏数据不会影响外网的服务器。外网服务器只有最后发布时才会进行一些必要的测试。
- 还有就是要对同一份代码生成不同的product,比如一个游戏有100关,要生成一个免费版(只有20关),可以新建一个Target,设置参数就可以实现,如果通过代码来控制就太麻烦了。
怎么办
- 针对第一个问题,在代码级别,对这个URL的选择,可以使用简单一点的宏来判断。这样所有的请求只要都调用这个宏,就可以做到控制。但是这样写不少限制,那就是很多工程属性不能设置,比如不能改变
Bundle ID,不能改启动图片,不能改应用名称等。这样的测试版和正式版不能同时安装到同一部手机上,这样测试起来很麻烦,很多情况下我们需要对比正式版和测试版。
#ifndef DEBUG
#define BaseURL @"192.168.1.23" // 内网服务器
#else
#define BaseURL @"112.23.12.34" // 外网服务器(瞎写的)
#endif
- 如果对于上一种方式不满,接下来可以使用更加强大的
TargetsTargets可以使用更多高级功能,比如一个Target对应一个Info.plist- 而
Info.plist中可以修改的属性太多了,什么启动图片,Bundle Id、Main Interface等小改动 - 大的改动,可以修改
Bulid Phases,设置文件的编译,静态库的链接 - 还可以修改
Bulid Settings设置工程的编译、链接属性 - 选择不同的证书,开发环境就开发证书,发布时就选发布证书
- 第二个问题也可以用
Targets来实现,当然通过代码也可以控制,但是代码的话扩展性太差。
Targets操作
复制 Targets
- 新建Xcode时会自动创建一个默认的
Target,我们如果要自己新增的话,可以通过复制的方式快捷创建第二个。 - 复制会将已有的资源以及工程属性copy一份,在这个基础上进行更改即可。

可以看到工程目录中多了一个文件
Xcode的开发版 copy-Info.plist,就是这个新文件,所有的配置都可以在这里进行配置
创建全新Targets
- 可用通过菜单
Editor->Add Target->Application->Singe View Application->Product Name来新增 
Targets之间异同
- 一个Target包含了
Copy Bundle Resources,Compile Sources,Link Binary With Libraries、info.plist等Copy Bundle Resources是指生成的product的.app内将包含哪些资源文件Compile Sources是指将有哪些源代码被编译Link Binary With Libraries是指编译过程中会引用哪些库文件- 最关键的就是
info.plist文件,iPhone项目的很多关键性内容, 比如程序名称, 最终生成product的全局唯一id等都可用info.plist来设置。 - 不同的target还可以定义完整的差异化的编译设置, 从简单的调整优化选项, 到增加条件编译所使用的编译条件, 以至于所使用的base SDK都可以差异化指定
注意事项
- 新增文件、资源等,如果有多个
Target,添加新文件时要注意勾选多个Target 
- 修改新文件
Xcode的开发版 copy-Info.plist- 首先,修改
Target名称 - 然后,修改
plist名称 - 最后,修改
schemes
- 首先,修改
- 设置预编译宏
Target 开发版->Build Settings然后搜索Preprocessor Macros然后增加宏
测试一下,可用通过预编译宏来区别代码
if (DevelopMent == 1) { // 测试一下,选择不同的Schemes就可以看到输出不同
NSLog(@"DevelopMent=1");
}else {
NSLog(@"DevelopMent=0");
}
- 修改
Bundle Identifier和选择不同的证书,让app区分开来- 点击
target: Xcode的测试版->Summary:提示你需要选择plist文件,选择1)中添加的Xcode的测试版.plist; - 点击
target: Xcode的开发版->Summary:设置Bundle Idenfitier; - 点击
target: Xcode的测试版->Build Settings->Code Signing:选择另外的证书;
- 点击
结语
- 现在就可以针对不同的
product设置不同的参数了,生成不同的app那都不是事儿。 - 在代码中通过预编译宏做出区分,然后安心开发app吧
#if DevelopMent == 1
#define BaseURL @"192.168.1.23" // 内网服务器
#else
#define BaseURL @"112.23.12.34" // 外网服务器(瞎写的)
#endif
多个Target的使用的更多相关文章
- MySQL中You can't specify target table for update in FROM clause一场
mysql中You can't specify target table <tbl> for update in FROM clause错误的意思是说,不能先select出同一表中的某些值 ...
- jQuery之常用且重要方法梳理(target,arguments,slice,substring,data,trigger,Attr)-(一)
1.jquery data(name) data() 方法向被选元素附加数据,或者从被选元素获取数据. $("#btn1").click(function(){ $(" ...
- ASP.NET 5 Target framework dnx451 and dnxcore50
中文不知如何定义标题,所以干脆就直接贴出关键字,在 ASP.NET 5 项目的 project.json 配置文件中,会有这样的定义: "frameworks": { " ...
- minSdkVersion maxSdkVersion targetSdkVersion target 的区别
minSdkVersion 描述:app最低支持的sdk版本号 作用:如果手机SdkVersion小于app中定义的minSdkVersion,则android系统不允许安装该app 定义位置:And ...
- MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL
MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL 是因为目标板的芯片处于休眠 ...
- jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the install tool.
jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the ...
- mysql-You can’t specify target table for update in FROM clause错误
mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表( ...
- podfile The dependency `` is not used in any concrete target
内容提要: podfile升级之后到最新版本,pod里的内容必须明确指出所用第三方库的target,否则会出现The dependency `` is not used in any concrete ...
- HTML <a> 标签的 target 属性
HTML <a> 标签的 target 属性 HTML <a> 标签 定义和用法 <a> 标签的 target 属性规定在何处打开链接文档. 如果在一个 <a ...
- window.event.srcElement与window.event.target 触发事件的元素
IE浏览器支持window.event.srcElement , 而firefox支持window.event.target:<input type="text" onblu ...
随机推荐
- 使用strtus2框架的json插件来完成ajax操作
------------------------------------------------------------------------------jsp------------------- ...
- (转)理解YOLOv2训练过程中输出参数含义
最近有人问起在YOLOv2训练过程中输出在终端的不同的参数分别代表什么含义,如何去理解这些参数?本篇文章中我将尝试着去回答这个有趣的问题. 刚好现在我正在训练一个YOLOv2模型,拿这个真实的例子来讨 ...
- iis 中经典和集成模式对应webconfig节点
经典对应<system.web> 集成对应<system.webserver>
- 【luogu P2324 [SCOI2005]骑士精神】 题解
题目链接:https://www.luogu.org/problemnew/show/P2324 不懂怎么剪枝,所以说,,我需要氧气.. 第一道A* // luogu-judger-enable-o2 ...
- WPF中 ItemsSource 和DataContext不同点
此段为原文翻译而来,原文地址 WPF 中 数据绑定 ItemSource和 DataContext的不同点: 1.DataContext 一般是一个非集合性质的对象,而ItemSource 更期望数据 ...
- Docker官方文档翻译2
转载请标明出处: https://blog.csdn.net/forezp/article/details/80158062 本文出自方志朋的博客 容器 准备工作 安装Docker,版本为1.13或者 ...
- Spring技术内幕阅读笔记(一)
1.BeanFactory:实现ioc容器的最基本形式.String FACTORY_BEAN_PREFIX = "&";Object getBean(String var ...
- 优雅的QSignleton (四) 通过属性器实现MonoSingleton
大家都出去过周六了,而我却在家写代码T.T... 接下来介绍通过属性器实现MonoSingleton. 代码如下: MonoSingletonProperty.cs namespace QFr ...
- C++中的头文件(.h)和源文件(.cpp)都应该写什么?
头文件(.h):写定义和声明写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等,但是一般来说不写具体的实现.注意: 1.在写头文件的时候需要注意,在开头和结尾处必须按照如下样式 ...
- MySQL表结构(含数据类型、字段备注注释)导出成Excel
方法一: 1.用的是Navicat Premium,可以换成任意图形化客户端 SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHAR ...




