先了解几个概念:
- 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同时生效