先了解几个概念:
- Project:包含了项目所有的代码,资源文件,所有信息。
- Target:对指定代码和资源文件的具体构建方式。
- Scheme:对指定Target的环境配置。
Configurations
Xcode打开一个项目工程,选中PROJECT
查看Info
信息,能够看到Configurations
有两种编译模式,Debug
模式是调试的时候使用,Release
打包上线的时候使用,这种模式下会进行编译优化,去除一些调试信息,减少包的大小。
除了这两种编译模式外,我们还可以添加自定义的模式,不过添加自定义的模式需要拷贝这两种默认模式的其中一个,再在其基础上进行修改配置。
点击+
号,这里就复制Debug
模式,创建Custom
模式。
使用场景一
不同的编译模式下,应用图标不同及应用名称不同
1.Assets
里面创建不同编译模式下的AppIcon
2.选择target
,在Build Settings
中搜索Asset Catalog
,并在对应的编译模式下,配置你添加好的appiconName
图标部分已经配置完成
3.在Build Settings
中点击右边+
号,点击Add User-DefinedSetting
,在User-Defined
下正在编辑状态下的地方添加key
,自己随便起名。这里我就用APP_NAME
,在其下不同模式,添加不同的名字
4.在Info.plist
中,将Bundle Name
的取值key
由PRODUCT_NAME
改为APP_NAME
(你自己设置的key
)
配置完成,手机桌面看一下结果:
使用场景二
不同编译环境下,host
地址不同
1.找到Preprocessor Macros
,对不同的编译模式添加不同的环境变量,以便区分
2.根据不同编译模式,判断环境变量是否有值,并定义宏的内容
#ifdef CUSTOM
#define HOST_URL @"http://www.custom.com"
#elif DEBUG
#define HOST_URL @"http://www.debug.com"
#else
#define HOST_URL @"http://www.release.com"
#endif
3.选择不同的模式,运行项目,得到不同的HOST_URL
。
此外,还可以配合User-Defined
使用
1.自定义HOST_URL
2.在Info.plist
配置
注意后面小括号里的key
对应User-Defined
设置的key
,前面的key
是在使用时取值用的key
3.项目中使用HOST_URL
NSString *path = [[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
NSLog(@"%@",dict[@"HOST_URL"]);
多Target的使用
1.选中当前target
,右键Duplicate
会出现target copy
及新的plist
文件
2.如果改名,需重新配置新target
上plist
文件的路径
3.修改Bundle Identifier
,区分为不同的应用
使用场景一
以上Configurations
的使用场景都能够用多target
实现,上面的是用了一个target
,配置不同的编译模式,进行不同的操作。而多target
就是有多个这样的不同配置。
xcconfig文件
xcconfig
是与Build Settings
相对应的,其语法是key-value
的形式。可通过
查看key-value,来进行xcconfig
配置。
例如配置Other Linker Flags
得到对应的key
xcconfig
文件中添加拿到的OTHER_LDFLAGS
OTHER_LDFLAGS = -framework "AFNetworking"
编译后,可看到xcode做了对应的配置
使用场景一
接下来使用 xcconfig
文件实现不同编译环境下,host
地址不同。
1.创建两个xcconfig
文件
2.在Configurations
中,将对应的Target
选择对应的xconfig
文件
3.Info.plist
设置Key
4.配置xcconfig
Debug.xcconfig文件配置
A = /
CONF_HOST_URL = http:$(A)/www.debug.com
Release.xcconfig文件配置
A = /
CONF_HOST_URL = http:$(A)/www.release.com
定义A = /
后,CONF_HOST_URL
在取值的时候:$(A)/
就是双斜杠//
,防止代码被注释
5.使用
NSString *path = [[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
NSLog(@"%@",dict[@"CONF_HOST_URL"]);
xcconfig与CocoaPods使用冲突解决
配置过xcconfig
的工程,再使用CocoaPods
,会出现冲突
解决办法:
在xcconfig
中include
对应的Pods
对应的xcconfig
路径,如:
注意,终端得到的路径需要在前面拼接Pods/
得到正确路径。
$(inherited)
是将pod的xcconfig
和自己自定义的xcconfig
中当前的OTHER_LDFLAGS
同时生效