前言:
Project: 包含了项目所有的代码,资源文件,所有信息。
Target: 对指定代码和资源文件的具体构建方式。
Scheme: 对指定Target的环境配置。
一. 多环境配置
1.1 创建多个target
创建完target,会生成对应的.plist文件,可以进行相应的配置。如 bundleid icon图标 ... 等等
配置新生成的.plist文件路径
多个target缺点:
多个info.plist 文件,配置比较繁琐
1.2设置预处理宏
设置控制环境的参数
OC配置相应的宏
Swift配置相应的宏
根据不同的宏值做相应判断逻辑
#if DEV
#import
#else
#import
#endif
2.1设置多个Scheme
点击加号添加scheme 如下图
点击 Manage Schemes -> 点击+号 弹出下图配置相应的scheme 如 LoginApp Debug Beta ... 等等
点击 Edit Schemes 将不同环境scheme 与 Build Configuration 配置一一对应,如下图所示
2.2配置不同环境下的宏
最后在info.plist中配置
工程中取配置的宏
NSString *path = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"]; NSDictionary *infoDic = [[NSDictionary alloc] initWithContentsOfFile:path]; NSLog(@"%@",infoDic[@"HOST_URL"]);
小提示:也可以配置不通scheme的icon app名称等等
3.1配置不同scheme环境的xcconfig文件,类似于cocoapods中pods文件夹下内容
接下来是配置过程
如果是多个target工程,xcconfig也可以配置不同target工程
上面创建的xcconfig文件里边配置HOST_URL如下
debug文件 :HOST_URL = 127.0.0.1
release文件:HOST_URL = 127.0.0.2
同时需要在文件中配置 HOST_URL = ${HOST_URL} 参考上面的图,不同环境下运行就可以取出相应配置的 HOST_URL 值 类似于多个scheme取值一样,同时 User-Defined 里面也会出现相应 HOST_URL 值。
注意⚠️ Cmd + Delete 删除 User-Defined -> HOST_URL,重新编译User-Defined下也会出现对应的HOST_URL值
我们好奇为什么会定义A呢,是因为如果我们直接写成HOST_URL=https://www.debug.com,编译器会默认//是注释符号。
//在debug的config下
A=/
HOST_URL=https:${A}/www.debug.com
//在release的config下
A=/
HOST_URL=https:${A}/www.release.com
xcconfig文件进行相应配置可以映射到 Build Settings 中,如下图所示
小结:xcconfig文件里面是 key - value 的配置,OTHER_LDFLAGS是 Other Linker Flags 的缩写,相应缩写可以在 xcodebuildsettings 查询
多环境配置方式小结
使用预编译宏在代码中进行环境判断
通过方式配置
1. 使用单个Target和单个Scheme,需要每次运行修改Scheme环境
2. 使用多个Scheme,每个Scheme对应一种环境
xconfig是配置User-Defined的另一种方式
多Target更像是多个APP,用这个方式实现多环境配置大材小用了
配置冲突
创建一个新的项目,在根目录分别执行命令pod init和pod install,打开项目看到自动生成了两个配置文件
这里默认已经配置好了
接下来我们把Configurations 下面默认配置的改为自定义的 文件,终端执行 pod install 会出现下面冲突
解决办法:要么设置base configurations为Pods-LoginApp.debug.xcconfig要么在Config-LoginApp.debug.xcconfig中导入
#include "Pods/Target Support Files/Pods-LoginApp/Pods-LoginApp.debug.xcconfig"
在Podfile文件中添加AFNetworking,SDWebImage并执行pod install之后,查看Other Linker Flags 配置如下图
在自定义xcconfig文件中配置如下
编译之后查看Other Linker Flags 配置如下图,发现Pods中xcconfig被覆盖掉了
这里需要使用关键字$(inherited)继承之前的配置信息
配置完继承关系之后,编译 查看Other Linker Flags
总结: 优先级(由高到低)
手动配置Target Build Settings
Target中配置的自定义xcconfig文件
Target中配置的Pod xcconfig文件
手动配置Project Build Settings
Project中配置的自定义xcconfig文件
Project中配置的Pod xcconfig文件