iOS开发进阶iOS 马甲包

iOS构建多目标工程

2018-02-26  本文已影响121人  Yochi

在我们开发过程中,经常会遇到多版本的情况(Pro、Lite、Free)偶尔大佬会让你换个小马甲,这个时候我们改怎么办,哈哈,我教你呀!!!

创建原始工程

原始项目是你打造万丈高楼的基础,要思考思考再思考,基石一旦铺垫再改就难了,亲身体验过程很痛苦。

构建新的目标工程

按回车修改名称

区分版本的方式

预编译宏: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比较多,尽量写英文见名知意,上面其实是一个意思

APP功能定制

定制方式由两种:一个是通过上面的方式来区分代码块,这种情况只适合大部分代码相同的情况。另一种是直接建立类文件,通过关联Target来区分,像下图这样。


image.png

问题来了,没有关联的Target又必须使用它怎么办呢。如果选择关联又会牵扯到其他的类文件。这里我们使用映射。不用导入也可以使用这个类。

UIViewController *viewController = [[NSClassFromString(@"我是类名") alloc] init];

APP换肤

既然是多版本,处理功能,外观肯定也必须有区别,我们如何非常轻松改掉APP的外观呢。

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
上一篇 下一篇

猜你喜欢

热点阅读