前言
大多数开发者在开发的时候都会遇到多个环境的问题,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
返回 a URL
和 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 配置文件是一种用于配置不同构建设置的优雅而弱小的解决方案。只管咱们在这里进行了大量的我的项目调整以使咱们的环境依照咱们心愿的形式进行设置,然而在您习惯了这样做之后,这在很大水平上是常规性的。请随便采纳咱们在此工作过的模板,并依据您的我的项目需要对其进行自定义!与未来必须一直从新扫视和修复问题相比,花工夫配置一次总是值得的。