xcode创建一个工程的多个taget,便于测试和发布多个版本
背景:很多时候,我们需要在一个工程中创立多个target,也就是说我们希望同一份代码可以创建两个应用,放到模拟器或者真机上,或者是,我们平时有N多人合作开发,当测试的时候,在A这里装了一遍测A写的那块,当需要测试B写的代码时,我们需要到B那里去装一遍,如果只有一个target的话,那么A的将会被覆盖
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/0387dbb5ab77cbe58c9a4e283d269528.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/d1d5fbb56fc7546f3ab8d168277a8007.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/f15de825a2375006a8434f7136875501.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/14fddad0ba97977840d51967d8361b6f.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/edb67a192868bf8fde9fc623822d2ad2.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/1035817256e461d050e44f1c32898c7e.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/ef904d8d89f961c4a1883a2e024ec2f1.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/9e57c6f6998a0b1a69b8aabae3c534ad.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/ec12ea8316c5f575aa246b6971667d96.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/ee28ae4c54f68671bbb5470ec77afe67.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/ad6ff1d8ac44f0da2738671ea45c2758.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/79ed0fc765c1730410a310334b712849.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/31e2b68781bebf7b91ee46a76391f27b.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/16d4938ea248b498bd7f5c831879f2d1.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/70c38b798fd5ab909b8fb5e6f79efa6b.png)
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/f1fbb60c83f250d35275145bdcf236cb.png)
- NSString*BundleIdentifier =[[[NSBundlemainBundle]infoDictionary]objectForKey:@"CFBundleIdentifier"];// Do any additional setup after loading the view, typically from a nib.
if ([BundleIdentifierisEqualToString:@"yohunl.TestTarget2"])
{
//处理代码
NSLog(@"TestTarget2-Info.plist");
}
else {
//处理代码
NSLog(@"TestTarget-Info.plist");
}第二种方式,定义一个编译器宏,来进行区分,在打开TestTarget2,
#ifdef TARGET2
//target2的处理代码
NSLog(@"TARGET2");
#else
NSLog(@"TARGET1");
#endif
![](http:///Users/yohunl/Library/Containers/com.evernote.Evernote/Data/Library/Application%20Support/Evernote/accounts/Evernote/yohunl/content/p3893/9521beec91a99818dafe2b92cf525f63.png)
#ifdef TESTTARGET2
//target2的处理代码
NSLog(@"TESTTARGET2");
#else
NSLog(@"TARGET1");
相信很多人都注意到XCode中, 有个Target的概念. 这在很多地方都有所体现, 比如打开一个工程后, 左侧的列表中有Targets一项, 而在工程界面的顶部菜单中, project里面也有多个涉及到Target的项目, 那么这个Target到底是什么呢?
Apple的人是这样说的:“ Targets that define the products to build. A target organizes the files and instructions needed to build a product into a sequence of build actions that can be taken.”
简单的理解的话, 可以认为一个target对应一个新的product(基于同一份代码的情况下). 但都一份代码了, 弄个新product做啥呢? 折腾这个有意思么?
其实这不是单纯的瞎折腾, 虽然代码是同一份, 但编译设置(比如编译条件), 以及包含的资源文件却可以有很大的差别. 于是即使同一份代码, 产出的product也可能大不相同.
我们来举几个典型的应用多Targets的情况吧, 比如完整版和lite版; 比如同一个游戏的20关, 30关, 50关版; 再或者比如同一个游戏换些资源和名字就当新游戏卖的(喂喂, 你在教些什么...)。
以上copy的。
这里不是要讨论如何制作这样的工程,而是选择做与不做。
最近的工作主题时维护制作两个不同版本的代码,相当是完整版和简版的两个项目。
现在我们的处理是放在两个不同目录,以前两个项目是由不同的框架组成,现在经过升级后,很多基础功能都是一样的,但也还是保留放在两个不同地方维护。我一边做一边在想,为什么一样的代码却要放在两个目录下,那时已经发现的bug,只有一个地方得到修复了,这边还是没有的。实现同样的功能,却使用了两份不同的代码和框架。
我理想的情况是,我们只有一个工程,这个工程应该就是一个完整工程,它包含了多个target,编译一次它同时或者单独输出各个不同版本的target即可。
但是,这次升级,我把iphone和ipad的代码和在一起,后来自己测试时,我却有些犹豫了。版本做成,iphone4.0运行的好好的,上ipad,崩了,上iphnoe3.0,起不来。于是代码中出现好多重复的这样的代码
If (isipad)
xxx
else
xxx
我开始在犹豫了。现在只是iphone和ipad放在一起,如果把两个不同版本的target放在一起,那也许更惨了。3.0编译的,要测试ipad的,iphone3,iphnoe4;4.0编译的同样也是。一次改动,所有的都要测试,那维护起来该有多么的小心翼翼,如履薄冰啊。而且代码也变得越来越脏了。
面对经常遇到复杂而又频繁多变的无聊小需求,把鸡蛋放到一个篮子里,或许真不是一个好的选择。相反的我倒是觉得也许现在没有将这两个工程和在一起是一个正确的选择。
取舍之间,我还是比较倾向于合并在一起维护。因为每一次出现一个小的适配,如果忘记两个地方都修改,出现一个又一个深藏的bug,最后应该是满目疮痍。
以前听说在做s60的软件都是单独几种设备适配一个版本,也就是说,需要维护同样的很多分代码,这对于我来说简直是噩梦。
不过做软件就是这样吧,该合的合,该分的还是需要分清楚的,一定要分清楚。
xcode创建一个工程的多个taget,便于测试和发布多个版本的更多相关文章
- 《转》xcode创建一个工程的多个taget,便于测试和发布多个版本
背景:很多时候,我们需要在一个工程中创立多个target,也就是说我们希望同一份代码可以创建两个应用,放到模拟器或者真机上,或者是,我们平时有N多人合作开发,当测试的时候,在A这里装了一遍测A写的那块 ...
- Node.js学习笔记(6)——使用Express创建一个工程
前提是搭建好了环境,node,npm,express:(推荐全局安装) 开始用express创建一个基础工程: express –t ejs microblog 进入文件夹之后 npm-install ...
- Xcode创建子工程以及工程依赖
https://www.jianshu.com/p/f2bc7d155a86 阅读 7858 视频地址 如果文章不详细,点击看操作视频 项目需求:代码抽层,业务逻辑和数据处理要高度抽离,模块化,需要将 ...
- 使用IDEA创建一个SSM工程(非maven)
说在前面的话 直到现在从Eclipse向IDEA转的人越来越多,但是IDEA的项目创建让人摸不清头脑,因此这里我创建一个非maven的ssm工程,供大家练练手,进一步的了解IDEA在项目中的使用. 创 ...
- windows下无法创建django工程的问题
环境:python2.7 django1.7 安装好django后,将C:\Python27\Lib\site-packages\Django-1.7.7-py2.7.egg\django\bin; ...
- IOS开发之小实例--使用UIImagePickerController创建一个简单的相机应用程序
前言:本篇博文是本人阅读国外的IOS Programming Tutorial的一篇入门文章的学习过程总结,难度不大,因为是入门.主要是入门UIImagePickerController这个控制器,那 ...
- 使用Express创建一个简单的示例
1.安装Express 使用npm包安装工具来安装Express安装包,打开npm命令行,输入: npm install -g express 2.创建一个工程 本示例是在windows下创建的,项目 ...
- 用django创建一个简单的sns
用django创建一个简单的sns 1.首先创建一个工程newsns django-admin.py startproject newsns 在工程目录下新建一个文件夹templates,在该文件夹下 ...
- Django命令行相关命令 以及创建一个空白网页的步骤
django相关命令行命令: django.admin.py是Django的一个用于管理任务的命令行工具,manage.py是对django-admin.py的简单包装,每个Django Projec ...
随机推荐
- py文件转exe时包含paramiko模块出错解决方法
问题描述:python代码中包含paramiko模块的远程登录ssh,在用pyInstaller转为exe时报错, 报错提示为“No handlers could be found for logge ...
- 02 Java 的基本类型
Java 的基本类型 Java 包括了八种基本类型,明细如下: Java 的基本类型都有对应的值域和默认值.byte,short,int,long,float以及double的值域依次扩大,前面的值域 ...
- Leetcode 474.一和零
一和零 在计算机界中,我们总是追求用有限的资源获取最大的收益. 现在,假设你分别支配着 m 个 0 和 n 个 1.另外,还有一个仅包含 0 和 1 字符串的数组. 你的任务是使用给定的 m 个 0 ...
- niubi-job:一个分布式的任务调度框架设计原理以及实现
niubi-job的框架设计是非常简单实用的一套设计,去掉了很多其它调度框架中,锦上添花但并非必须的组件,例如MQ消息通讯组件(kafka等).它的框架设计核心思想是,让每一个jar包可以相对之间独立 ...
- hiho[Offer收割]编程练习赛30
题目1 : 提取用户名 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在现在的各种互联网应用中,在一段文字中使用'@'字符来提起一名用户是流行的做法. 例如: &quo ...
- C语言总结(2)
1.函数printf(" ")可以输出双引号中任何固定不变的内容. 2.必须在程序前面加:预处理命令. 3.#include<stdio.h>后面不需要“:”,“:”. ...
- iOS学习笔记33-UICollectionView入门
一.UICollectionView介绍 UICollectionView和UICollectionViewController类是iOS6新引进的API,用于展示集合视图,布局更加灵活,可实现多列布 ...
- ubuntu系统14.04安装php5
背景: 阅读新闻 Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL [日期:2014-05-27] 来源:imcn.me 作者:L ...
- hihoCoder #1343 Stable Members
题目大意$\newcommand{\SD}{\mathrm{SD}}$ 给定一个 $n+1$ 个点的有向无环图,点从 $0$ 开始编号.无重边.自环,且从每个点 $u$ 都能到达 $0$ 号点.如果每 ...
- 刷题总结——跳蚤(poj1091容斥+分解质因数)
题目: Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有 ...