美文网首页
iOS用同一个工程创建多个不同版本的应用------The sa

iOS用同一个工程创建多个不同版本的应用------The sa

作者: 二先生Developer | 来源:发表于2017-08-30 16:28 被阅读59次

    如果同一个应用, 需要做一个带广告Lite版本, 一个不带广告的Pro版本. 那么问题来了, 该如何优雅的去实现呢?
    一般来说有两种实现方法:

    • 一个把当前工程拷贝然后再修改, 这样做会导致后期维护成本过高, 每次修改都要同时改两个工程, 到后期修改简直提心掉胆, 不过操作傻瓜式.
    • 另外一个种就是在一个Project里面创建两个Target, 然后通过判断Target来修改代码, 这样都是基于同一套代码做修改, 只是部分不相同的地方通过Target来添加不同代码, 后期修改维护成本低, 推荐大家使用这种方式.


    1.新增一个target,因为这里我们是建立一个和原来基本一致的target,所以,我们这里可以选择复制来新建一个target


    当你选择复制后,会多出两个文件,如下


    还会在scheme那里多出一个和这个target相关的scheme

    2.上面的名字太难看,我们改个名字,改了名字后,你会发现



    重新选择我们更改后名字的Info plist文件 TestTarget2-info.plist文件(文件名最好是包含info.plist,这个是一个约定,便于以后寻找这个文件)
    我们将那个scheme也更改一下


    还有生成的product的名字也要改一下,切换到TestTargetTest2的Build Settings下,搜索product name,将product name改成我们需要的名字(注意,这个名字只是我们生成的app的名字,不一定是最后的显示的名字,最后显示的名字还要看用户是否在InfoPlist.strings文件中设置了CFBundleDisplayName="测试1";)

    3.切换到TestTargetTarget2这个scheme,运行,
    看看模拟器中,你会发现


    模拟器中有两个测试1了,有些同学在这里并没有生成两个 图标,这个应该是他将两个target的Bundle Identifier都设成了一样的,这个如果一样的话,那生成的target会覆盖上一次的


    4.上面已经生成了两个target,并且也在模拟器上运行成功了,问题来了,我们怎么知道哪个是哪个呢,两个的名字是一样的,不要担心,这个问题很好解决的,即对应的target选择对应的plist文件

    由于共用了一个InfoPlist.stirngs文件,所以,才会出现两个target在模拟器上都显示为 测试1,知道了问题所在,那么下面我们就解决它,
    将目录targetTest2下的Infop.stirngs中的内容修改成 测试2


    5.先选TestTarget这个scheme,运行,在模拟器上会出现 测试1,切换scheme为TestTarget2,运行,在模拟器上将生成 测试2



    切换scheme如图


    一切正确后在模拟器上将会显示

    6.作为附录,其实也比较重要的是,我们很多target共用的代码,资源等,有时候我们在代码中需要区分到底是哪个target,比如说,我们生成的第二个target是一个受限版本,我们需要提示用户(比如是功能受限的免费版本),怎么在代码中区分呢?
    有如下二个方式:

    1. 第一种方式,利用CFBundleIdentifier来判断
    NSString*BundleIdentifier =[[[NSBundlemainBundle]infoDictionary]objectForKey:@"CFBundleIdentifier"];// Do any additional setup after loading the view, typically from a nib.   
     if ([BundleIdentifierisEqualToString:@"yohunl.TestTarget2"]) {      
      //处理代码       
     NSLog(@"TestTarget2-Info.plist");   
     }else {        
    //处理代码      
      NSLog(@"TestTarget-Info.plist");  
      }
    
    1. 第二种方式,定义一个编译器宏,来进行区分,在
      打开TestTarget2,


    注意,上面的 -D是需要的,一般我们对于这种定义宏都大写的
    在代码中可以

    #ifdef TARGET2   
     //target2的处理代码    NSLog(@"TARGET2");
    #else  
     NSLog(@"TARGET1");
    #endif
    

    ------一些注意事项 : ------
    当为项目添加新文件时,不要忘记同时勾选多个 target 来保持各个 target 中的代码一致。


    如果你的项目中使用了 Cocoapods,不要忘记在 podfile 中增加新的 target。我们可以使用 link_with来指定多个 target。现在 Podfile 看起来应该是这样的

    xcodeproj '/Volumes/MYGIT/DY/DY/DY.xcodeproj'  
    platform :ios , ‘8.0’  
    workspace 'DY'  // 这个
    link_with 'DY', 'DYTest'  // 这个
    pod ‘AFNetworking’, ‘> 3.0’
    pod 'Masonry', '0.5.3'
    pod 'RDVTabBarController', '~> 1.1.9'
    pod 'MBProgressHUD', '~> 0.9.2'
    pod 'MJExtension', '~> 3.0.10'
    pod 'MJRefresh', '~> 3.1.0'
    pod 'SDWebImage', '~> 3.7.5'
    

    如果使用了持续集成系统,比如 Travis CIJenkins ,不要忘了每个 target 的构建和交付都要配置。
    Demo地址

    效果图

    相关文章

      网友评论

          本文标题:iOS用同一个工程创建多个不同版本的应用------The sa

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