iOS 中针对不同构建发行版管理 plist 的 url、设置和密钥的最佳实践?
Best practices for managing urls, settings, keys for plists in iOS for different build distributions?
对于不同环境的所有不同设置并为它们生成不同的构建,让自己保持理智的最佳做法是什么?例如,我们的应用程序连接到 auth0 进行登录,我们有两个不同的环境:后端服务的阶段 + 生产环境。因此,我们为 auth0 创建了两个单独的应用程序(一个用于阶段,另一个用于生产)。在 iOS 上管理此设置的最佳做法是什么?您是否使用各种设置为 stage + prod 创建单独的 plist 文件?
我们生成了两种不同的应用程序版本:一种用于阶段(用于测试版),另一种是用于应用商店的产品版本。
在 Swift3 中,我开始使用枚举来描述不同目标的不同行为。
第 1 步 - 在目标的 plist 中,我指定了目标类型,Alpha、Beta 或 Production。
第 2 步 - 我声明一个枚举来描述所有可能的构建类型
enum RedactedAppVersion {
case Alpha
case Beta
case Production
}
第 3 步 - 我实现了一个惰性全局 属性 来读取 plist。
lazy var appVersion: RedactedAppVersion = {
if let temp = Bundle.main.object(forInfoDictionaryKey: "RedactedAppVersion") as? String {
if temp.lowercased() == "alpha" {
return RedactedAppVersion.Alpha
}
if temp.lowercased() == "beta" {
return RedactedAppVersion.Beta
}
}
return RedactedAppVersion.Production
}()
第 4 步 - 当我需要为 api 获取路径时,我询问枚举...
4a - 将以下内容添加到枚举中
func apiPath() -> String {
switch self {
case .Alpha: return "https://test.redacted.com/v1/"
case .Beta: return "https://test.redacted.com/v1/"
case .Production: return "https://api.redacted.com/v1/"
}
}
4b - 我得到了这样的正确路径 -
let path = ApplicationManagerSingleton.sharedInstance.appVersion.apiPath() + "auth/sign-up"
在我的公司,我们做一些类似的事情,但不同的是维护不同的版本。首先,你可以在Plist中添加一个key
然后,在您的目标构建设置中,您可以为每个所需的构建添加不同的目标环境。这可以在构建设置的用户定义区域中通过添加新定义的对象来完成,在本例中为 TARGET_ENVIRONMENT.
然后,任何时候您需要弄清楚您的目标环境是什么,这都很容易。
let targetEnvironment = NSBundle.mainBundle().objectForInfoDictionaryKey("TARGET_ENVIRONMENT") as! String
最后,如上所述,当您需要根据环境选择网络环境时,您可以切换环境并选择正确的路径。
switch targetEnvironment {
case "STAGING":
baseURL = "http://staging.redacted.com"
case "PREPROD":
baseURL = "http://preprod.redacted.com"
case "PRODUCTION":
baseURL = "http://production.redacted.com"
default:
baseURL = "http://localhost:3000"
}
对于不同环境的所有不同设置并为它们生成不同的构建,让自己保持理智的最佳做法是什么?例如,我们的应用程序连接到 auth0 进行登录,我们有两个不同的环境:后端服务的阶段 + 生产环境。因此,我们为 auth0 创建了两个单独的应用程序(一个用于阶段,另一个用于生产)。在 iOS 上管理此设置的最佳做法是什么?您是否使用各种设置为 stage + prod 创建单独的 plist 文件?
我们生成了两种不同的应用程序版本:一种用于阶段(用于测试版),另一种是用于应用商店的产品版本。
在 Swift3 中,我开始使用枚举来描述不同目标的不同行为。
第 1 步 - 在目标的 plist 中,我指定了目标类型,Alpha、Beta 或 Production。
第 2 步 - 我声明一个枚举来描述所有可能的构建类型
enum RedactedAppVersion {
case Alpha
case Beta
case Production
}
第 3 步 - 我实现了一个惰性全局 属性 来读取 plist。
lazy var appVersion: RedactedAppVersion = {
if let temp = Bundle.main.object(forInfoDictionaryKey: "RedactedAppVersion") as? String {
if temp.lowercased() == "alpha" {
return RedactedAppVersion.Alpha
}
if temp.lowercased() == "beta" {
return RedactedAppVersion.Beta
}
}
return RedactedAppVersion.Production
}()
第 4 步 - 当我需要为 api 获取路径时,我询问枚举...
4a - 将以下内容添加到枚举中
func apiPath() -> String {
switch self {
case .Alpha: return "https://test.redacted.com/v1/"
case .Beta: return "https://test.redacted.com/v1/"
case .Production: return "https://api.redacted.com/v1/"
}
}
4b - 我得到了这样的正确路径 -
let path = ApplicationManagerSingleton.sharedInstance.appVersion.apiPath() + "auth/sign-up"
在我的公司,我们做一些类似的事情,但不同的是维护不同的版本。首先,你可以在Plist中添加一个key
然后,在您的目标构建设置中,您可以为每个所需的构建添加不同的目标环境。这可以在构建设置的用户定义区域中通过添加新定义的对象来完成,在本例中为 TARGET_ENVIRONMENT.
然后,任何时候您需要弄清楚您的目标环境是什么,这都很容易。
let targetEnvironment = NSBundle.mainBundle().objectForInfoDictionaryKey("TARGET_ENVIRONMENT") as! String
最后,如上所述,当您需要根据环境选择网络环境时,您可以切换环境并选择正确的路径。
switch targetEnvironment {
case "STAGING":
baseURL = "http://staging.redacted.com"
case "PREPROD":
baseURL = "http://preprod.redacted.com"
case "PRODUCTION":
baseURL = "http://production.redacted.com"
default:
baseURL = "http://localhost:3000"
}