iOS 多环境配置的三种方式

概念:
Project:包含项目所有代码、资源文件、所有信息。
Target:对指定代码和资源文件的具体构建方式。
Scheme:对指定的Target的环境配置。

一、使用多targets配置环境

这个章节请看我分享的文章:最详细 Xcode的Targets管理项目的公开版本、测试版本、预发布版本
这里不多讲解

弊端:
1.生成多个info.plist文件
2.配置繁琐且乱,容易配置遗忘其它targets
3.通过声明宏的方式,容易写错
4.真机测试需要的描述文件等比较多

二、使用多Scheme配置环境

正常情况下,选择Edit Scheme ... -> Run -> Info 只有两个Build Configuration可以选择(Debug/Release)

这个Build Configuration是对应于 PROJECT 里的 Info -> Configuration

于是乎可以自定义添加我们所需要的Configuration环境

因为当前只有一个Scheme,当我们运行的时候,每次都来回点到Edit Scheme...切换环境,这无疑会导致容易操作疏漏的情况。

于是乎可以创建另外的Scheme,来配对刚才的配置环境,那每次选择环境的时候,只需要选择对应的Scheme就可以了:

此时就可以选择对应的Scheme去到Edit Scheme...配对它对应的配置环境了

那如果要区分环境去定义不同的 主机hostUrl呢?我们通过Add User-Defined Setting,自定义一个参数我起名为HOST_URL,它自动会分配三个环境,依次填入自己的主机域名即可(下图我做举例用)。

通过定义了这个自定义参数,要如何读取出来呢?通过在Info.plist去声明

Info.plist

访问HOST_URL就是读取Info.plist

// Swift
let mainBundle = Bundle.main
let identifer = mainBundle.bundleIdentifier
let info = mainBundle.infoDictionary
let CFBundleName = mainBundle.object(forInfoDictionaryKey: "CFBundleName")
let HOST_URL = mainBundle.object(forInfoDictionaryKey: "HOST_URL")
print("[identifer]:\(identifer!)")
print("[info]:\(info!)")
print("[CFBundleName]:\(CFBundleName!)")
print("[HOST_URL]: \(HOST_URL!)")
// OC 
NSString *path = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
NSDictionary *infoDic = [[NSDictionary alloc] initWithContentsOfFile:path];
NSLog(@"%@", infoDic[@"HOST_URL"]);

Building Settings里所有的参数都会分三个不同的环境,这就意味着可以设置不一样的Icons、图标、名称等等...

弊端:在Building Settings里可能会不断地去找对应的配置然后三个环境不断地配置,不方便。

三、使用 Scheme + Configurations 配置(推荐)

本文仅做操作教学,对.xcconfig一点都不懂的同学可以看这里:Swift进阶-工程化实践(一)。

在上面demo的基础上,找到Build Settings -> User-Defined,将之前自定义个HOST_URL删掉
接下来新建三个.xcconfig文件,命名规则 目录-项目名.环境.xcconfig

Config-SchemeProject.Debug
Config-SchemeProject.Office
Config-SchemeProject.Release

.xcconfig生效,配置到对应的Configuration

生效后可以在Build Settings中看到这个配置了

附上demo
喜欢的老铁,点个⭐️

适配好多环境工程后仍存在一些问题的

问题一:

在我们没有配置xcconfig文件的工程,通过Cocoapods导入第三方库 $ pod install 后,我们的工程会自动配置成默认生效是使用了Pods-ProjectName.Debug.xcconfigProjectName.Debug.xcconfig这两个环境的xcconfig,那我们自定义的xcconfig就没法生效了。
解决问题一的方法:
在我们自定义的xcconfig中去导入Pods-ProjectName.Debug.xcconfig

xcconfig生效的地方设置成我们自定义的xcconfig文件即可。

问题二:

比如我们用Cocoapods导入第三方库AFNetworking,在自定义的Config-SchemeProject.Debug.xcconfig里有这样一句

OTHER_LDFLAGS = -framework "AFNetworking"

Cocoapods生成的xcconfig里也会有同一个设置值并且还有其它参数呢:

最后生效的只有我们自定义的xcconfig (解决完问题一的情况),而CocoapodsOTHER_LDFLAGS的其它参数并没有生效了

解决问题的的方法:
在自定义的xcconfig声明参数钱加上 $(inherited) 即可。 $(inherited)是继承的意思。

OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"

你可能感兴趣的:(iOS 多环境配置的三种方式)