xcconfig 使用

在实际开发中,现在很多需求会要求马甲包开发。同一份代码,不同的 bundle ID / icon / 包名等。通常来说,有多种方式可以来完成这个任务。一则使用多个 target 来进行管理,但是这种方式在笔者看来并不讨喜。可能会存在文件漏加的情况;二则是使用多个 config 来配置,笔者比较推荐这种。这也是本文所要介绍的。算是一个比较实用的技巧吧。

一、首先需要新建一个 xcconfig。

1

假设新建 Debug_1.xcconfig 和 Release_1.xcconfig 。

2

二、接着在 project - info - configurations 创建两个新的 configutation 。(Debug_1 和 Release_1)

3

并且选择对应的 xcconfig。

4

三、在 Debug_1 中可以配置一些我们需要的参数。比如说

1
2
3
4
5
6
7
8
Debug_1.xcconfig
// 必须先 #include
#include "Debug_1.xcconfig"
// 使用 Cocoapods 管理第三方库的话,需要将对应的配置也 include 进来。
#include "Pods/Target Support Files/Pods-ConfigDemo/Pods-ConfigDemo.debug_1.xcconfig"
APP_NAME = DEBUG_1

之后,在 Build Settings - Product Name 将对应的 Debug_1 改成$(APP_NAME)需要$(自定义)这样的方式来确定对应的配置选项。

5

其实,也可以单独在此处更改成对应的配置。但是使用一个单独的配置文件,实际上会更加美观。

另外也可以进行一些比较负责的组合。比如想要在 app 名称后面增加一个 debug 标示等。比如

1
2
3
APP_NAME = $(TARGET_NAME)_debug
APP_NAME = $(TARGET_NAME)_$(VERSIONING_SYSTEM)

当然,也可以做一些特定的标示,比如指定架构等。如 iOS SDK。

1
APP_NAME[sdk=iphoneos*] = $(TARGET_NAME)

有个比较简单的方法,可以选中任意的配置项。

6

复制粘贴到所建的 xcconfig ,可以直接看出对应的配置,并且可以进行修改。比如 Product Name。

7

其次,我们也可以利用 xconfig 来进行其他信息的存储。

1
2
// Custom URL Host, 该字段存储数据,需在 info.plist 中新增字段,如 "AppURLKey" = $(APP_URL)
APP_URL = apple.com

可以分环境,配置不同域名等,比如测试服和正式服的区别。但是之后需要在 info.plist 文件中增加一个自定义的 key-value,比如上述🌰则是 AppURLKey 对应了 $(APP_URL)。再在代码中进行获取。

1
2
3
4
func URLStr() -> String {
let dict = Bundle.main.infoDictionary!
return dict["AppURLKey"] as! String
}

另外,每次改完配置后,建议是 Product - clean ( command + shift + k) 清楚下。

四、Scheme

为了开发的方便,可以新建一个 Scheme,并且选择对应的 config。

8

9

如果使用 archive 方式进行打包上传的话,那么 archive 对应的配置也得选择相应的。

参考

  1. The Unofficial Guide to xcconfig files