我有一个与服务器通信的应用程序。我有这个服务器的两个版本:一个生产和一个测试。这意味着我需要一个生产iOS应用程序和测试iOS应用程序。两个版本的应用程序的逻辑基本相同,只是根据连接的服务器需要使用某些配置。现在,我的解决方案是使用包含2个版本所需信息的plist
文件。 plist
将包含一堆键值对,如:
url: test-server.domain.com
username: test-subject
password: test-password
我有2个git分支:每个iOS应用版本的生产分支和测试分支。所述plist
文件的内容在每个分支上都是不同的。
问题是:有没有更优雅的方法来解决这个问题?我最好只有一个分支。我已经研究过使用Xcode的环境变量,但是当我归档/构建我的应用程序时,这些变量并没有成功。
答案 0 :(得分:1)
if #APP_DEV // call dev API ELSIF // call prod API
。
1:在项目设置级别,复制调试配置并将其重命名为staging。 (可选)
2:打开项目构建设置并添加一些用户定义的设置:APP_ENV
,其值为dev => dev,staging =>阶段,生产=>刺。
3:您需要多个捆绑ID来并排加载应用程序(例如测试版或生产应用程序)。因此,使用值APP_BUNDLE_SUFFIX
创建另一个用户定义的设置.$(APP_ENV:lower)
。这会将Dev
变为.dev
。如果您希望在提交应用程序时没有额外的后缀,请将生产留空。
4:将APP_BUNDLE_SUFFIX
附加到您的产品包ID(com.testapp.YourCoolApp.$(APP_BUNDLE_SUFFIX)
)。
5:在Swift项目中,您可以在同一屏幕上将添加的变量添加到“Active Compilation Conditions”。通过将ENV_$(APP_ENV)
添加到列出的环境来执行此操作。在Objective-C项目中,这可以通过将环境添加到“预处理器宏”来完成,但请注意,您需要在值后加=1
以激活变量。
您可能需要创建单独的方案来实现此目的。您可以在顶部的方案上复制方案或option+click
并切换构建配置。
答案 1 :(得分:0)
我通常会使用Preprocessor Macros
。
为调试定义类似DEBUG
的变量,在Release中定义任何内容。
然后像
一样使用它enum AppConfig {
case debug
case testFlight
case appStore
var host: String {
switch self {
case .debug: return "test host"
default: return "production host"
}
}
static var current: AppConfiguration {
#if DEBUG
return .debug
#else
if Bundle.main.appStoreReceiptURL?.lastPathComponent == "sandboxReceipt" {
return .testFlight
} else {
return .appStore
}
#endif
}
}
只要您想使用主机,就可以使用AppConfig.current.host
。您唯一需要做的就是创建调试和发布方案。