ios开发时,在Xcode中添加多个targets进行版本控制

原创 2013年09月03日 00:04:27

    在ios开发时,我们经常会遇到对同一个app开发多个版本(Pro、Lite、Free)的情况,这里就涉及到xcode里通过添加多个targets来进行版本控制的问题了,下面就简单说明一下:

     点击左侧的工程名称,右侧会出现PROJECT和TARGETS,点击你现在的target,假如叫A,右键弹出菜单中,选择Duplicate,复制一个相同的target,复制的target一般叫A copy,A copy和A的设置(编译条件、源文件、资源文件)完全一样,此时你可以根据需要修改A copy的编译条件和资源文件了;


1、A copy的名称是不是显得不够专业?现在来修改一下:

1)首先修改Xcode左上角的target名称:

点击xcode左上角Run、Stop右边的工程名称,下拉框中选择Manage Schemes,在弹出框中,点击A copy那行,点击一次、再点击一次,就可以修改A copy为你想要的名字了,比如ALite;

2)修改xcode左下方Products下的A copy.app名称:

点击Targets下你刚才改名后的ALite,点击Bulid Setting,搜索Packaging下的Private Headers Folder Path,修改A copy.app/PrivateHeaders为:ALite.app/PrivateHeaders;


2、修改Bundle Identifier和选择不同的证书,让app区分开来

1)新target需要的.plist文件

      新建一个文件夹X,添加X到项目中,添加时选择target为ALite,不要选target A了,因为不是共用的;复制原来target的A-Info.plist到X,修改其名称为ALite-Info.plist,xcode中右键Add File To ...,选择添加到target ALite中;

2)点击target: ALite ->Summary:提示你需要选择plist文件,选择1)中添加的ALite-Info.plist;

3)点击target: ALite ->Summary:设置Bundle Idenfitier;

4)点击target: ALite->Build Settings->Code Signing:选择另外的证书;


3、修改程序名称

     一般说来,多个target的程序名称不同,复制zh-Hans.lproj和en.lproj下的InfoPlist.strings文件到X,xcode中右键Add File To ...,选择添加到target ALite中;然后修改InfoPlist.strings的内容:CFBundleDisplayName="程序名称Lite";

4、2个target到现在就创建好了,你添加资源文件的时候,通过选择添加的target来控制不同版本的内容;再说一下预编译宏的事情:target->Build Setting,搜索:Preprocessor Macros,设置Debug和Release里的预编译宏内容,比如TARGET_VERSION_LITE=1表示lite版本(注意=前后不能右空格,有空格会编译不过),程序中对不同版本这样判断:

#if TARGET_VERSION_LITE ==1

...

#elif TARGET_VERSION_LITE ==2

...

#endif




参考文章:

1、http://blog.163.com/lengfeng_04/blog/static/80470603201273111549529/

XCode 同一Project创建多个target  

由于项目需求,同一项目需要发两个版本,两个版本只有小部分不同,特地研究了一下target,小有了解,把创建target的经过记录在案,方便过后查看,如有疏漏,请网友指正。


创建target有两种方式,

1是通过新建target可以通过File-->New-->Target,然后选择其中一个模板来创建,app类型的target,可以选择Empty Application模板,不过新建的target有自己的AppDelegate和main,这点还没研究好,如何与原来的AppDelegate和main复用

2.另一种方法是通过对原有的target做duplicate,复制一份,目前只研究了如何通过duplicate来新建target,做下记录。

假设原来的target名字为A,我们需要新建一个target B


1. 在原来的target上右键,选择duplicate,Xcode会复制一个名为A copy的target对象,同时生成一个A copy-info.plist和A copy的scheme

2. 改名

a)对A copy target改名,可以直接单击target来修改,改成B

b)A copy-info.plist,默认生成在程序环境根目录,也就是A.xcodeproj的同级目录中,如果想放到里层(比如与A-info.plist放在同级目录),可以先在Xcode删除A copy-info.plist索引,然后拷贝文件到制定目录中,然后更名为B-info.plist,在add到project中。在Project的Build Settings中,修改Info.plist File选项为B-info.plist的目录(相对路径),这样就可以看到Info页了(就是B-info.plist),接着修改ProductName和Bundle identifier,使之成为另一个app。Prefix Header的路径,视具体需求而定是否要修改,如果两个target可以公用同一个Prefix Header,那么就不需要修改这里的路径

c)修改scheme,在调试的Stop按钮边上,我们可以选择本工程中所有的target来做编译,如果不修改,在这里选择出来的名字就是A copy,为了与新建的target统一起来,同样也要修改这里的名字。点击scheme选择区,然后选Manager Scheme,找到A copy,然后改成你需要的名字,比如B


用duplicate的好处是,如果两个target的相同点很多,用duplicate,就可以把相关的设置全部拷贝过来,而不需要做过多的修改


生成一个新的target,一定会与原target有区别,这里可以定义预编译宏,来区分两个版本的不同代码,预编译宏可以在Build Settings中Preprocessor Macros定义,比如在我们新建的target B中定义预编译宏MACRO,然后在代码中通过

#if defined (MACRO)

//target  B需要执行的代码

#else

//target A需要执行的代码

#endif

来区分


其他:Build Phases(各target编译所包含的内容,需要注意的是,如果创建了target B后,再往A里面添加资源或文件,target B中不会自动增加这些资源,需要手动添加)

