经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
iOS-多Target那些事儿
来源:cnblogs  作者:macro小K  时间:2020/11/9 15:59:54  对本文有异议

引入

记得之前说过一遍关于通过配置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;

原文链接:http://www.cnblogs.com/wangkejia/p/13870051.html

 友情链接: NPS