iOS构建多目标工程

在我们开发过程中,经常会遇到多版本的情况(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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容