概念:
Project:包含项目所有代码、资源文件、所有信息。
Target:对指定代码和资源文件的具体构建方式。
Scheme:对指定的Target的环境配置。
一、使用多targets配置环境
这个章节请看我分享的文章:最详细 Xcode的Targets管理项目的公开版本、测试版本、预发布版本
这里不多讲解
弊端:
1.生成多个info.plist文件
2.配置繁琐且乱,容易配置遗忘其它targets
3.通过声明宏的方式,容易写错
4.真机测试需要的描述文件等比较多
二、使用多Scheme配置环境
正常情况下,选择Edit Scheme ...
-> Run
-> Info
只有两个Build Configuration
可以选择(Debug/Release)
这个Build Configuration
是对应于 PROJECT
里的 Info
-> Configuration
的
于是乎可以自定义添加我们所需要的Configuration
环境
因为当前只有一个Scheme
,当我们运行的时候,每次都来回点到Edit Scheme...
切换环境,这无疑会导致容易操作疏漏的情况。
于是乎可以创建另外的Scheme
,来配对刚才的配置环境,那每次选择环境的时候,只需要选择对应的Scheme
就可以了:
此时就可以选择对应的Scheme
去到Edit Scheme...
配对它对应的配置环境了
那如果要区分环境去定义不同的 主机hostUrl
呢?我们通过Add User-Defined Setting
,自定义一个参数我起名为HOST_URL
,它自动会分配三个环境,依次填入自己的主机域名即可(下图我做举例用)。
通过定义了这个自定义参数,要如何读取出来呢?通过在Info.plist
去声明
访问HOST_URL
就是读取Info.plist
// Swift
let mainBundle = Bundle.main
let identifer = mainBundle.bundleIdentifier
let info = mainBundle.infoDictionary
let CFBundleName = mainBundle.object(forInfoDictionaryKey: "CFBundleName")
let HOST_URL = mainBundle.object(forInfoDictionaryKey: "HOST_URL")
print("[identifer]:\(identifer!)")
print("[info]:\(info!)")
print("[CFBundleName]:\(CFBundleName!)")
print("[HOST_URL]: \(HOST_URL!)")
// OC
NSString *path = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
NSDictionary *infoDic = [[NSDictionary alloc] initWithContentsOfFile:path];
NSLog(@"%@", infoDic[@"HOST_URL"]);
在Building Settings
里所有的参数都会分三个不同的环境,这就意味着可以设置不一样的Icons、图标、名称等等...
弊端:在Building Settings
里可能会不断地去找对应的配置然后三个环境不断地配置,不方便。
三、使用 Scheme + Configurations 配置(推荐)
本文仅做操作教学,对.xcconfig
一点都不懂的同学可以看这里:Swift进阶-工程化实践(一)。
在上面demo的基础上,找到Build Settings
-> User-Defined
,将之前自定义个HOST_URL
删掉
接下来新建三个.xcconfig文件,命名规则 目录-项目名.环境.xcconfig
让.xcconfig
生效,配置到对应的Configuration
下
生效后可以在Build Settings
中看到这个配置了
附上demo
喜欢的老铁,点个⭐️
适配好多环境工程后仍存在一些问题的
问题一:
在我们没有配置xcconfig
文件的工程,通过Cocoapods
导入第三方库 $ pod install
后,我们的工程会自动配置成默认生效是使用了Pods-ProjectName.Debug.xcconfig
和 ProjectName.Debug.xcconfig
这两个环境的xcconfig,那我们自定义的xcconfig就没法生效了。
解决问题一的方法:
在我们自定义的xcconfig中去导入Pods-ProjectName.Debug.xcconfig
xcconfig生效的地方设置成我们自定义的xcconfig文件即可。
问题二:
比如我们用Cocoapods
导入第三方库AFNetworking
,在自定义的Config-SchemeProject.Debug.xcconfig
里有这样一句
OTHER_LDFLAGS = -framework "AFNetworking"
而Cocoapods
生成的xcconfig里也会有同一个设置值并且还有其它参数呢:
最后生效的只有我们自定义的xcconfig (解决完问题一的情况),而Cocoapods
的OTHER_LDFLAGS
的其它参数并没有生效了
解决问题的的方法:
在自定义的xcconfig声明参数钱加上 $(inherited)
即可。 $(inherited)
是继承的意思。
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"