一、背景
iOS开发中经常遇到需要根据不同环境,配置不同的请求路径,或走不同代码逻辑的需求。但是默认的环境配置只有Debug和Release,可能无法满足实际需求。比如,我们需要在内测环境使用企业级开发证书,实现无上限分发测试,或者我们需要在APP内嵌入H5页面,上线前需要切换正式环境测试,但是又不能直接替换正式环境的包,就需要copy一个包使用不同的访问路径,相应的app内配置的路径也要修改,那么我们就需要增加一个内测环境,根据环境不同使用不同证书和路径。
二、实现步骤
1、创建新的Configuration环境
选中项目的Project,在info标签下找到Configurations,默认有Debug和Release。点击+号。选择Duplicate “Release” Configuration,这里我取名叫Adhoc。

2、配置证书
选择项目的target,选中Signing & Capabilites,分别配置需要的证书,包括bundle id、应用名称等也可以根据环境配置不同的id和名称。

需要注意的是,XCode直接连接手机调试不管什么环境都只能使用开发证书,生产证书是不能用于调试的,只能用于编译打包后分发。若使用生产证书调试,运行后会报错如下:

额外补充下,XCode的证书管理机制
- 使用手动证书管理:Build(⌘B) 和 Run(⌘B)时Xcode会根据设置选择证书和profile描述文件。
- 使用自动改证书管理:Build(⌘B) 和 Run(⌘B)时Xcode会默认选择开发证书和描述文件。
- 使用archive打包:不管是自动还是手动管理证书,XCode都会根据环境自动切换开发或生产证书。
3、添加宏定义
选择项目的target,选中Build settings,搜索找到Preprocessor Macros,在Adhoc中添加ADHOC=1宏定义。

4、条件编译
根据宏定义环境变量配置不同路径和代码逻辑
//app请求路径
#if DEBUG
//测试环境
#define H5Path @"https://www.test.com:443/"
#elif ADHOC
//内测环境
#define H5Path @"https://www.adhoc.com:443/"
#else
//正式环境
#define H5Path @"https://www.prduct.com:443/"
#endif
//H5项目路径
#if DEBUG
//测试环境
#define H5Path @"https://www.test.com/h5/vescort_h5"
#elif ADHOC
//内测环境
#define H5Path @"https://www.prduct.com/h5/vescort_h5_test"
#else
//正式环境
#define H5Path @"https://www.prduct.com/h5/vescort_h5"
#endif
//日志输出控制(仅debug环境打印日志)
#if DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"[%s:%d行] %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(FORMAT, ...) nil
#endif
5、运行新环境
切换Run > Build Configuration环境为Adhoc,在运行就可以了。如果使用cocopods管理项目的话,添加环境后需要再次运行pod install才能编译新的环境。

运行pod install后会在pod文件夹下面看到adhoc文件

如果build configuration无法完全满足需求,也可以通过设置不同的Target或Scheme来实现根据不同的配置打包不同的app。
5330

被折叠的 条评论
为什么被折叠?



