iOS 项目多环境搭建
- 基于Target来搭建多环境
基于Target来搭建多环境的项目,本质上就是对原有Taeget进行Duplicate操作。
这样会Copy一份与原有Target相同的Target Copy。
此时也会生成一份copy的info.plist文件
这个时候就可以针对不同的Target做差异性配置,包括AppIcon,BundleID等。
缺点就是,当新创建的新文件的时候会根据需要是否加入另一个Target了。
- 基于Build Configuration和Xcode Scheme来搭建多环境
1、点击+号创建需要的Configurations,然后修改名称
2、点击Manage Schemes然后创建对应的Scheme
3、根据不同的Scheme配置不同的Configuration
这样就配置了三个不同环境的项目环境了。
那如何给不同的项目环境配置不同的参数呢?
这里就可以采用xcconfig配置文件了。cmd + n创建三个不同名的配置文件。
然后在Build Settings中设置不同的配置文件。
然后在不同的配置文件中设置不同的值。
MultiEnvironmentDemo.debug.xcconfig 文件
PRODUCT_BUNDLE_NAME = debug-demo
MultiEnvironmentDemo.release.xcconfig 文件
PRODUCT_BUNDLE_NAME = release-demo
然后在info.plist配置Bundle name = $(PRODUCT_BUNDLE_NAME)
最后在不同的环境中生成的APP的name是不同的
问题一:如果项目使用了CocoaPods来管理第三方库,会生成对应的xcconfig文件或者项目中同一个环境有多个xcconfig配置文件,那么如何处理呢?
这个时候可以将对应的xcconfig文件引入我们一个xcconfig中然后使用。
// 引入cocopods生成的配置文件,Configurations中还是配置使用当前的xcconfig文件
#include "./Pods/Target Support Files/Pods-MultiEnvironmentDemo/Pods-MultiEnvironmentDemo.debug.xcconfig"
PRODUCT_BUNDLE_NAME = debug-demo
问题二:如果多个xcconfig配置文件中配置了对应key的值如何才能不会覆盖呢?
例如:
a.xcconfig配置如下
OTHER_LDFLAGS = -framework "Rswift"
b.xcconfig配置如下
OTHER_LDFLAGS = -framework "SnapKit"
解决办法就是在b中引入a加上$(inherited)
#include "a.xcconfig"
OTHER_LDFLAGS = $(inherited) -framework "SnapKit"
条件变量,根据SDK、Arch、Configuration对设置进行条件化
// 指定`Configuration`是debug
// 指定SDK是模拟器,还有iphoneos*、macosx*等
// 指定生效的架构为X86_64
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*[arch=x86_64]= $(inherited) -framework "Foundation" -l"CertUtils"
优先级右低到高:
1、Project中配置的xcconfig文件
2、手动配置的Project Build Settings
3、Target中配置的xcconfig文件
4、手动配置的Target Build Settings