1. 多环境配置的方式
多Target配置 + 多Scheme
Target配置(info.plist, Display name, App Icons Source,LaunchScreen,Bound Indentifier,Compile Source,Link Binary With Libraries),每个Target对应不同的Scheme
配置环境变量 + 多Scheme
每个Scheme配置不同的环境变量(Other Linker Flages,Other Swift Flags,Add User-Defined Settings),在代码中直接获取环境变量是否定义,或者在info.plist中定义变量+代码获取info.plist的key-value
- xcconfig文件配置+多Scheme
将配置写到对应的xcconfig文件里,不同的Scheme对应不同的配置文件
1.1 概念理解
Project
包含项目所有的代码,资源文件,所有信息
Target配置
对指定代码和资源文件的具体构建方式
Scheme
对指定Target的环境配置
打开一个project,进入project的Build Setting,可以看到很多配置都有Debug和Release的区分
而Scheme就可以指定Build Setting中的配置是使用的Debug下的配置,还是Release下的配置在起作用
1.2 添加Scheme
添加一个Configuration
此时Scheme中的Build Configuration中的选项多了一个添加的Beta,默认Project创建了Debug和Release两个Build Configuration
Product—>Scheme—>Manage Schemes添加两个Scheme,命名为Debug和Beta
对每个Scheme指定对应的Build Configuration,Product—>Scheme—>Edit Scheme
切换Scheme,达到切换多环境配置
1.3 多Target配置+多Scheme
复制一个Target
选择新的Target,点击 名称后修改名称
(修改为LoginApp-Dev) , 修改Bound ID
通过Bound ID可以区分两个Target
在复制Target的时候,会多生成一个Info.plist,可以修改下info的名称(LoginApp-Dev-info.plist),对应的Build Settings—> Packaging—>Info.plist File 对应的新的plist名字
选择Product—>Scheme—>Manage Schemes,双击选中的Scheme,修改Scheme对应的名字,修改新的Target
开发者还可以给不同的target配置不同的Icon
Info.plist文件中可定义同一个Key ,然后通过代码获取key的值,达到多环境的区分
不同的Target可以配置单独的 Compile Sources
和 Link Binary With Libraries
1.4 在多Scheme下配置环境参数
方式一:预先自定义定义宏在不同的Scheme下取值不同+代码区分
代码区分
方式二: 使用Swift的Other Swift Flags(在Beta和Debug下定义Flags,Release下不定义Flags) +代码区分
⚠️ Other Swift Flags添加自定义的配置时,需先加上 -D swiftc —help | grep — ‘-D’
代码区分
方式三: 创建多Scheme + 添加User Define + Info.plist定义变量+代码获取
这样切换不同的Scheme,就可以获取到HOST_URL的不同环境下的配置
1.5 多xconfig文件+多Scheme(推荐使用,cocospod是采用此方式)
添加Configuration Setting File文件
为Scheme配置Configuration文件
使用Configuration配置自定义变量
使用Configuration配置来改变Build Setting中的配置
Build Setting中的配置的Key可参照网站:https://xcodebuildsettings.com
2. xconfig文件冲突解决
2.1 多个Configuration String File文件的问题
通过#include导入其他xcconfig文件
注意:如果定义的value中有双斜杠,会转义。解决方法是:定义一个单斜杠的变量,然后拼接
2.2 Configuration String File文件中定义的配置与Build Setting定义了同一个配置,覆盖问题;
的一致,那么会发生覆盖。可以通过$(inherited)
,让当前变量继承变量原有值
2.3 通过#include导入的其他xcconfig文件 设置同一个配置,当前的xcconfig会覆盖导入的其他xcconfig文件
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking" -framework "ImageIO"
🎧 在设置配置时,可指定Configuration,sdk ,arch
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64] = $(inherited) -framework “AFNetworking”
3. xcconfig的书写规范
每个配置文件都由一系列 键值对
分配组成,这些键值分配具有以下语法:
Key = Value
3.1 注释
注释方式 //
。
3.2 通过#include 导入其他xcconfig设置
创建多个xcconfig文件,通过include
关键字导入其他的xcconfig内的配置
//通过相对路径,只要引入${SRCROOT}以下的文件目录
#include "Pods/Target Support Files/Pods-LoginApp/Pods-LoginApp.debug.xcconfig"
在搜索引入的文件时,如果是以/
开头,代表绝对路径,例如
// 表示确切的文件位置
#include "/Volumes/disk/ios V9.0/强化班/第一节、符号与链接(下)/上课代码/LoginApp-冲突/Pods/Target Support Files/Pods-LoginApp"
3.3 变量
变量定义,按照OC
命名规则,仅由大写字母,数字和下划线(_
)组,原则上大写,也可以不。
字符串可以是双引号 "
也可以是单引号 '
号。
变量有三种特殊情况:
- 在xcconfig中定义的变量与
Build Settings
的一致,那么会发生覆盖。可以通过$(inherited)
,让当前变量继承变量原有值。例如:OTHER_LDFLAGS = -framework SDWebImage
OTHER_LDFLAGS = $(inherited) -framework AFNetworking
注意⚠️:有部分变量不能通过
xcconfig
配置到Build Settings
中,eg:配置PRODUCT_BUNDLE_IDENTIFIER
不起作用。
2. 引用变量, $()
和 ${}
两种写法
3. 条件变量,根据 sdk
、 arch
和 config
添加条件,例如:
// 指定`Configration`是`Debug`
// 指定`SDK`是模拟器,还有iphoneos*、macosx*等
// 指定生效架构为`x86_64`
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*[arch=x86_64]= $(inherited) -framework "Cat"
注意⚠️:在
Xcode 11.4
及以后版本,可以使用default
,来指定变量为空时的默认值
$(BUILD_SETTING_NAME:default=value)
3.4 优先级(由高到低):
- 手动配置
Target Build Settings
2.Target
中配置的xcconfig
文件
3. 手动配置Project Build Settings
4.Project
中配置的xcconfig
文件