Xcode 多环境配置

5,135 阅读3分钟

先了解几个概念:

  • 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的取值keyPRODUCT_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.如果改名,需重新配置新targetplist文件的路径

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,会出现冲突 解决办法: 在xcconfiginclude对应的Pods对应的xcconfig路径,如:

注意,终端得到的路径需要在前面拼接Pods/得到正确路径。

$(inherited)是将pod的xcconfig和自己自定义的xcconfig中当前的OTHER_LDFLAGS同时生效