iOS-多Target那些事儿

引入

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

///生产
#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引用的头文件里面,而后其余用不到的两个,注释掉,这种方式有必定的缺点:ios

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

这时候能够为项目建立Target,用现有的默认Target做为生产环境,再分别建立一个内测、本地开发环境Target,打包时用生产Target直接打包,须要什么环境的Api,直接切换到不一样的Target编译运行便可。git

建立Target

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

配置info.plist

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

 

 配置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,至此环境参数宏配置完成ui

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

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

修改前的Podfile文件内容3d

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

修改后的Podfile文件内容code

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;

相关文章
相关标签/搜索