• iOS-多Target那些事儿


    引入

    记得之前说过一遍关于通过配置xcconfig文件,各取Debug与Release同一个宏的参数值的文章,特别是在不同的环境,测试环境Api与正式环境Api的区别,但是如果一个项目,有线上版本,有内测版本,有开发版本等等,或者有各种不同环境的Api,不同的环境下,宏值的区分,这时候用多Target最为合适不过;在发版时,选中生产Target编译打包;举个例子,如果一个项目Api有三个环境值要区分:

    ///生产
    #define API_URL @"http://www.xkapi.com/"
    
    ///内测
    #define API_URL @"http://www.xkapi0000.com/"
    
    ///本地
    #define API_URL @"http://1.1.1.12:0000/"

    你可能会将上面的代码写在PCH文件或者PCH引用的头文件里面,然后其他用不到的两个,注释掉,这种方式有一定的缺点:

    每次修改PCH文件里面的引用与宏,项目重新编译会比较慢
    频繁切换同一个宏,在正式发版打包时,会偶尔失误或者忘记是否变更到了生产Api

    这时候可以为项目创建Target,用现有的默认Target作为生产环境,再分别创建一个内测、本地开发环境Target,打包时用生产Target直接打包,需要什么环境的Api,直接切换到不同的Target编译运行即可。

    创建Target

    点击项目名称,可以看到TARGETS里面的Target,默认一个,右键点击默认的Target名称,然后点击Duplicate,直接复制一个现有的Target,这里直接复制两个,然后对新建的两个Target分别重命名,用DEV作为本地开发环境,BETA作为内测环境,然后会发现,在新建Targe的同时,系统新创建了info.plist,其实不同的Target,可配置不同的info.plist文件,但是也可直接删除这两个info.plist文件,后面直接再引用默认的info.plist就行;

    配置info.plist

    新Target删除了默认的info.plist文件后,选中新Target会提示让选择info.plist文件,点击选择info.plist文件,会弹出选择框,只需要将项目一开始默认的Target的info.plist配置到新的Target上就可以了,选好后,切换下不同的Target就可以看到项目名称,版本号编译号等等;也可以通过选中Target 点击Build Settings,然后搜索 packaging,可以在info.plist File选中配置即可,将两个新建的Target都进行配置;

     

     配置Target环境参数

    为了能在使用不同的Target编译,让系统自动获取不同的Target环境下配置宏 Api 的值,我们需要为每一个Target配置一个共同的参数,并赋予不同的值,来区分不同的Target,参数名可自定义,但每个Target必须同一个参数名,这里使用 DEVELOP_ENV 参数作为示例,参数添加:

    1、选中Target,点击Build Settings 搜索 preprocessing
    2、找到 Preprocessor Macros
    3、双击 Preprocessor Macros 后面的空白区域
    4、在弹出的弹框中,点击下面的“+”号,添加 DEVELOP_ENV 参数并赋值

     

    按照步骤为每一个Target都添加 DEVELOP_ENV 参数,生产环境参数值为1,本地开发环境参数值为0,内测环境参数值为2,至此环境参数宏配置完成

    修改 Podfile 文件(未使用Pod忽略)

    在未添加多Target时,pod只为一个Target服务,那么就需要稍微改一下 Podfile文件,让pod为每个Target服务

    修改前的Podfile文件内容

    platform :ios, '10.0'
    source 'https://github.com/CocoaPods/Specs.git'
    inhibit_all_warnings!
    target 'XKProject' do
      pod 'MJRefresh'
    end

    修改后的Podfile文件内容

    platform :ios, '10.0'
    source 'https://github.com/CocoaPods/Specs.git'
    inhibit_all_warnings!
    targets = ['XKProject','XKProject-DEV','XKProject-BETA']
    #循环
    targets.each do |t|
      target t do
        pod 'MJRefresh'
      end
    end

    多Target使用

    围绕刚开始的目的说说,不同环境,系统使用自定义宏 Api 的值不同,现在修改PCH或PCH引用的头文件里的 API宏

    修改宏

    修改前

    ///生产
    #define API_URL @"http://www.xkapi.com/"
    
    ///内测
    //#define API_URL @"http://www.xkapi0000.com/"
    
    ///本地
    //#define API_URL @"http://1.1.1.12:0000/"

    修改后

    ///生产、线上 - 对应Target DEVELOP_ENV参数值
    #define ENV_PRO 1
    ///开发 - 对应Target DEVELOP_ENV参数值
    #define ENV_DEV 0
    ///内侧 - 对应Target DEVELOP_ENV参数值
    #define ENV_BETA 2
    
    
    #if DEVELOP_ENV == ENV_PRO
    ///生产
    #define API_URL @"http://www.xkapi.com/"
    #elif DEVELOP_ENV == ENV_DEV
    ///开发
    #define API_URL @"http://1.1.1.12:0000/"
    #else
    ///内测
    #define API_URL @"http://www.xkapi0000.com/"
    #endif

    编译测试

    选中开发环境Target(XKProject-DEV),编译后运行,打印 API_URL

     打印结果

    http://1.1.1.12:0000/

    选中内测环境Target(XKProject-BETA),编译后运行,打印 API_URL

     打印结果

    http://www.xkapi0000.com/

    选中生产环境Target(XKProject),编译后运行,打印 API_URL

     打印结果

    http://www.xkapi.com/

    注意事项

    项目中使用多Target后,在创建类文件时,默认文件会自动添加到默认Target,需要手动勾选其他Target;

  • 相关阅读:
    The Game
    棋盘问题(dfs)(类似8皇后)
    dfs---之全排列
    Dijkstra算法(求单源最短路径)
    四点共面 (简单题)
    最长递增子序列
    线段的重叠
    kruskal
    hdu 1232 畅通工程
    无限对拍程序
  • 原文地址:https://www.cnblogs.com/wangkejia/p/13870051.html
Copyright © 2020-2023  润新知