(譯)使用Xcode Configuration (.xcconfig)來管理不同的編譯設(shè)置

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

在軟件項(xiàng)目的開發(fā)周期中,你可能在不同的階段創(chuàng)建不同的版本。在早期階段,將會(huì)有一個(gè)版本符合你的本地配置。當(dāng)您準(zhǔn)備轉(zhuǎn)移到下一個(gè)階段時(shí),你的QA團(tuán)隊(duì)將會(huì)使用另一個(gè)版本來測(cè)試功能和修復(fù)bug。當(dāng)應(yīng)用程序通過所有測(cè)試并獲得QA團(tuán)隊(duì)的批準(zhǔn)后,你將創(chuàng)建另一個(gè)版本,將其發(fā)送給你的客戶進(jìn)行測(cè)試,然后再將其推送到App Store。最后,一旦客戶對(duì)您所發(fā)送的版本滿意,就會(huì)有生產(chǎn)就緒的應(yīng)用程序。所有這些版本都不是完全相同的,每一個(gè)都有一些特殊的或者稍微不同的配置。

例如,如果應(yīng)用程序需要連接到后端,那么很有可能應(yīng)用程序在QA測(cè)試期間連接到測(cè)試環(huán)境。版本可能配置了一個(gè)測(cè)試URL。當(dāng)您移動(dòng)到下一個(gè)階段時(shí),另一個(gè)版本將有另一個(gè)用于連接到staging(production環(huán)境的鏡像)/生產(chǎn)服務(wù)器的URL。最重要的是,當(dāng)在所有版本的應(yīng)用程序中出現(xiàn)錯(cuò)誤時(shí),您可能不會(huì)顯示相同級(jí)別的信息。

如何在Xcode中使用相同的代碼庫有效地管理所有這些構(gòu)建版本呢?這是我想在本教程中討論的內(nèi)容,并向您展示如何在Xcode的幫助下創(chuàng)建多個(gè)配置。

如何管理多個(gè)版本?

有不同的方法可以達(dá)到這個(gè)目的。一個(gè)是創(chuàng)建不同的target,每個(gè)target都使用不同的Info.plist。每次選擇一個(gè)target,一個(gè)不同的info.plist將被使用,因此我們將能夠區(qū)分諸如token、用于不同版本的url等變量。

也可以通過使用Bundle Identifiers來實(shí)現(xiàn)。定義不同的preprocessor macros(預(yù)處理器宏)將控制不同代碼塊的條件編譯。

Eugene Trapeznikov已經(jīng)在這個(gè)優(yōu)秀的教程中介紹了這一方法。如果您還沒有讀過,請(qǐng)閱讀他的教程—How to Use Xcode Targets to Manage Development and Production Builds ,涵蓋了所有的關(guān)鍵概念。

另一種方法是將您的build configuration(構(gòu)建配置)設(shè)置放入.xcconfig文件,并在項(xiàng)目信息中引用這些文件。然后你可以通過改變scheme來建立一個(gè)不同版本的應(yīng)用程序。這就是我將在本教程中介紹的內(nèi)容。將build configuration設(shè)置放入文件中對(duì)于配置管理來說是一個(gè)巨大的勝利。

創(chuàng)建 Build Configuration

首先,讓我們使用Xcode創(chuàng)建一個(gè)新項(xiàng)目。如果你愿意的話,也可以從電腦上現(xiàn)有的工程開始。選擇項(xiàng)目導(dǎo)航欄中頂部的元素,并確保Project部分中的“你的項(xiàng)目名稱”欄目被選中。完成后,您應(yīng)該看到Xcode已經(jīng)為您提供了兩個(gè)不同的configuration級(jí)別: Debug和Release。如果您以前沒有發(fā)現(xiàn),那么現(xiàn)在你知道這意味著您可以使用不同的設(shè)置來創(chuàng)建一個(gè)用于調(diào)試的版本,以及另一個(gè)用于生產(chǎn)的版本。

現(xiàn)在我們要?jiǎng)?chuàng)建一個(gè)新的configuration。我們就叫它“ Staging”吧。在configuration列表下面單擊+號(hào),選擇“Duplicate Debug configuration”,因?yàn)閺腄ebug configuration中刪除我們不想要的東西,要比在Release configuration中放回我們需要的東西容易的多。


