在我们开发过程中,经常会遇到多版本的情况(Pro、Lite、Free)偶尔大佬会让你换个小马甲,这个时候我们改怎么办,哈哈,我教你呀!!!
创建原始工程
原始项目是你打造万丈高楼的基础,要思考思考再思考,基石一旦铺垫再改就难了,亲身体验过程很痛苦。
先创建一个空的iOS工程
-
组织工程目录
我这里是用来两个文件,一个是工程文件夹主要放业务代码,一个是公共文件夹主要放通用工具等。
-
文件配置
配置Info.plist文件,构建新的目标工程的时候,Info.plist文件会被复制,避免以后每个文件都修改一遍,这个最好一次性修改我。- 定位权限
- 相机权限
- 相册权限
- 蓝牙权限
- 是否允许http网络请求
- 白名单
- 微信KEY
- 等等
-
拖入公共文件夹并关联路径
构建新的目标工程
-
在现用工程上构建新的目标工程(看图片名操作)
-
新建新APP文件夹
记得修改Bundle Identifier和选择不同的证书,让app区分开来
-
点击Target修改Info.plist文件路径
-
将文件件拖入工程,关联指定的Target
-
创建资源文件夹
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
可以写英文更直观
#ifdef EPark_AATarget
/* 处理1 */
#elif defined EPark_BBTarget
/* 处理2 */
#else
/* 处理3 */
#endif
APP功能定制
定制方式由两种:一个是通过上面的方式来区分代码块,这种情况只适合大部分代码相同的情况。另一种是直接建立类文件,通过关联Target来区分,像下图这样。
问题来了,没有关联的Target又必须使用它怎么办呢。如果选择关联又会牵扯到其他的类文件。这里我们使用映射。不用导入也可以使用这个类。
UIViewController *viewController = [[NSClassFromString(@"我是类名") alloc] init];
APP换肤
既然是多版本,处理功能,外观肯定也必须有区别,我们如何非常轻松改掉APP的外观呢。
换图片
1、通过代码区分:判断当前目标工程,选择指定图片
2、目标工程关联:确保图片名称相同,不同图片关联不同的目标工程。-
换颜色
换肤前,要把文字颜色,主色调抽离出来,用宏定义。
当需要更换颜色是,直接修改对应的宏即可。
当然也可能遇到渐变色的情况,写一个UIView的扩展,直接插入渐变颜色的数组和位置即可(位置0 1之间)。
UIView (PKRAddGradualLayer)
- (CAGradientLayer *)addGradualLayerframe:(CGRect)frame
colors:(NSArray *)colors
opacity:(CGFloat)opacity
startPoint:(CGPoint)startPoint
endPoint:(CGPoint)endPoint
{
if (colors.count == 0) {
return nil;
}
NSMutableArray *cColors = [NSMutableArray array];
for (UIColor *color in colors) {
[cColors addObject:(__bridge id)color.CGColor];
}
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.opacity = opacity;
gradientLayer.startPoint = startPoint;
gradientLayer.endPoint = endPoint;
gradientLayer.frame = frame;
gradientLayer.colors = cColors;
[self.layer insertSublayer:gradientLayer atIndex:0];
return gradientLayer;
}
小注意
在使用预定义宏叛变代码时:
#ifdef MACRO1
/* 处理1 */
#elif defined MACRO2
/* 处理2 */
#else
/* 处理3 */
#endif
只有处理1或处理2或处理3一个下面的代码是高亮有提示的,其它的都是白茫茫一片,键入代码也没有任何提示。
这样让我们编程很麻烦。为了流畅键入代码,我们需要再弄个扩展:
#import "NSObject+PKRMultipleTarget.h"
@implementation NSObject (PKRMultipleTarget)
/** 运行的是否为这项目 */
- (BOOL)city_isRenqiuParking
{
#ifdef EPark_RenqiuTarget
return YES;
#endif
return NO;
}
- (BOOL)city_isZhuzhouParking
{
#ifdef EPark_ZhuzhouTarget
return YES;
#endif
return NO;
}
- (BOOL)city_isHefeiParking
{
#ifdef EPark_HefeiTarget
return YES;
#endif
return NO;
}
@end
外界调用:
if([self city_isHefeiParking]) {
、、、
}
关于Appdelegate的,建议只使用一个,里面使用代码判别属于哪个Target,方便我们管理,避免造成过多冗余类。
关于图片资源的管理,定制图片放在对应的.xcassets文件夹下,公共资源放在基础模块下。
关于Cocopods的使用,每个Target都要设置,如下图:
platform :ios, '8.0'
target 'EPark-Base' do
pod 'AFNetworking'
end
target 'EPark-RenqiuParking' do
pod 'AFNetworking'
end