前言
大多数开发者在开发的时候都会遇到多个环境的问题,development, test, production. 通常会通过宏或变量来控制,或者打包前手动切换环境变量,这种方法的确可以解决问题,只不过不是很优雅很高效。
开始吧 just do it!
1. 新建Build Configuration
如图 创建新配置 系统默认是2个,一个Debug,一个Release。这里我们需要选择是复制一个Debug还是Release。每个环境都有Debug
和Release
配置,Release不能调试程序,因为默认是屏蔽了可调试的一些参数,具体可以看BuildSetting里面的区别,而且编译时有做编译优化,会比用Debug打包出来的体积更小一点。
以开发和发布两个环境为例 (系统默认的为开发环境)
项目中使用了Pod 打开Configuration Set就会发现是如下的样子
注意:刚刚新建完Build Configuration之后,这时如果有pod,请立即执行一下
pod install
pod安装完成之后会自动生成xcconfig文件
2. 新建Scheme
如图复制一个Scheme
更改配置为新的 Configuration
3.创建xcconfig文件
配置项目目录 将xcconfig放到Config文件夹
新建xcconfig文件
在文件中创建一些变量 例如
// DevConfig.xcconfig
// Environments
// Server URL
ROOT_URL = http:/$()/localhost:3000
// Keys
API_KEY = 783u9djd8a_hkzos7jd803001nd
//Variable
THEME_TITLE = "测试标题"
// App Settings
APP_NAME = Env-Dev
APP_BUNDLE_ID = com.foo.env.dev
4.从项目设置访问配置值
回到 project - info - configurations 配置如下(图中有误)
配置一下访问值
配置多个icon 和 启动展位图
进行这些更改后,可以使用“方案”选择器中的不同方案来构建和运行应用程序。结果是应用程序的两个不同版本,每个版本使用其相应的环境。
运行无效 可以尝试
CocoaPods对现有项目的注释:如果您要在现有项目中使用CocoaPods,并且想要继续进行下去,则您需要做一些额外的工作来进行设置,因为CocoaPods具有自己的xcconfig文件。
删除.xcworkspace
档案
删除Podfile.lock
文件和Pods/
目录
保留Podfile
重新运行 pod install
5.从代码访问配置值
在info.plist中添加 CustomEnvironmentVariable 类型 为字典
配置键值如
现在这些变量在我们的plist中了,我们可以从Swift中访问它们了。推荐的一种做法是创建Environment.swift
文件。这将包含一个没有大小写的枚举,以用作访问plist和其中包含的变量的命名空间。我们将创建两个静态属性,rootURL
并将分别apiKey
返回aURL
和a String
。我们将在闭包中对其进行初始化,以包含从plist检索它们的逻辑,并fatalError:
使用适当的消息进行调用。
请注意,fatalError:
在这种情况下,我们已明确决定调用它,因为它表示编程错误,而不是遇到预期的nil状态。我们不希望xcconfig文件或Info.plist不具有这些值,并且在提供此有用消息的同时使应用程序崩溃将提供上下文并允许程序员进行纠正。
将此文件添加到_Configs_文件夹:
//
// Environment.swift
// Environments
//
// Created by Foo on 2021/3/4.
import Foundation
public enum Environment {
static let plistKey = "CustomEnvironmentVariable"
// MARK: - Keys
enum Keys {
enum Plist {
static let appName = "APP_NAME"
static let themeTitle = "THEME_TITLE"
}
}
// MARK: - Plist
private static let infoDictionary: [String: Any] = {
guard let dict = Bundle.main.infoDictionary else {
fatalError("Plist file not found")
}
return dict
}()
// MARK: - Plist values
static let appName: String = {
guard let environmentVariable = Environment.infoDictionary[plistKey] as? [String: String] else {
fatalError("Key environment not set in plist")
}
guard let value = environmentVariable[Keys.Plist.appName] else{
fatalError("This Key not set in plist environment")
}
return value
}()
static let themeTitle: String = {
guard let environmentVariable = Environment.infoDictionary[plistKey] as? [String: String] else {
fatalError("Key environment not set in plist")
}
guard let value = environmentVariable[Keys.Plist.themeTitle] else{
fatalError("This Key not set in plist environment")
}
return value
}()
}
现在,我们已经创建了一种结构化的方式来访问这些值
在需要使用的调用
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.addSubview(titleLabel)
print(Environment.themeTitle)
}
切换 计划Scheme 会使用不同的变量值
完成 Done 🚀🚀🚀
使用Xcode配置文件是一种用于配置不同构建设置的优雅而强大的解决方案。尽管我们在这里进行了大量的项目调整以使我们的环境按照我们希望的方式进行设置,但是在您习惯了这样做之后,这在很大程度上是惯例性的。请随意采用我们在此工作过的模板,并根据您的项目需求对其进行自定义!与将来必须不断重新审视和修复问题相比,花时间配置一次总是值得的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。