iOS进阶_多Configuration

[TOC]

利用多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来更改的。

image-20190427145459385

4.2、正确认识:

他代表着各种配置。

二、问题背景

1、需要多Configuration的问题背景

对话:帮我打个测试包

对话:帮我打个预生产的包吧

对话:预生产测好了,帮我最后打个生产环境的包,我再测下,没问题就可以上线了。

那么,你就可能出现,每次打包的时候,去一个配置里面频繁修改证书(dev、adhoc、appstore/inhouse)。

为了避免每次打不同包,还得去那个Configuration里切换证书,你何不多建个Configuration呢?(Xcode默认的已经有且只有DEBUG和RELEASE两种模式)

2、多Configuration使用的问题背景

2.1、默认情况下的Configuration常见使用

Xcode默认只有DEBUG和RELEASE两种模式,如下图:

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_PreprocessorMacros添加后

Configuration代码区分需用到的知识:

含义 示例
#if 既关心宏是否定义,又关心宏的逻辑的真假
#ifdef
#ifndef
仅仅关心宏是否被定义,不关心宏的逻辑真假

代码区分如下:

1
2
3
4
5
#if DEBUG

#elif PRERELEASE

#endif

至此,Configuration添加完成 。

分割图1