iOS构建多目标工程

作者: Yochi | 来源:发表于2018-02-26 22:31 被阅读121次

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

创建原始工程

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

  • 先创建一个空的iOS工程

  • 组织工程目录
    我这里是用来两个文件,一个是工程文件夹主要放业务代码,一个是公共文件夹主要放通用工具等。


    没有马赛克的高清图
  • 文件配置
    配置Info.plist文件,构建新的目标工程的时候,Info.plist文件会被复制,避免以后每个文件都修改一遍,这个最好一次性修改我。

    • 定位权限
    • 相机权限
    • 相册权限
    • 蓝牙权限
    • 是否允许http网络请求
    • 白名单
    • 微信KEY
    • 等等
  • 拖入公共文件夹并关联路径


    记得关联路径

构建新的目标工程

  • 在现用工程上构建新的目标工程(看图片名操作)


    右键点击Target复制
    点击Duplicate Only
    按回车修改名称
    点击Manage Schemes进入
按回车修改名称
  • 新建新APP文件夹


    像这样,然后将刚刚Copy生成的info.plist修改名称放进去

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

  • 点击Target修改Info.plist文件路径


    $(SRCROOT)/xxx/xxx-Info.plist
  • 将文件件拖入工程,关联指定的Target


    以后所有定制需求或资源都会放这个文件夹下面
  • 创建资源文件夹


    icon,LaunchImage记得加前缀区分
    在这里选择icon和Launch

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

APP功能定制

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


image.png

问题来了,没有关联的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

相关文章

网友评论

    本文标题:iOS构建多目标工程

    本文链接:https://www.haomeiwen.com/subject/nyryxftx.html