使用 Xcode Configuration 文件 (.xcconfig)

正如前面提到的,我們使用的是Xcode配置文件(.xcconfig),而不是使用條件編譯塊來管理編譯設(shè)置(例如,使用哪些token、api鍵、后端的url)。

如果您不知道一個(gè)Xcode配置文件(.xcconfig)是什么,它實(shí)際上是一個(gè)基于鍵/值的文件。您可以將構(gòu)建設(shè)置以鍵/值對(duì)的形式存儲(chǔ),類似于您在字典中所做的。通過使用一個(gè).xcconfig文件,很容易為每個(gè)版本定義編譯參數(shù)。你很快就會(huì)理解我的意思。

現(xiàn)在回到項(xiàng)目,創(chuàng)建一個(gè).xcconfig文件。在項(xiàng)目導(dǎo)航欄中,右鍵單擊項(xiàng)目文件夾并選擇New file….在彈出的對(duì)話框中,選擇Configurations Settings File。點(diǎn)擊Next,給它命名為“Staging”,并確保targets復(fù)選框全部沒有選中,因?yàn)槟幌雽⑺趹?yīng)用程序的包中。

現(xiàn)在轉(zhuǎn)到您項(xiàng)目的info窗口,在Configurations部分中,展開列表并從下拉框中選擇xcconfile“ Staging”。

完成之后,您可以為主target重復(fù)這個(gè)過程,并選擇Debug文件。同樣,為Release Target重復(fù)這個(gè)過程。


修改編譯信息

一旦你有了Xcode configuration文件的設(shè)置,它就非常直接地改變了版本。例如,您想要更改編譯信息,比如應(yīng)用程序名稱、應(yīng)用程序版本、bundle identifier和bundle version,您可以對(duì)每個(gè).xcconfig文件進(jìn)行編輯,如下:

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

您可以在項(xiàng)目設(shè)置,info.plist和entitlement文件中使用您的配置變量。在本例中,我們將在info.plist中使用它更改應(yīng)用名稱、應(yīng)用程序版本和bundle identifier,如下所示:


為了清晰起見,我使用了一個(gè)自定義前綴“IS”作為我的小開發(fā)工作室的名字,用來將自定義鍵從默認(rèn)值中調(diào)離。

注意:更改 bundle identifier 將需要?jiǎng)?chuàng)建更多的provisioning profiles。

修改App Icon

使用Xcode配置文件,您現(xiàn)在可以輕松地為不同的build配置app圖標(biāo)。為不同的build定制應(yīng)用圖標(biāo)的過程與我們?cè)谇耙还?jié)中討論的一樣,除了會(huì)在在Build settings中使用變量。像這樣編輯每一個(gè).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創(chuàng)建幾個(gè)新的App Icon集合,然后按照上面的名字重命名。

xcode-new-app-icon.gif

拖入你的圖片,就準(zhǔn)備好了!

在代碼中訪問變量

Xcode的配置文件非常強(qiáng)大,也可以用于其他設(shè)置。例如,如果您有不同版本的API鍵和后端URL,您可以在每個(gè).xcconfig文件中指定它們。然后在你的代碼中,你可以取回它們。這是一個(gè)例子:

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:


您可以在運(yùn)行時(shí)使用下面的示例代碼從plist文件中讀取值:

func infoForKey(_ key: String) -> String? {
        return (Bundle.main.infoDictionary?[key] as? String)?
            .replacingOccurrences(of: "\\", with: "")
 }

代碼非常簡(jiǎn)單。我們正在訪問Main Bundle,以檢索我們想要使用的信息。然后,如果返回的值是一個(gè)URL,則從字符串中刪除所有的反斜杠。

切換 Build Configurations

要在Build Configurations 之間切換,只需按住option鍵,然后單擊頂部的scheme,就可以更改這個(gè)scheme。然后您可以選擇您喜歡的build configuration。


switching-between-flavors.gif

結(jié)論

Xcode配置文件是配置不同build configuration的一種強(qiáng)大的方式,允許您輕松地管理不同的構(gòu)建版本。你覺得這個(gè)教程怎么樣?如果你對(duì)xcconfig有任何疑問,請(qǐng)?jiān)谠u(píng)論部分告訴我 ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容