"I walk slowly, but I never walk backward."
我走得很慢,但从不后退
主要内容:
Project
、Target
、Scheme
Target
配置Scheme
配置xcconfig
文件配置•Project
:是一个项目的整体,相当于一个仓库,包括了所有的代码和资源文件;
•Target
:相当于一个具体的产品,包含了对于代码,资源文件的具体使用规则和配置;•Scheme
: 对指定Target
的环境进行配置;
总结:一个Project
可以包含多个Target
,也就是说通过不同Target
我们可以生成不同的APP
;
多环境配置的三种方法:
target
配置;Scheme
配置;xcconfig
文件配置;•优点:方便管理代码,资源文件,比如在Compile Sources
、Copy Bundle Resources
里根据需要增加或者删除需要编译的代码和资源;
•缺点:配置繁琐,涉及多个info.plist
文件、宏定义等,大量的修改人容易错乱;
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
实现多环境,其实是通过设置多种configurations
的方式,具体步骤如下:
进入Project
-> Info
-> Configurations
,在这里可以看到已经存在的Debug
、Release
等配置。点击“+”
,可以在这里增加新的configuration
(以Dev
为例);
增加configuration
后,在Edit Scheme
时,也会多出一种configration
。我们在run
的时候,就可以手动切换configration
使用不同的环境;
每次手动切换configration
较为繁琐,我们还可以使用不同的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
配置文件,可以帮助我们以文件的形式配置build settings
里的内容;.xcconfig
的文件的内容,是以key-value
形式构成的;.xcconfig
文件后,依然可以继续在build settings
里增加配置项目,并不会覆盖;其实,若使用Cocoapods
管理第三方库,就已经自动生成了Debug
和Release
配置文件。
查看配置:Xcode
-> PROJECT
-> info
-> Configurations
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
,这些配置都已经被成功修改;
在写入配置信息时,其中url
的//
会被认为是注释。此时,我们可以先定义一个变量SLASH = /
, 如下代码:
SLASH = /
HOST_URL = http:${SLASH}/5678
某些情况下,我们需要为配置增加约束条件,如只在Debug
环境下、SDK
是模拟器,且架构是x86_64
的情况下才会link
这个frameworkName
,则需要如下配置:
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64] = -framework "frameworkName"
我们习惯于使用cocoapods
管理第三方,由其生成的配置文件和我们自定义的配置文件就会冲突,因为一个环境只能配置一个.xcconfig
文件:
而且,此时更新Pods
也会警告:已经存在其他的配置文件,Pods
设置的.xcconfig
文件不会生效;
解决方案:在自定义配置文件中使用关键include
命令,引入pods
的配置文件,使其生效:
//注意:这里需要根据debug、release等不同的环境,分别设置
#include "Pods/Target Support Files/Pods-TestProject/Pods-TestProject.debug.xcconfig"
将Pods
生成的.xcconfig
文件通过include
导入自定义的配置文件中后,如果两者都对同一个key
进行过配置,就会导致前者无效的问题。
比如,两者都对相同的Other Link Flags
进行配置,查看Build Setting
后,会发现Pods
生成的.xcconfig
没有生效;
解决方案:使用inherited
进行继承,在自定义配置文件中配置如下:
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
.xcconfig
定义不同的HOST_URL
,并以类似上文的步骤在info.plist
中增加配置;configration
下运行项目,将会得到不同的HOST_URL
;