让同一iphone项目能编译两个版本--正式版、lite版
博客原文地址: 在同一iphone项目添加lite版在同一iphone项目添加lite版(二)
作为基本的推广手段,缩减关键功能,增加ADMob或iAD的lite版应用是必要的。
但为了lite单纯另开一个项目,不断在在lite和完整版项目中同步代码,肯定是不行的,最好的办法,就是在同一个xcode project中添加一个Target。
步骤如下:
1、在左边的Groups&Files窗口中找到Target节点
2、在原来的Target上点右键,选Duplicate
3、将复制出来的新Target Rename为yourappname-lite

4、对应的,在项目下的Resources目录下会添加一个 yourappname-info copy.plist,将它重命名为yourappname-lite-info.plist
5、打开Project菜单,Set Active Target 为lite

6、再选择下面的Edit Active Target "*****name-lite"菜单
7、在打开的表单中,修改以下值:
7.1 Product Name --> yourappname-lite
7.2 Info.plist file --> yourappname-lite-Info.plist
7.3 Preprocess Macros --> LITE_VERSION (这里是为编译器设置一定预定义的值,这样的话,在代码中可以用这个值来判断,当前是完全版或者lite版)
8、搞完后,把xcode关掉,再打开项目,这一步一定要做,看能不能编译,并在模拟器中跑出第二个应用,如果不行,根据提示可能会要拷出拷入些文件,每次都重启下xocde的项目
9、能跑起来后,通过如下代码,为不同版本提供不同功能:
#ifdefined(LITE_VERSION)UIAlertView *alertVersion =[[UIAlertView alloc]
initWithTitle:nil
message:@"This is lite version"delegate:nil
cancelButtonTitle:@"cancel"
otherButtonTitles:nil];
[alertVersion show];
[alertVersion release];
#endif
如果想更加彻底的对两个版本做一些区别,比如两个版本包中的文件不一样,两个版本加载的库不一样(比如正式版就不用加载AdMob模块),程序一开始的入口就不一样,该怎么办呢?
- 在上一集中,我们Duplicate出了一个xx-lite的Target,也Copy出了一个xx-lite-info.plist(注意,plist和引用的外部.a文件是不用包进Target里的Copy Bundle Resources里的,否则会在编译时,出现一些莫名的Warnning,如果包进去了,请在左侧的Groups&Files窗口中展开你的Target,找到删除之),打开plist文件,里面有一项“Main nib file base name”,将值改一下,比如MainWindow-Lite。这样,程序启到时,加载的就不是原来的MainWindow,而是另一个MainWindows-Lite.xib文件了。然后,通过Copy或手工的方式,把原来的MainWindows和xxxAppDelegate.m复制一份出来,命令改成相应的xx-Lite。打开MainWindows-Lite.xib,将里面的xxx APP Delegate对象的Type改成 xxxAppDelegate_lite,这样的话,程序一开始加载的AppDelegate也不同了。然后再去改你的AppDelegate_lite.m,比如添加AdMob功能之类,如果View也要变,把ViewController换掉都随你了,反正,从xib到后端代码的入口,你都可以控制。还是在Target的界面里,把不同版本不需要的.a文件啊,.m文件,图片啊,都清理一下,这样不同的版本,编译出来大小就会是两个版本的交集了。