使用场景
场景一
大部分公司开发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) |