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的区分
image.png
而Scheme就可以指定Build Setting中的配置是使用的Debug下的配置,还是Release下的配置在起作用
image.png

1.2 添加Scheme

添加一个Configuration
image.png
image.png
此时Scheme中的Build Configuration中的选项多了一个添加的Beta,默认Project创建了Debug和Release两个Build Configuration
image.png
Product—>Scheme—>Manage Schemes添加两个Scheme,命名为Debug和Beta
image.png
对每个Scheme指定对应的Build Configuration,Product—>Scheme—>Edit Schemeimage.png
切换Scheme,达到切换多环境配置

1.3 多Target配置+多Scheme

复制一个Target
image.png
选择新的Target,点击 名称后修改名称 (修改为LoginApp-Dev) , 修改Bound ID 通过Bound ID可以区分两个Target
image.png

在复制Target的时候,会多生成一个Info.plist,可以修改下info的名称(LoginApp-Dev-info.plist),对应的Build Settings—> Packaging—>Info.plist File 对应的新的plist名字
image.png
选择Product—>Scheme—>Manage Schemes,双击选中的Scheme,修改Scheme对应的名字,修改新的Target
image.png
开发者还可以给不同的target配置不同的Icon
image.png
Info.plist文件中可定义同一个Key ,然后通过代码获取key的值,达到多环境的区分
屏幕截图 17-01-2021 21.37.04.png
不同的Target可以配置单独的 Compile SourcesLink Binary With Libraries
image.png

image.png

1.4 在多Scheme下配置环境参数

方式一:预先自定义定义宏在不同的Scheme下取值不同+代码区分
image.png
代码区分
image.png
方式二: 使用Swift的Other Swift Flags(在Beta和Debug下定义Flags,Release下不定义Flags) +代码区分
image.png

⚠️ Other Swift Flags添加自定义的配置时,需先加上 -D swiftc —help | grep — ‘-D’ image.png

代码区分
image.png
方式三: 创建多Scheme + 添加User Define + Info.plist定义变量+代码获取
屏幕截图 17-01-2021 21.38.34.png
屏幕截图 17-01-2021 21.37.04.png
屏幕截图 17-01-2021 21.35.52.png
这样切换不同的Scheme,就可以获取到HOST_URL的不同环境下的配置

1.5 多xconfig文件+多Scheme(推荐使用,cocospod是采用此方式)

添加Configuration Setting File文件
image.png
为Scheme配置Configuration文件
image.png
使用Configuration配置自定义变量
image.png
使用Configuration配置来改变Build Setting中的配置
Build Setting中的配置的Key可参照网站:https://xcodebuildsettings.com

2. xconfig文件冲突解决

2.1 多个Configuration String File文件的问题

通过#include导入其他xcconfig文件
image.png

注意:如果定义的value中有双斜杠,会转义。解决方法是:定义一个单斜杠的变量,然后拼接 image.png

2.2 Configuration String File文件中定义的配置与Build Setting定义了同一个配置,覆盖问题;

的一致,那么会发生覆盖。可以通过$(inherited),让当前变量继承变量原有值
image.png

2.3 通过#include导入的其他xcconfig文件 设置同一个配置,当前的xcconfig会覆盖导入的其他xcconfig文件

  1. OTHER_LDFLAGS = $(inherited) -framework "AFNetworking" -framework "ImageIO"

🎧 在设置配置时,可指定Configuration,sdk ,arch

OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64] = $(inherited) -framework “AFNetworking” image.png

3. xcconfig的书写规范

每个配置文件都由一系列 键值对 分配组成,这些键值分配具有以下语法:

  1. Key = Value

3.1 注释

注释方式 //

3.2 通过#include 导入其他xcconfig设置

创建多个xcconfig文件,通过include关键字导入其他的xcconfig内的配置

  1. //通过相对路径,只要引入${SRCROOT}以下的文件目录
  2. #include "Pods/Target Support Files/Pods-LoginApp/Pods-LoginApp.debug.xcconfig"

在搜索引入的文件时,如果是以/开头,代表绝对路径,例如

  1. // 表示确切的文件位置
  2. #include "/Volumes/disk/ios V9.0/强化班/第一节、符号与链接(下)/上课代码/LoginApp-冲突/Pods/Target Support Files/Pods-LoginApp"

3.3 变量

变量定义,按照OC命名规则,仅由大写字母,数字和下划线(_)组,原则上大写,也可以不。
字符串可以是双引号 " 也可以是单引号 ' 号。
变量有三种特殊情况:

  1. 在xcconfig中定义的变量与 Build Settings 的一致,那么会发生覆盖。可以通过 $(inherited) ,让当前变量继承变量原有值。例如:
    1. OTHER_LDFLAGS = -framework SDWebImage
    2. OTHER_LDFLAGS = $(inherited) -framework AFNetworking

注意⚠️:有部分变量不能通过 xcconfig 配置到 Build Settings 中,eg:配置 PRODUCT_BUNDLE_IDENTIFIER 不起作用。


2. 引用变量, $()${} 两种写法
image.png


3. 条件变量,根据 sdkarchconfig 添加条件,例如:

  1. // 指定`Configration`是`Debug`
  2. // 指定`SDK`是模拟器,还有iphoneos*、macosx*等
  3. // 指定生效架构为`x86_64`
  4. OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*[arch=x86_64]= $(inherited) -framework "Cat"

注意⚠️:在Xcode 11.4及以后版本,可以使用default,来指定变量为空时的默认值

  1. $(BUILD_SETTING_NAME:default=value)

3.4 优先级(由高到低):

  1. 手动配置 Target Build Settings
    image.png
    2. Target 中配置的 xcconfig 文件
    image.png
    3. 手动配置 Project Build Settings
    image.png
    4. Project 中配置的 xcconfig 文件
    image.png