Xcode为同一个应用程序构建不同的环境

时间:2017-08-14 16:05:07

标签: ios xcode git

我有一个与服务器通信的应用程序。我有这个服务器的两个版本:一个生产和一个测试。这意味着我需要一个生产iOS应用程序和测试iOS应用程序。两个版本的应用程序的逻辑基本相同,只是根据连接的服务器需要使用某些配置。现在,我的解决方案是使用包含2个版本所需信息的plist文件。 plist将包含一堆键值对,如:

url: test-server.domain.com
username: test-subject
password: test-password

我有2个git分支:每个iOS应用版本的生产分支和测试分支。所述plist文件的内容在每个分支上都是不同的。

问题是:有没有更优雅的方法来解决这个问题?我最好只有一个分支。我已经研究过使用Xcode的环境变量,但是当我归档/构建我的应用程序时,这些变量并没有成功。

2 个答案:

答案 0 :(得分:1)

确实有!您可以使用环境变量执行此操作,如本博文中所述:Flavors for iOS。您甚至可以在构建时根据变量切换应用程序图标和应用程序名称,因此,您可以通过以下方式签入代码: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以激活变量。

让env vars坚持

您可能需要创建单独的方案来实现此目的。您可以在顶部的方案上复制方案或option+click并切换构建配置。

答案 1 :(得分:0)

我通常会使用Preprocessor Macros

为调试定义类似DEBUG的变量,在Release中定义任何内容。

enter image description here

然后像

一样使用它
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。您唯一需要做的就是创建调试和发布方案。