利用xcconfig文件完成多环境配置
利用xcconfig
文件完成多环境配置
xcconfig
本质上是一个key-value
配置文件xcconfig
文件命名建议: 所在目录-Project名称.环境
(参考CocoaPods
)xcode build settings
环境参数缩写查询资料: xcodebuildsettings
一、xcconfig
文件的创建和配置导入
新建
xcconfig
文件, 保证项目结构清晰, 单独新建目录管理xcconfig
配置文件Project
-Configurations
下, 为不同的Configurations
选择不同的xcconfig
文件
这里xcconfig
文件的创建和导入配置就完成了
同时通过截图可以看到, 有两层入口, 可以直接配置Project
, 也可以针对Target
进行配置导入
二、结合多环境hosts
的配置, 利用xcconfig
实现
分别在上面新建的
xcconfig
文件下新增以下内容, 用来模拟网络请求的域名Config-MultiEnvByXCConfig.Release.xcconfig
HOST_URL = 127.0.0.1
Config-MultiEnvByXCConfig.Debug.xcconfig
HOST_URL = 127.0.0.2
注意
Value
前后不要添加"
如果是域名,//
会被识别为注释, 解决方案是提前声明一个/
的变量SLASH=/ HOST_URL = http:${SLASH}/127.0.0.1
{}和()等价
在
Info.plist
中添加xcconfig
内的环境变量代码中使用
NSString *hostURL = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"HOST_URL"]; self.describeLabel.text = hostURL;
这样就完成了xcconfig
多环境的简单配置
但是这样简单的操作下来, 调试时仍然不够方便, 如果需要验证多环境, 起码目前是需要在Edit Scheme
中切换Debug
/Release
的
可以结合Scheme
为不同的Configurations
设置不同的Scheme
, 每次编译不同环境, 直接切换Scheme
, 而不是一个Scheme
修改Configurations
来切换环境
xcconfig
更强大之处是在控制Build settings
中的选项, 将零散的配置项汇总到xcconfig
配置文件中, 保证一个环境下的配置一目了然的目的
三、xcconfig
来设置Build Settings
选项
Other Linker Flags
平时配置动态库/静态库会设置
Other Linker Flags
, 比如现在想要配置AFNetworking
, 在Config-MultiEnvByXCConfig.Release.xcconfig
文件中增加如下配置// ld -> build settings 中的 Other Linker Flags OTHER_LDFLAGS = -framework "AFNetworking"
编译
Release
这个Configurations
, 切换到Build Settings
下检查Other Linker Flags
选项刚刚
Config-MultiEnvByXCConfig.Release.xcconfig
同步生效了, 因为只设置了一个xcconfig
文件, 对比Debug
中是没有包含的并且支持条件参数
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64]=-framework "AFNetworking"
四、xcconfig
冲突
通过上面导入xcconfig
配置可见, 导入选项是单选, 只能选择指定某一个xcconfig
配置文件
在使用CocoaPods
后, 默认提供了Debug
和Release
的xcconfig
配置
将Debug
下的配置改为自定义的, 再次执行pod install
结束后提示
[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `MultiEnvByXCConfigWOConflict` to `Target Support Files/Pods-MultiEnvByXCConfigWOConflict/Pods-MultiEnvByXCConfigWOConflict.debug.xcconfig` or include the `Target Support Files/Pods-MultiEnvByXCConfigWOConflict/Pods-MultiEnvByXCConfigWOConflict.debug.xcconfig` in your build configuration (`MultiEnvByXCConfigWOConflict/Config/Config-MultiEnvByXCConfigWOConflict.Debug.xcconfig`).
由于我们存在自定义配置, 所以CocoaPods
并不会强制去覆盖选中的xcconfig
处理方案
- 在自定义
xcconfig
中导入CocoaPods
的xcconfig
#include "Pods/Target Support Files/Pods-MultiEnvByXCConfigWOConflict/Pods-MultiEnvByXCConfigWOConflict.debug.xcconfig"
注意前面需要补充根目录
Pods/
这种处理方案仍然存在问题
两个不同的xcconfig
设置相同的KEY
, 以目前的场景, 在我自定义的xcconfig
中#include
了CocoaPods
的xcconfig
, 在Pod
的xcconfig
中会设置OTHER_LDFLAGS
并导入Podfile
中的依赖库, 在我自定义的xcconfig
中最后会覆盖掉Pod
的xconfig
, 冲突仍然存在
决绝方法
- 继承
$(inherited)
确保最终的xcconfig
配置KEY
时使用$(inherited)
继承导入的xcconfig
配置
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
注意谁才是最终在
Project
-Configurations
中的选中的xcconfig
五、优先级(由高到低)
- 手动配置
Target Build Settings
Target
中配置的xcconfig
文件- 手动配置
Project Build Settings
Project
中配置的xcconfig
文件