(译)使用Xcode Configuration (.xcconfig)来管理不同的编译设置

原文链接https://www.appcoda.com/xcconfig-guide/

在软件项目的开发周期中,你可能在不同的阶段创建不同的版本。在早期阶段,将会有一个版本符合你的本地配置。当您准备转移到下一个阶段时,你的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:

xcode-build-settings.gif

然后在Assets.xcassets创建几个新的App Icon集合,然后按照上面的名字重命名。

xcode-new-app-icon.gif

拖入你的图片,就准备好了!

在代码中访问变量

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。


switching-between-flavors.gif

结论

Xcode配置文件是配置不同build configuration的一种强大的方式,允许您轻松地管理不同的构建版本。你觉得这个教程怎么样?如果你对xcconfig有任何疑问,请在评论部分告诉我 😉

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容