在軟件項目的開發(fā)周期中,你可能在不同的階段創(chuàng)建不同的版本。在早期階段住练,將會有一個版本符合你的本地配置绊诲。當您準備轉(zhuǎn)移到下一個階段時,你的QA團隊將會使用另一個版本來測試功能和修復bug靴庆。當應用程序通過所有測試并獲得QA團隊的批準后时捌,你將創(chuàng)建另一個版本,將其發(fā)送給你的客戶進行測試炉抒,然后再將其推送到App Store奢讨。最后,一旦客戶對您所發(fā)送的版本滿意焰薄,就會有生產(chǎn)就緒的應用程序拿诸。所有這些版本都不是完全相同的,每一個都有一些特殊的或者稍微不同的配置蛤奥。
例如佳镜,如果應用程序需要連接到后端,那么很有可能應用程序在QA測試期間連接到測試環(huán)境凡桥。版本可能配置了一個測試URL蟀伸。當您移動到下一個階段時,另一個版本將有另一個用于連接到staging(production環(huán)境的鏡像)/生產(chǎn)服務器的URL缅刽。最重要的是啊掏,當在所有版本的應用程序中出現(xiàn)錯誤時,您可能不會顯示相同級別的信息衰猛。
如何在Xcode中使用相同的代碼庫有效地管理所有這些構(gòu)建版本呢?這是我想在本教程中討論的內(nèi)容迟蜜,并向您展示如何在Xcode的幫助下創(chuàng)建多個配置。
如何管理多個版本?
有不同的方法可以達到這個目的啡省。一個是創(chuàng)建不同的target娜睛,每個target都使用不同的Info.plist。每次選擇一個target卦睹,一個不同的info.plist將被使用畦戒,因此我們將能夠區(qū)分諸如token、用于不同版本的url等變量结序。
也可以通過使用Bundle Identifiers來實現(xiàn)障斋。定義不同的preprocessor macros(預處理器宏)將控制不同代碼塊的條件編譯。
Eugene Trapeznikov已經(jīng)在這個優(yōu)秀的教程中介紹了這一方法。如果您還沒有讀過垃环,請閱讀他的教程—How to Use Xcode Targets to Manage Development and Production Builds 邀层,涵蓋了所有的關鍵概念。
另一種方法是將您的build configuration(構(gòu)建配置)設置放入.xcconfig文件遂庄,并在項目信息中引用這些文件寥院。然后你可以通過改變scheme來建立一個不同版本的應用程序。這就是我將在本教程中介紹的內(nèi)容涛目。將build configuration設置放入文件中對于配置管理來說是一個巨大的勝利只磷。
創(chuàng)建 Build Configuration
首先,讓我們使用Xcode創(chuàng)建一個新項目泌绣。如果你愿意的話,也可以從電腦上現(xiàn)有的工程開始预厌。選擇項目導航欄中頂部的元素阿迈,并確保Project部分中的“你的項目名稱”欄目被選中。完成后轧叽,您應該看到Xcode已經(jīng)為您提供了兩個不同的configuration級別: Debug和Release苗沧。如果您以前沒有發(fā)現(xiàn),那么現(xiàn)在你知道這意味著您可以使用不同的設置來創(chuàng)建一個用于調(diào)試的版本炭晒,以及另一個用于生產(chǎn)的版本待逞。
現(xiàn)在我們要創(chuàng)建一個新的configuration。我們就叫它“ Staging”吧网严。在configuration列表下面單擊+號识樱,選擇“Duplicate Debug configuration”,因為從Debug configuration中刪除我們不想要的東西震束,要比在Release configuration中放回我們需要的東西容易的多怜庸。
使用 Xcode Configuration 文件 (.xcconfig)
正如前面提到的,我們使用的是Xcode配置文件(.xcconfig)垢村,而不是使用條件編譯塊來管理編譯設置(例如割疾,使用哪些token、api鍵嘉栓、后端的url)宏榕。
如果您不知道一個Xcode配置文件(.xcconfig)是什么,它實際上是一個基于鍵/值的文件侵佃。您可以將構(gòu)建設置以鍵/值對的形式存儲麻昼,類似于您在字典中所做的。通過使用一個.xcconfig文件趣钱,很容易為每個版本定義編譯參數(shù)涌献。你很快就會理解我的意思。
現(xiàn)在回到項目首有,創(chuàng)建一個.xcconfig文件燕垃。在項目導航欄中枢劝,右鍵單擊項目文件夾并選擇New file….在彈出的對話框中,選擇Configurations Settings File卜壕。點擊Next您旁,給它命名為“Staging”,并確保targets復選框全部沒有選中轴捎,因為您不想將它包含在應用程序的包中鹤盒。
現(xiàn)在轉(zhuǎn)到您項目的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”作為我的小開發(fā)工作室的名字,用來將自定義鍵從默認值中調(diào)離瘟忱。
注意:更改 bundle identifier 將需要創(chuàng)建更多的provisioning profiles奥额。
修改App Icon
使用Xcode配置文件,您現(xiàn)在可以輕松地為不同的build配置app圖標访诱。為不同的build定制應用圖標的過程與我們在前一節(jié)中討論的一樣垫挨,除了會在在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創(chuàng)建幾個新的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呐能。
結(jié)論
Xcode配置文件是配置不同build configuration的一種強大的方式念搬,允許您輕松地管理不同的構(gòu)建版本。你覺得這個教程怎么樣?如果你對xcconfig有任何疑問摆出,請在評論部分告訴我 ??