
使用场景
场景一
大部分公司开发App时,都会分为debug环境和release环境,同时接口也是区分环境的,平时的开发和测试都是debug环境下,打包上线的时候改为release环境
场景二
制作马甲包,也就是在原来app的基础上,只修改app的名称,icon,LaunchImage,替换app中带有app名称的文本,并用另一个开发者账号发布,马甲包的数量不定。手动在代码里更改环境变量,替换图片肯定是不可取的,这里我们采用Configuration来实现这两个需求。定义好不同的Configuration后,就可以分别设置 Build、Archive、Test等操作分别使用哪一个 Configuration 进行编译,从而可以轻松地分离开各个环境变量的设置。
流程
新建Configuration
选择PROJECT -> Info -> Configurations,点击+别分选择Debug和Release,并重新命名为Debug-Beta和Release-Beta分别代表马甲包的两个Configuration,顾名思义,Debug是用来开发调试的,而Release用于打包发布的,区别是Debug模式下预编译的宏DEBUG=1,Release不能调试程序,并且Release编译时做了优化

配置完成后的效果如下

pod install
新建Scheme
完成了上一步的Configuration后,这里我们新建Scheme,命名为001-App配置多环境以及马甲包的制作-Beta,先 New Scheme,然后在Manage Scheme,大致操作如下:

先点击New Scheme,新建一个名为001-App配置多环境以及马甲包的制作-Beta的Scheme.

然后在Manage Scheme,注意:勾选Shared

最后在Edit Scheme中把Run和Archive模式改成对应的Build Configuration

点击Archived,然后选择对应的Release-Beta

配置AppIcon和LaunchImage
新建App Icons & Launch Images,创建AppIcon-Beta和LaunchImage-Beta


接下来我们工程中配置对应的AppIcon和LaunchImage,选择Targets -> Building Settings,搜索asset,按下图配置即可

此时选择不同的Scheme运行,你会发现不同的Scheme已经有不用的AppIcon和LaunchImage
配置App名称、Bundle ID 和证书
- 配置App名称
在 PROJECT -> Building Settings -> + -> Add User-Defined Setting,即增加用户自定义设置,添加一个App名称的设置,为不同的Configuration配置不同的App名称。

然后在Info.plist中设置Bundle display name,为我们自定义设置的key,即${CUSTOMAPPNAME}

- 配置Bundle ID和证书
不同的马甲包,肯定是不同的bundle identifier,也就意味着需要不同的证书管理,那么此时设置TARGETS -> Build Settings中搜索bundle,设置Product Bundle Identifier

证书配置如下

其他配置
根据Configuration配置不同的预编译宏,在TARGETS -> Build Settings -> Preprocessor Macros进行配置,比如渠道号、接口域名等

1 | #ifndef PrefixHeader_pch |

如何巧妙的使用编译宏定义让代码在不同情况下执行
关于预编译宏定义如下
1 | #ifdef SERVER_ENV |
如果标识符SERVER_ENV已经被#define过了,则对代码块一进行编译,否则对代码块二进行编译。
同时也有#ifndef,则与#ifdef刚好相反。
- OPTIMIZE
用于release和debug的判断,当选择了OPTIMIZE时,可以让代码在Release模式下执行,在Debug模式下不执行
1 | #ifndef __OPTIMIZE__ |
- i386 与 x86_64 :用于模拟器环境和真机环境的判断。满足该条件的代码只在模拟器下执行。示例代码如下:
1 | #if defined (__i386__) || defined (__x86_64__) |
- IPHONE_OS_VERSION_MAX_ALLOWED :当前编译的SDK版本,可以与IPHONE_9_0等宏定义进行比较,进行不同版本下代码的执行。示例如下:
1 | if (__IPHONE_OS_VERSION_MAX_ALLOWED == __IPHONE_9_0) |