zoukankan      html  css  js  c++  java
  • 用同一个工程创建两个不同版本的应用

    Eat-Smart-513-2b.jpg

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

    一般来说有两种实现方法:

    1. 一个把当前工程拷贝然后再修改, 这样做会导致后期维护成本过高, 每次修改都要同时改两个工程, 到后期修改简直提心掉胆, 不过操作傻瓜式.

    2. 另外一个种就是在一个Project里面创建两个Target, 然后通过判断Target来修改代码, 这样都是基于同一套代码做修改, 只是部分不相同的地方通过Target来添加不同代码, 后期修改维护成本低, 推荐大家使用这种方式.

    • 不想看教程的童鞋, 点击这里可以下载我已经完成好的代码.

    创建两个Target:

    1.首先先选中Target一个已经存在的版本, 右键 Duplicate

    blob.png

    2.然后在弹出来的选择框选择 Duplicate Only

    blob.png

    3.创建完之后你的新Target应该是和我的一样, 接下来我们就要修改Target, Scheme, Info-plist, 如图这样修改:

    blob.png

    blob.png

    4.修改完了之后Target, Scheme, plist的名字之后, 你需要在新的Target添加对应的plist文件, 修改CFBundleDisplayName就可以修改应用的名字了.

    blob.png

    blob.png

    blob.png

    5.还要记得修改一下Product Name 不然你的Bundle Identifier的后缀名有copy和你的Target名字不一样, 你还需要在Bundle Setting做一下修改.

    blob.png

    开始为两个不同的应用添加不同的AppIcon, LaunchImage

    在这个选择使用Images.xcassets里面设置AppIcon和LaunchImage, 注意这里一个是AppIcon,另一个是AppIcon-2, 以后编译Target的时候他就会跟随这里的设置去拿了开机图和Icon

    blob.png

    blob.png

    blob.png

    2.进入Images.xcassets看下图片是不是都是勾选了两个Target, 保持和我下图一样的勾选, 如果没有勾选的话, 你在编译的不同Target的时候会获取不到资源.

    blob.png

    3.选择不同Target进行编译, 你的运行结果应该和我的截图一样, 有着不同的AppName和AppIcon,还有不同的LaunchImage,但是代码是共用, 到这里你已经成功了一半了, 接下来你肯定是想知道如何在代码里面区别不同Target, 然后给它们添加其他的特性.

    blob.png

    在代码里面利用宏定义来区分不同的Traget

    1.在Bundle Setting里面设置一下Proprecessor Macros添加一份KFREE  KPRO的参数来区分到底是那个Traget. 在代码里面为需要用到这个宏去判断代码块.

    blob.png

    blob.png

    2.在代码里面添加Proprecessor Macros里面宏定义, 你就会发现编译之前Xcode就会智能的选择不同代码. 这样你就共用一个项目管理两个不同版本的应用了, 大部分的代码都复用, 维护管理非常轻松.

    blob.png

    blob.png

    总结:

    苹果每年都会推出新的技术, 都是为了减少开发成本和更好的设计, 作为开发者的开发模式应当和苹果的理念一致. 用最优雅, 简洁的方式去实现功能.

    #ifdef LITE_VERSION
        //Stuff for Lite version
        NSLog(@"222222222");
    #else
        //Stuff for Full version
        NSLog(@"333333333");
    #endif
        
    #ifndef LITE_VERSION
        //Code exclusively for Full version
        NSLog(@"444444444");
    #endif
        
    #if LITE_VERSION
        NSLog(@"555555555");
    #elif PROJECT
        NSLog(@"666666666");
    #endif
    //SampleProject
    2016
    -05-03 17:12:00.793 SampleProject[5100:295192] 333333333 2016-05-03 17:12:00.794 SampleProject[5100:295192] 444444444 2016-05-03 17:12:00.794 SampleProject[5100:295192] 666666666
    //SampleProject Lite
    2016
    -05-03 17:12:32.718 SampleProject Lite[5112:296122] 222222222 2016-05-03 17:12:32.719 SampleProject Lite[5112:296122] 555555555
  • 相关阅读:
    Jhipster 一个Spring Boot + Angular/React 全栈框架
    从企业架构到智慧油田的理论与实践
    DevExpress VCL 的 cxDBTreeList 的使用方法
    Delphi 三层框架 DataSnap 的服务器端设置
    雷达方程
    雷达方向信号产生
    目标
    流水线&并行处理
    CORDIC原理与FPGA实现(2)
    CORDIC原理与FPGA实现(1)
  • 原文地址:https://www.cnblogs.com/fengmin/p/5455733.html
Copyright © 2011-2022 走看看