项目开发中,我们经常会遇到多种环境的问题,不同的环境通常会有不同的参数值,甚至会执行不同的代码。当遇到这种情况,我们可以通过runtime调用不同的selector来实现,这里介绍通过不同的schemes来切换不同配置文件。在代码中定义不同的宏来控制最后工程的不同代码。同时,这种方法可以减少编译时间,提高开发效率。
我自己碰到的使用场景是,我们公司的域名一共有4套:
- 开发环境
- 测试环境
- 预发布环境
- 正式环境
1 配置 Build Configuration
这个时候,就会有多套域名,每次打包时,就会特别混乱。(注释掉现在使用的域名,打开原本注释掉的那部分,出差错的可能蛮高的,而且不利于阅读)这个时候,我们就使用它来针对4个环境下不同域名做配置。
1.1 添加Configuration
这里我们添加Dev、Test、Pre、Release。
2. 配置多个schemes
2.1 编辑scheme
添加完第1步的Configuration之后,在Edit Scheme里就会看到新添加的配置项
2.2 更改Preprocessor Macros
第1步里我们直接复制了Debug的配置项,那这里的值就会有问题,需要自己设置。
2.3 在程序里配置对应的Configuration下不同域名
@interface NPDomainConfigure : NSObject
extern NSString *const SERVER_URL;
@end
@implementation NPDomainConfigure
#if DEV_ENV
NSString *const SERVER_URL = @"https://dev.xxx.cn";
#elif TEST_ENV
NSString *const SERVER_URL = @"https://test.xxx.cn";
#elif PRE_ENV
NSString *const SERVER_URL = @"https://pre.xxx.cn";
#elif RELEASE_ENV
NSString *const SERVER_URL = @"https://xxx.cn";
#else
@end
2.4 测试
运行程序,修改Scheme下不同的Configuration,就能得到不同的值,那结果就是正确的了。
基于以上的实验,app还可以在不同环境下配置不同的AppIcon和AppName
3. AppIcon
使用Asset Catalog,分别给各种环境下配置APP 图标,去Target - Build Settings里搜索Asset Catalog App Icon Set Name这一项,如下图所示配置即可:
4. App Name
Target - Build Settings里点+号,添加一个User-Defined Setting
比如我们请一个叫APP_DISPLAY_NAME的key值,如下图配置:
然后进到Target - Info里,修改Bundle name为$(APP_DISPLAY_NAME)
5. 打包配置
开发中可能把测试环境下的版本打包发给Apple,为了避免这件事,可以做一下设置。比如将Release环境以外的Skip Install配置成NO,其他环境就不会Archive出ipa了。