在软件项目的开发周期中,你可能在不同的阶段创建不同的版本。在早期阶段,将会有一个版本符合你的本地配置。当您准备转移到下一个阶段时,你的QA团队将会使用另一个版本来测试功能和修复bug。当应用程序通过所有测试并获得QA团队的批准后,你将创建另一个版本,将其发送给你的客户进行测试,然后再将其推送到App Store。最后,一旦客户对您所发送的版本满意,就会有生产就绪的应用程序。所有这些版本都不是完全相同的,每一个都有一些特殊的或者稍微不同的配置。
例如,如果应用程序需要连接到后端,那么很有可能应用程序在QA测试期间连接到测试环境。版本可能配置了一个测试URL。当您移动到下一个阶段时,另一个版本将有另一个用于连接到staging(production环境的镜像)/生产服务器的URL。最重要的是,当在所有版本的应用程序中出现错误时,您可能不会显示相同级别的信息。
如何在Xcode中使用相同的代码库有效地管理所有这些构建版本呢?这是我想在本教程中讨论的内容,并向您展示如何在Xcode的帮助下创建多个配置。
如何管理多个版本?
有不同的方法可以达到这个目的。一个是创建不同的target,每个target都使用不同的Info.plist。每次选择一个target,一个不同的info.plist将被使用,因此我们将能够区分诸如token、用于不同版本的url等变量。
也可以通过使用Bundle Identifiers来实现。定义不同的preprocessor macros(预处理器宏)将控制不同代码块的条件编译。
Eugene Trapeznikov已经在这个优秀的教程中介绍了这一方法。如果您还没有读过,请阅读他的教程—How to Use Xcode Targets to Manage Development and Production Builds ,涵盖了所有的关键概念。
另一种方法是将您的build configuration(构建配置)设置放入.xcconfig文件,并在项目信息中引用这些文件。然后你可以通过改变scheme来建立一个不同版本的应用程序。这就是我将在本教程中介绍的内容。将build configuration设置放入文件中对于配置管理来说是一个巨大的胜利。
创建 Build Configuration
首先,让我们使用Xcode创建一个新项目。如果你愿意的话,也可以从电脑上现有的工程开始。选择项目导航栏中顶部的元素,并确保Project部分中的“你的项目名称”栏目被选中。完成后,您应该看到Xcode已经为您提供了两个不同的configuration级别: Debug和Release。如果您以前没有发现,那么现在你知道这意味着您可以使用不同的设置来创建一个用于调试的版本,以及另一个用于生产的版本。
现在我们要创建一个新的configuration。我们就叫它“ Staging”吧。在configuration列表下面单击+号,选择“Duplicate Debug configuration”,因为从Debug configuration中删除我们不想要的东西,要比在Release configuration中放回我们需要的东西容易的多。
使用 Xcode Configuration 文件 (.xcconfig)
正如前面提到的,我们使用的是Xcode配置文件(.xcconfig),而不是使用条件编译块来管理编译设置(例如,使用哪些token、api键、后端的url)。
如果您不知道一个Xcode配置文件(.xcconfig)是什么,它实际上是一个基于键/值的文件。您可以将构建设置以键/值对的形式存储,类似于您在字典中所做的。通过使用一个.xcconfig文件,很容易为每个版本定义编译参数。你很快就会理解我的意思。
现在回到项目,创建一个.xcconfig文件。在项目导航栏中,右键单击项目文件夹并选择New file….在弹出的对话框中,选择Configurations Settings File。点击Next,给它命名为“Staging”,并确保targets复选框全部没有选中,因为您不想将它包含在应用程序的包中。
现在转到您项目的info窗口,在Configurations部分中,展开列表并从下拉框中选择xcconfile“ Staging”。
完成之后,您可以为主target重复这个过程,并选择Debug文件。同样,为Release Target重复这个过程。
修改编译信息
一旦你有了Xcode configuration文件的设置,它就非常直接地改变了版本。例如,您想要更改编译信息,比如应用程序名称、应用程序版本、bundle identifier和bundle version,您可以对每个.xcconfig文件进行编辑,如下:
Debug.xcconfig:
IS_APP_NAME = Donate Debug
IS_APP_VERSION = 0.3
IS_APP_BUNDLE_ID = com.intensifystudio.DonateDebug
Staging.xcconfig:
IS_APP_NAME = Donate Staging
IS_APP_VERSION = 0.2
IS_APP_BUNDLE_ID = com.intensifystudio.DonateStaging
Release.xcconfig:
IS_APP_NAME = Donate
IS_APP_VERSION = 0.1
IS_APP_BUNDLE_ID = com.intensifystudio.DonateRelease
您可以在项目设置,info.plist和entitlement文件中使用您的配置变量。在本例中,我们将在info.plist中使用它更改应用名称、应用程序版本和bundle identifier,如下所示:
为了清晰起见,我使用了一个自定义前缀“IS”作为我的小开发工作室的名字,用来将自定义键从默认值中调离。
注意:更改 bundle identifier 将需要创建更多的provisioning profiles。
修改App Icon
使用Xcode配置文件,您现在可以轻松地为不同的build配置app图标。为不同的build定制应用图标的过程与我们在前一节中讨论的一样,除了会在在Build settings中使用变量。像这样编辑每一个.xcconfig文件:
Debug.xcconfig:
IS_APP_ICON = AppIconDebug
Staging.xcconfig:
IS_APP_ICON = AppIconStaging
Release.xcconfig:
IS_APP_ICON = AppIconRelease
完成后,切换到Build Settings,并使用变量 ${IS_APP_ICON}替换AppIcon:
然后在Assets.xcassets创建几个新的App Icon集合,然后按照上面的名字重命名。
拖入你的图片,就准备好了!
在代码中访问变量
Xcode的配置文件非常强大,也可以用于其他设置。例如,如果您有不同版本的API键和后端URL,您可以在每个.xcconfig文件中指定它们。然后在你的代码中,你可以取回它们。这是一个例子:
Debug.xcconfig:
BACKEND_URL = http:\/\/api.intensifystudio.com/development
CONSUMER_KEY = ck_a57e4fa2e14c12ae3f400371cf2951ec3dea5_dev
CONSUMER_SECRET = cs_c847caa35ce1041e9c69d239141f13f63bb22b_dev
Staging.xcconfig::
BACKEND_URL = http:\/\/api.intensifystudio.com/staging
CONSUMER_KEY = ck_a57e4fa2e14c12f400371cf2951ec3dea5_staging
CONSUMER_SECRET = cs_c847caa35ce1041e9c69d239141f13f63bb22b_staging
Release.xcconfig:
BACKEND_URL = http:\/\/api.intensifystudio.com/
CONSUMER_KEY = ck_a57e4fa2e14c12f400371cf2951ec3dea5
CONSUMER_SECRET = cs_c847caa35ce1041e9c69d239141f1f63bb22b
接下来,通过新建keyValue将这些变量添加到Info.pist:
您可以在运行时使用下面的示例代码从plist文件中读取值:
func infoForKey(_ key: String) -> String? {
return (Bundle.main.infoDictionary?[key] as? String)?
.replacingOccurrences(of: "\\", with: "")
}
代码非常简单。我们正在访问Main Bundle,以检索我们想要使用的信息。然后,如果返回的值是一个URL,则从字符串中删除所有的反斜杠。
切换 Build Configurations
要在Build Configurations 之间切换,只需按住option键,然后单击顶部的scheme,就可以更改这个scheme。然后您可以选择您喜欢的build configuration。
结论
Xcode配置文件是配置不同build configuration的一种强大的方式,允许您轻松地管理不同的构建版本。你觉得这个教程怎么样?如果你对xcconfig有任何疑问,请在评论部分告诉我 😉