xcode -- xcode创建一个工程的多个taget多个sheme

来源:互联网 发布:知金教育招聘 编辑:程序博客网 时间:2024/05/18 03:45
xcode创建一个工程的多个taget,便于测试和发布多个版本
背景:很多时候,我们需要在一个工程中创立多个target,也就是说我们希望同一份代码可以创建两个应用,放到模拟器或者真机上,或者是,我们平时有N多人合作开发,当测试的时候,在A这里装了一遍测A写的那块,当需要测试B写的代码时,我们需要到B那里去装一遍,如果只有一个target的话,那么A的将会被覆盖
还有些时候,我们需要确定到底是A的问题还是B的代码出了问题,这时候都需要建立一个工程能够编译多个版本出来,下文就介绍怎么在一个工程中编译多个版本

Xcode scheme 定义了编译集合中的若干target,编译时的一些设置以及要执行的测试集合。

你可以自定义若干个scheme,但是同一时刻只能运行一个.你可以定义scheme是保存于一个工程中,也就是scheme是否针对所有包含那个工程的工作区,否者就只是针对此工作区(ps:我理解为,scheme是否和工程绑定,若干绑定,则此scheme是伴随此产品的,无论工作区变换与否)。当你选中一个运行的scheme时,你也可以选中一个执行目标,也就是此产品会被哪一个硬件编译运行。



好了,闲话不多少,下面正式开始:
我们建立一个默认的应用来演示做法:
建立后的应用如下:



可以看到,上面只有一个target:即TestTarget,为了方便演示,我们给它加上一个多语言,让它在模拟器上的名字是中文
我们在工程的InfoPlist.strings中增加一句:CFBundleDisplayName="测试正式版;
这样在模拟器中安装后显示的是

好了,前序工作已经可以了

1.新增一个target,因为这里我们是建立一个和原来基本一致的target,所以,我们这里可以选择复制来新建一个target

当你选择复制后,会多出两个文件,如下

还会在scheme那里多出一个和这个target相关的scheme




2.
上面的名字太难看,我们改个名字,改了名字后,你会发现


重新选择我们更改后名字的Info plist文件 TestTarget2-info.plist文件(文件名最好是包含info.plist,这个是一个约定,便于以后寻找这个文件)
我们将那个scheme也更改一下



还有生成的product的名字也要改一下,切换到TestTargetTest2的Build Settings下,搜索product name,将product name改成我们需要的名字(注意,这个名字只是我们生成的app的名字,不一定是最后的显示的名字,最后显示的名字还要看用户是否在InfoPlist.strings文件中设置了CFBundleDisplayName="测试1";)





3.切换到TestTargetTarget2这个scheme,运行,
看看模拟器中,你会发现
    模拟器中有两个测试1了,

有些同学在这里并没有生成两个 图标,这个应该是他将两个target的Bundle Identifier都设成了一样的,这个如果一样的话,那生成的target会覆盖上一次的



4.上面已经生成了两个target,并且也在模拟器上运行成功了,问题来了,我们怎么知道哪个是哪个呢,两个的名字是一样的,不要担心,这个问题很好解决的



由于共用了一个InfoPlist.stirngs文件,所以,才会出现两个target在模拟器上都显示为 测试1,知道了问题所在,那么下面我们就解决它,很显然,我们应该针对TestTargetTest2再建立一个InfoPlist.stirngs,
由于我们只是需要名字显示不同,其它都不需要改变的,所以我们可以直接进行复制,将工程目录下的所有的语言的 InfoPlist.strings文件复制一份,建立一个新的文件夹(注意,需要将所有语言的InfoPlist.strings都复制一份,因为多语言嘛,语言的文件夹也要有)
如图


由于我们这里,只有一种语言,
,所以我们targetTest2中只有一个en.lproj文件夹,将targetTest2文件夹下的InfoPlist.strings中的 



将刚添加的文件加到工程中来


添加完后,将原来那个Infoplist.stirngs的target中的targetTest2去掉如下图:



将目录targetTest2下的Infop.stirngs中的内容修改成 测试2



5.先选TestTarget这个scheme,运行,在模拟器上会出现 测试1,切换scheme为TestTarget2,运行,在模拟器上将生成 测试2

切换scheme如图


一切正确后在模拟器上将会显示





6.作为附录,其实也比较重要的是,我们很多target共用的代码,资源等,有时候我们在代码中需要区分到底是哪个target,比如说,我们生成的第二个target是一个受限版本,我们需要提示用户(比如是功能受限的免费版本),怎么在代码中区分呢?
有如下三个方式
第一种方式,利用CFBundleIdentifier来判断
  1. 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,


注意,上面的 -D是需要的,一般我们对于这种定义宏都大写的
在代码中可以
#ifdef TARGET2
    //target2的处理代码
    NSLog(
@"TARGET2");
#else
    NSLog(@"TARGET1");
#endif


第三种方式,这种不需要增加-D的
增加预编译宏


在代码中
#ifdef TESTTARGET2
    //target2的处理代码
    NSLog(
@"TESTTARGET2");
#else
  
    
NSLog(@"TARGET1");
#endif

以上三种方式都可以的


附录二:参考文献
http://finbarrbrady.com/2010/03/building-for-multiple-targets-in-xcode/ 英文
http://www.reigndesign.com/blog/building-flockwork-creating-targets-for-free-and-full-versions-in-a-single-xcode-project/ 英文
http://www.omegasoftweb.com/omega/blog.cfm?p=43 英文
http://blog.csdn.net/ysysbaobei/article/details/10951991 中文 
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玩cs鼠标单点总是连点怎么办 论文出现计算上的错误该怎么办 不戴头盔违法扣分怎么办不了缴费 去法国会说英语不会说法语怎么办 企业有很多费用没有正式发票怎么办 我二张一万元的作废发票掉了怎么办 小规模上月开错税率的票怎么办 一般纳税人开票税率开错了怎么办 电信电子发票代表号码错了怎么办 发票备注栏项目名称写了两遍怎么办 苏州出入境手撕发票弄丢了怎么办 电脑下载过播放器还是不播放怎么办 局域网内的电脑无法互相访问怎么办 浏览器拖动滑动线页面会跳动怎么办 在暴风影音上视频播放不出来怎么办 格式工厂转换格式占内存太大怎么办 手机登陆不上路由器管理界面怎么办 新路由器设置密码后不能上网怎么办 更换网络后无线路由器不能用怎么办 手机登录不了路由器登录业面怎么办 海康威视通道用户被锁定怎么办 无线适配器或访问点有问题怎么办 客户买鞋子说价格贵该怎么办 小米5s刷成真砖后怎么办 手机电源键坏了开不了机怎么办 手机开关键坏了开不了机怎么办 vivo手机解屏密码忘了怎么办 小米max关机后开关键坏了怎么办 联想手机刷机失败无限重启怎么办 红米2a显示白屏怎么办 小米6手机一直处于开机状态怎么办 怎么在手机上看wifi密码怎么办 怎么查自己的宽带密码忘记了怎么办 怎么查自己宽带账号密码忘了怎么办 电脑重置路由器密码连不上网怎么办 e盘和f盘没有了怎么办 复制文件过程中自己卡住了怎么办 电脑卡住了怎么办 鼠标也点不动 善领wifi连上网不能用怎么办 苹果手机软件更新后网速太慢怎么办 装了固态硬盘开机还慢怎么办