文章搬运来源:https://www.jianshu.com/p/c40b31400816
作者:differ_iOS
对iOS开发感兴趣,可以看一下作者的iOS交流群:812157648,大家可以在里面吹水、交流相关方面的知识,群里还有我整理的有关于面试的一些资料,欢迎大家加群,大家一起开车
本篇文章主要介绍多环境配置 & Mach-O与链接器 & Symbol
一、多环境配置
多环境配置主要有以下几种形式:
- Project: 包含了项目的所有的代码、资源文件、所有信息…
- Target: 对指定代码和资源文件的具体构建方法
- Scheme:对指定Target的环境配置
- xconfig:将配置写到对应的文件中
1、创建多Target
- 通过多
Target
可对不同的Target
设置不同的Bundle ID
用于区分开发ID
或生产ID
- 也可以针对不同的
Target
配置不同的App Icon、App Display Name
- 还可以在
Build Phases
中针对不同的Target
增减编译的源文件和资源文件
应用场景:仅在开发Target下测试一个功能
如果是OC
代码中使用DEV
预定义宏:
如果是Swift
代码中使用DEV
预定义宏:
其中-D的含义查看如下:(也就是将声明的变量设置为TRUE)
使用如下代码即可实现:
#if DEV
NSLog(@"DEV");
#else
NSLog(@"xxx");
#endif
2、创建Scheme
通过添加不同的Scheme
对应不同开发环境
应用场景:不同的开发环境配置不同的HOST
Info.plist
中添加如下字段供外界调用:
使用代码如下:
NSString *infoPath = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
NSDictionary *infoDic = [[NSDictionary alloc] initWithContentsOfFile:infoPath];
NSLog(@"%@",infoDic[@"HOST_URL"]);
通过多
Scheme
也可以通过Build Settings
配置不同的图标…
3、通过xcconfig文件管理Build Settings中的配置
Pod 中引入的文件就是通过xcconfig
文件管理Build Settings
中的配置
创建自己的xcconfig
文件,并修改系统xcconfig
文件配置:
注意:
xcconfig
文件的命名需要以所在文件夹的名称作为前缀然后是项目名、环境名称
使用xcconfig
定义不同环境的HOST_URL
Config-TestCode-debug.xcconfig
文件中添加:HOST_URL = http://192.168.1.100
Info.plist
中添加如下字段供外界调用:
使用代码如下:
NSString *infoPath = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
NSDictionary *infoDic = [[NSDictionary alloc] initWithContentsOfFile:infoPath];
NSLog(@"%@",infoDic[@"HOST_URL"]);
Config-TestCode-debug.xcconfig
文件中添加动态库的配置:OTHER_LDFLAGS = -framework "AFNetworking"
HOST_URL = 192.168.1.100
// ld
OTHER_LDFLAGS = -framework "AFNetworking"
xcconfig
文件本质就是Key-Value
,可以配置Build Settings
中的绝大部分字段
xcconfig
文件中对应Build Settings
中字段的缩写对应关系参考: Xcode Build Settings
二、xcconfig文件冲突解决
如果使用自己创建的xcconfig
文件那么执行pod install
就会提示我们pod
生成的xcconfig
文件可能不会产生效果。要解决这个问题就需要在我们自己创建的xcconfig
文件中引入pod
生成的xcconfig
文件:
// 绝对路径、相对路径都可以
#include "Pods/Target Support Files/Pods-TestCode/Pods-TestCode.debug.xcconfig"
自己创建的xcconfig
文件中存在pod
生成的xcconfig
文件中相同的字段,那么就会覆盖pod
中的字段,因此要想两个文件中的字段都生效需要使用继承标识:
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
三、xconfig文件使用中的问题
1、URL变量中存在//,后面的字符串会被当做注释
// 通过定义一个变量来解决
SLASH =/
HOST_URL = http:${SLASH}/192.168.1.100
2、使用变量时 和 {}和 和()包括变量作用相同
3、条件设置
OTHER_LDFLAGS[config=Debug
][sdk=iphonesimulator*
][arch=x86_64
] = $(inherited) -framework “AFNetworking”
经过上述条件设置后AFNetworking
库仅会在Debug、模拟器、X86_64
架构下编译
[sdk=iphoneos*]表示真机