1.Compile Sources

需要编译的代码文件

2.Link Binary With Libraries

编译所依赖的库

3.Copy Bundle Resources

编译需要的资源

每个target可以根据具体需要增减里面的内容


2、http://kan.weibo.com/con/3550176548481250?_from=text

http://stackoverflow.com/questions/1807377/xcode-multiple-targets-multiple-internationalized-names

同一份代码多个Target,在支持多语言下分别设置其名称的方法

真不好用一个标题来概括这个东西。Xcode 4.2+ 在项目多语言包 xx.lproj 里引入了一个叫 InfoPlist.strings 的文件,可以对同一个 App 在不同系统语言下显示不同的 Display Name。比如:

InfoPlist.strings (English) -

"CFBundleDisplayName" = "English Name";
InfoPlist.strings (Chinese) - "CFBundleDisplayName" = "中文";

在单 Target 下很容易做,多 Target 的时候就需要做一点额外的处理。在项目目录下新建与 Target 同名的文件夹(同名是为了方便区分),然后将 xx.lproj 文件夹 复制 到各个 Target 下面,目录结构会是这个样子:

./Target1/          
en.lproj/InfoPlist.strings          
 zh-Hans.lproj/InfoPlist.strings
./Target2/          
en.lproj/InfoPlist.strings          
 zh-Hans.lproj/InfoPlist.strings

复制后保持项目目录下还有 xx.lproj 文件夹,里面保留 Localizable.strings,因为多语言化一般是通用的,没必要针对每一个 Target 做多语言。复制后的 Target1/xx.lproj 下只有 InfoPlist.strings。然后添加到 Xcode 项目里,打开 Xcode - Views - Utilities (Command+Option+0),在 Target Membership 下针对不同的 Target 把对应文件夹下的 InfoPlist.strings 对应连接起来,Done。


Xcode中同一Project创建多个target的总结

关于Targets,Apple的人是这样说的:“ Targets that define the products to build. A target organizes the files and...
  • LXL_815520
  • LXL_815520
  • 2016年03月29日 15:12
  • 4276

iOS开发,Xcode添加多个target

以前公司一直用的企业号做的产品,但是今日需要提交到AppStore。里面有一些小的区别,这时候,就需要另外创建一个target来控制两个版本。   具体操作步骤如下:   1.点击左侧的工程名称,...
  • H_Qiao
  • H_Qiao
  • 2016年01月27日 14:35
  • 1120

iOS Xcode 同一个Project创建多个target

目前在Xcode中创建target有两种方式,下面分别对这两种创建方式做详细的解说 第一种:通过新建target(File ——> New——>Target) 1.创建新工程,如下图所示: 2.创...
  • Asong_ge
  • Asong_ge
  • 2017年02月08日 19:46
  • 1135

[iOS高级]Xcode中的Target介绍和简单使用

可以看到已达到想要的效果,总的来说,选中一个Target后可以更改与之相关的各种属性,如Info、Build Setting、Build Phases等,来生成不同的app。 本文中提到链接: 苹果官...
  • zyb050607
  • zyb050607
  • 2015年04月30日 17:00
  • 7134

Xcode中同一Project创建多个target的总结

Project,Target,Product三者的关系 网上有一句通俗的解释,感觉挺好:"project就是一个项目,或者说工程,一个project可以对应多个target. 比如一个xxx游戏的pr...
  • Aaidong
  • Aaidong
  • 2016年12月01日 17:25
  • 1000

XCode 同一Project创建多个target

由于项目需求,同一项目需要发两个版本,两个版本只有小部分不同,特地研究了一下target,小有了解,把创建target的经过记录在案,方便过后查看,如有疏漏,请网友指正。 ...
  • yongyinmg
  • yongyinmg
  • 2014年11月10日 19:30
  • 17284

Xcode工程创建多个target

Xcode工程创建多个target   小菜本人有时候会在一个Xcode工程中新建多个包含main函数的.m文件用于用于学习Objective-C,于是要用到target这个东西。target对应...
  • DayDreamingBoy
  • DayDreamingBoy
  • 2014年03月30日 16:36
  • 6736

XCode工程中关于Targets的介绍

相信很多人都注意到XCode中, 有个Target的概念. 这在很多地方都有所体现, 比如打开一个工程后, 左侧的列表中有Targets一项, 而在工程界面的顶部菜单中, project里面也有多个涉...
  • yongyinmg
  • yongyinmg
  • 2014年04月14日 18:08
  • 12164

iOS——中使用多个Target去管理环境版本

前言 在实际开发中,为了保证所开发的产品能够尽量完美上线,在上线前会特意测试几轮,保证所开发的应用没有问题。但是又能保证测试的一些垃圾数据不影响线上的版本数据,此时就需要区分生产环境了,一般在测试的...
  • u012189584
  • u012189584
  • 2017年12月21日 10:58
  • 144

使用代码为 Xcode 工程添加文件

http://www.tuicool.com/articles/iMvMZnQ   http://deltax.me/bei-xcodeproj-keng-de-zhe-ji-tian/ 主题 X...
  • a351945755
  • a351945755
  • 2015年06月05日 18:49
  • 16224
收藏助手
不良信息举报
您举报文章:ios开发时,在Xcode中添加多个targets进行版本控制
举报原因:
原因补充:

(最多只允许输入30个字)