主要内容:
- 区分
Project
、Target
、Scheme
- 多
Target
配置 -
Scheme
配置 -
xcconfig
文件配置
一、区分Project、Target、Scheme
-
Project
:是一个项目的整体,相当于一个仓库,包括了所有的代码和资源文件; -
Target
:相当于一个具体的产品,包含了对于代码,资源文件的具体使用规则和配置; -
Scheme
: 对指定Target
的环境进行配置;
总结:一个Project
可以包含多个Target
,也就是说通过不同Target
我们可以生成不同的APP
;
多环境配置的三种方法:
- 多
target
配置; -
Scheme
配置; -
xcconfig
文件配置;
二、多Target 配置
1.总结特点
- 优点:方便管理代码,资源文件,比如在
Compile Sources
、Copy Bundle Resources
里根据需要增加或者删除需要编译的代码和资源; - 缺点:配置繁琐,涉及多个
info.plist
文件、宏定义等,大量的修改人容易错乱;
2.基本步骤
1.创建新target
选中已有target
,右键选择Duplicate
,会拷贝创建出与原Target
相同配置的新Target
;
2.修改新target
的配置
由于拷贝得到的target
仍使用旧的配置,为了使用新target
,所以我们还需要一些额外设置:
- 修改新
Target
名字; - 修改新
info.plist
名字; - 修改
Build Settings
->Packaging
->info.plist File
与Product Bundle identifier
;
3.修改Scheme
名字
进入Scheme Manager
,修改Scheme
的名字,这里并非必须,修改是为了更加方便识别;
4.为了区别不同的Target
,增加预定义宏
配置OC
工程:Build Settings
-> Preprocessor Macros
配置Swift
工程:Build Settings
-> Other Swift Flags
理解-D
用法:
-
swiftc
编译器中,需要添加一个-D
的option
,代表将条件编译标志标记为true
; - 至于
-D
的说明,也可以使用控制台命令查看:swiftc --help |grep '-D'
-D <value> Marks a conditional compilation flag as true
5.测试target
多环境
#if DEV
print("Project DEV")
#else
print("Project Normal")
#endif
三、Scheme配置
配置Scheme
实现多环境,其实是通过设置多种configurations
的方式,具体步骤如下:
1.增加新configration
进入Project
-> Info
-> Configurations
,在这里可以看到已经存在的Debug
、Release
等配置。点击“+”
,可以在这里增加新的configuration
(以Dev
为例);
2.切换多环境
增加configuration
后,在Edit Scheme
时,也会多出一种configration
。我们在run
的时候,就可以手动切换configration
使用不同的环境;
3.多Scheme
每次手动切换configration
较为繁琐,我们还可以使用不同的Scheme
直接对应不同的配置;
4.测试Scheme多环境
1.Build Setting
-> User-Defined
里自定义Host_URL
,再对不同的configration
配置不同的值;
2.将Host_URL
以变量的方式配置到info.plist
文件中;
3.读取info.plist
,手动切换configration
或者使用不同的Scheme
运行,将得到不同的信息;
guard let path = Bundle.main.path(forResource: "Info", ofType: "plist") else { return}
guard let infoDic = NSDictionary(contentsOfFile: path) else {return}
if let host_url = infoDic["HOST_URL"] {
print("HOST_URL:\(host_url)")
}
四、xcconfig配置文件
xcconfig
配置文件:
-
.xcconfig
配置文件,可以帮助我们以文件的形式配置build settings
里的内容; -
.xcconfig
的文件的内容,是以key-value
形式构成的; - 增加
.xcconfig
文件后,依然可以继续在build settings
里增加配置项目,并不会覆盖;
1.查看配置文件
其实,若使用Cocoapods
管理第三方库,就已经自动生成了Debug
和Release
配置文件。
查看配置:Xcode
-> PROJECT
-> info
-> Configurations
2.自定义配置文件
-
Commd +N
-> 搜索Configuration Setting File
,保存名称以"目录名-App名.环境
"为格式, 如"Config-TestProject.debug
"; - 在
.xcconfig
文件里写入配置,而这里用到的key
其实都是build settings
配置选项的缩写,具体可查看网站Xcode Build Settings;
举例:在配置文件中写入以下配置:
SLASH = /
HOST_URL = http:${SLASH}/1234
OTHER_LDFLAGS = -framework "AFNetworking"
HEADER_SEARCH_PATHS = /abcd/efg
此时执行编译后,在build settings
里搜索查看Other Linker Flags
、Header Search Paths
,这些配置都已经被成功修改;
3.特殊符号问题
在写入配置信息时,其中url
的//
会被认为是注释。此时,我们可以先定义一个变量SLASH = /
, 如下代码:
SLASH = /
HOST_URL = http:${SLASH}/5678
4.增加约束条件
某些情况下,我们需要为配置增加约束条件,如只在Debug
环境下、SDK
是模拟器,且架构是x86_64
的情况下才会link
这个frameworkName
,则需要如下配置:
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64] = -framework "frameworkName"
5.xcconfig文件冲突问题
我们习惯于使用cocoapods
管理第三方,由其生成的配置文件和我们自定义的配置文件就会冲突,因为一个环境只能配置一个.xcconfig
文件:
而且,此时更新Pods
也会警告:已经存在其他的配置文件,Pods
设置的.xcconfig
文件不会生效;
解决方案:在自定义配置文件中使用关键include
命令,引入pods
的配置文件,使其生效:
//注意:这里需要根据debug、release等不同的环境,分别设置
#include "Pods/Target Support Files/Pods-TestProject/Pods-TestProject.debug.xcconfig"
6.xcconfig关键字冲突问题
将Pods
生成的.xcconfig
文件通过include
导入自定义的配置文件中后,如果两者都对同一个key
进行过配置,就会导致前者无效的问题。
比如,两者都对相同的Other Link Flags
进行配置,查看Build Setting
后,会发现Pods
生成的.xcconfig
没有生效;
解决方案:使用inherited
进行继承,在自定义配置文件中配置如下:
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
7.测试.xcconfig多环境
- 在不同的
.xcconfig
定义不同的HOST_URL
,并以类似上文的步骤在info.plist
中增加配置; - 切换到不同的
configration
下运行项目,将会得到不同的HOST_URL
;