因为写面向不同用户的同一款产品体系,多个项目在组织优点麻烦,就尝试搜索了下多target做法。
如下文中,一个应用对应的pro,lite,free多个版本,便可以用多个target。
原文地址:http://www.cnbluebox.com/?p=319
最近新入一个项目组,工程checkout下来以后久久编译报错,各种reference引用错误。甚是头痛,看了半天的工程,发现他们的工程结构有些杂乱,大量的用了workspace ,subProject以及target。原来的项目框架很简单顶多引入一个target,实在对各种环境的配置不甚了解。于是忽猛查资料,下边就是搜索资料的一些汇总。
一:Xcode 环境简介
首先弄清楚一些在XCode环境下的一些概念:
Workspace:
简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的Xcode Project, 以及其他的项目中需要使用到的文件。
使用Workspace的好处有:
1),扩展项目的可视域,即可以在多个项目之间跳转,重构,一个项目可以使用另一个项目的输 出。Workspace会负责各个Project之间提供各种相互依赖的关系;
2),多个项目之间共享Build目录。
Project:
指一个项目,该项目会负责管理生成一个或者多个软件产品的全部文件和配置,一个Project可以包含多个Target。
Target:
一个Target是指在一个Project中构建的一个产品,它包含了构建该产品的所有文件,以及如何构建该产品的配置。
Scheme:
一个定义好构建过程的Target成为一个Scheme。可在Scheme中定义的Target的构建过程有:Build/Run/Test/Profile/Analyze/Archive
BuildSetting:
配置产品的Build设置,比方说,使用哪个Architectures?使用哪个版本的SDK?。在Xcode Project中,有Project级别的Build Setting,也有Target级别的Build Setting。Build一个产品时一定是针对某个Target的,因此,XCode中总是优先选择Target的Build Setting,如果Target没有配置,则会使用Project的Build Setting。
关于如何构建以上环境,请参考devCenter官方指南:
https://developer.apple.com/library/ios/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html
二:Xcode 创建workspace多工程依赖
新建 Xcode workspace
打开 Xcode , 选择 File -> New -> Workspace , 将 Workspace 命名为 Test.xcworkspace , 并选择合适的目录。
三:Xcode 创建子工程以及工程依赖
背景:由于创建一个app的时候需要引入大量的依赖三方库或者自己写的工具类,每次新建app这些事情都需要大量的时间。所以,就考虑建一个公共工程,每次新建项目,只是需要依赖这个工程就行了。
思路设计:①BaseApp,用于存放公共的库。②BaseAppSample用于写demo和示例,方面别人在使用的时候查看和借鉴。
具体步骤:
1、创建BaseApp工程,注意这里被依赖的工程要是Static Library。
2、创建BaseAppSample工程。在BaseAppSample的framework group上面右键,添加文件,选中BaseApp.xcodeproj,建立依赖关系。
行成如上图所示的依赖关系。
3、这样BaseAppSample里面就可以使用BaseApp里面的类了么?开始我以为可以了,可是我错了。在BaseAppSample里面import相关的类会出现找不到的error,会编译错误。需要进行下面的操作:
在Header Search Paths 里面添加引入头文件的路径,如上所示,这样就不会出现编译的error了。
4、等等,好像以为正确,comand + r。Oh,NO,还是有错误。还是编译还出现找不到相关的文件。
这个时候可以判断的是,编译的结果没有能够正确的依赖,进行下面的步骤
添加target的依赖关系,保证编译BaseAppSample的时候先编译BaseApp。
选中BaseAppSample Target,然后选中其Build phases选项,添加BaseApp target
然后把lib也引入依赖中,如下所示:
5、如果被依赖包(BaseApp)中有图片或者依赖文件怎么办?
要把相关的依赖图片copy出去:选中BaseApp target,进入Build phases选项,找到最下面的copy file栏,添加相关的文件:
到这一步,只要command+r,BaseAppSample中就能够正常地引入BaseApp里面的功能了。
以后有公共的组件,只是需要添加到BaseApp中,其他依赖的功能都能够使用了。
为了维护方便,可以把BaseApp用单独的SVN或者Git来维护。
分割线追加:
————————————————————————————————————————
今天右发现新的问题,如果存在category的时候,使用category会导致Crash
解决办法是在Sample里面添加编译的命令:
在Other Linker Flags添加 -Objc和-all_load选项,保证category能够被正常的引入。
原文地址:http://www.ganlvji.com/?p=128
四:在Xcode中添加多个targets
(转载地址: http://blog.youkuaiyun.com/ysysbaobei/article/details/10951991)
在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/