利用多Configuration打包不同环境
前言
序言:
现象:Xcode默认只有DEBUG和RELEASE两种模式。
问题:如果我们在项目中想增加预发布环境或者再增加其他多个环境呢?
错误(不当)做法:如果在项目中用if else 弄个全局变量来控制,每次打包之前去手动修改,这样不仅繁琐,而且还会出错。
正确(推荐)做法:下面来一下在Xcode中添加多个环境变量的方法.
详细做法参考:使用Xcode增加环境变量(多种环境区分),不再累诉。
一、认识
1、几个描述文件的认识与区别
通过以下表格,你将认识到为什么你这个环境需要使用这个描述文件打包,用其他描述文件会有什么问题。
| 描述文件类型 | 可安装的设备 | 证书环境(开发/生产) | 使用的推送 | 描述文件使用的环境(测试/预生产/生产) |
|---|---|---|---|---|
| development | 已注册的设备 | 开发环境的证书 | 测试环境的推送 | 测试环境 |
| adhoc | 已注册的设备 (查看描述文件即可知道它没法做到在所有设备上都能安装的) |
生产环境的证书 | 生产环境的推送 (这个创建描述文件的时候你就该知道的) |
预生产环境 |
| appstore/ inhouse |
所有的设备 | 生产环境的证书 | 生产环境的推送 | 生产环境 |
2、几种环境的认识
| 环境 | 需要可以安装的设备 | 需要测试的推送 |
|---|---|---|
| 测试环境 | 在《已注册的设备》上可安装即可 | 测试环境的推送 |
| 预生产环境 | 至少《已注册的设备》上都能够安装吧 | 生产环境的推送 |
| 生产环境 | 要《所有的设备》上都能安装才行 | 生产环境的推送 |
3、环境与描述文件的总结
| 环境 | 应该使用的描述文件 | 备注 |
|---|---|---|
| 测试环境 | development | 不需要上线 |
| 预生产环境 | adhoc | 不需要上线 |
| 生产环境 | appstore / inhouse | 需要上线 |
4、Configuration的认识
4.1、错误认识
只知道Archive打包的时候使用的是Release模式,殊不知任何操作Archive打包的时候使用的模式都是可以通过Edit Scheme来更改的。

4.2、正确认识:
他代表着各种配置。
二、问题背景
1、需要多Configuration的问题背景
对话:帮我打个测试包
对话:帮我打个预生产的包吧
对话:预生产测好了,帮我最后打个生产环境的包,我再测下,没问题就可以上线了。
那么,你就可能出现,每次打包的时候,去一个配置里面频繁修改证书(dev、adhoc、appstore/inhouse)。
为了避免每次打不同包,还得去那个Configuration里切换证书,你何不多建个Configuration呢?(Xcode默认的已经有且只有DEBUG和RELEASE两种模式)
2、多Configuration使用的问题背景
2.1、默认情况下的Configuration常见使用
Xcode默认只有DEBUG和RELEASE两种模式,如下图:

通常我们的做法:
| Configuration | 通过作为什么环境使用 |
|---|---|
| DEBUG | 开发环境 |
| RELEASE | 生产环境 |
2.2、默认情况下的Configuration使用的问题
问题:如果我们在项目中想增加预发布环境或者再增加其他多个环境呢?
| 错误(不当)做法 | 正确(推荐)做法 | |
|---|---|---|
| 项目 | 从一开始就没考虑到Configuration的使用,在项目中用if else 弄个全局变量来控制,每次打包之前去手动修改 | 根据需要新增的环境个数,增加对应的Configuration个数。 |
| 原因 | 这样不仅繁琐,而且还会出错 | 确保不用修改代码,只需要在Edit Scheme中修改想要使用的Configuration即可。 |
三、操作步骤
1、生成新的Configuration(只能使用Duplicate方式)
1.1、Duplicate方法略。
1.2、Duplicate后,必须需要修改的东西
| 必选需修改项 | 操作方法 | 得到 |
|---|---|---|
| 更新新增Configuration使用的Pod | 重新执行pod install | |
2、Configuration区分
需求背景:区分配置
解决办法:为Target的Prerelease Configuration在Preprocessor Macros中添加宏,如添加PRERELEASE=1。
- 在Preprocessor Macros中为我们刚新增的Prerelease的Configuration中添加
PRERELEASE=1后

Configuration代码区分需用到的知识:
| 含义 | 示例 | |
|---|---|---|
#if |
既关心宏是否定义,又关心宏的逻辑的真假 | |
#ifdef#ifndef |
仅仅关心宏是否被定义,不关心宏的逻辑真假 |
代码区分如下:
1 | #if DEBUG |
至此,Configuration添加完成 。
