在軟體專案的開發生命週期中,一般來說,會在不同的階段創建不同的版本。在初期階段,會有一個本地端的配置版本,即將進入下一個階段時,需要提供另一個版本讓QA團隊來測試功能和修復bugs,當應用程式通過所有測試並獲得QA團隊的認可後,在推送到App Store之前,會需要創建另一個版本,將其發送給客戶進行beta測試,一旦客戶對你發送的構建版本感到滿意,就算是production-ready的應用程式,而其中這些構建版本不完全相同,每一版都有一些特殊目的,配置都會略有不同。
例如,若應用程序需要串連後端,則應用程式很可能在QA測試期間連接到測試環境,該版本可能配置了一個測試URL,當進入到下一個階段後,另一個建置版本則需要一個用於連接到staging/production server的URL,最重要的是,當錯誤發生時,各個建置版本應該顯示不同層級的提示訊息。
如何在Xcode中有效率的管理所有構建版本,而且是在相同的code base上?這是我想在本教程中討論的內容,並向讀者展示如何在Xcode的幫助下創建多個配置。
如何管理多個構建版本?
其實有多個方法可以實現它,其中一個是創建不同的targets,每個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,這篇文章涵蓋所有重要概念。
另一種方法是將你的構建配置設定放到.xcconfig
文件中,並且在專案的info內引用它。然後可以透過簡單更改scheme來構建不同版本的應用程式,這也是我將在本教程中帶領讀者學習的重點,把構建配置(build configuration)設定放到檔案內,將是配置管理(configuration management)的巨大勝利。
建立Build Configuration
首先,讓我們使用Xcode創建一個新專案。或者是你想要從現有專案開始進行也沒問題,在項目導航器(project navigator)中選擇頂層的element,並確認PROJECT的“YOUR_PROJECT_NAME”項目已被選取,完成之後,應該會看到Xcode已經為你提供了兩個不同的配置級別:Debug和Release,你可能之前沒有意識到,它代表你可以透過不同的設置,分別創建一個用於debug,另一個用於release的版本。
現在我們要創建一個新的Configuration。我們把它叫做“Staging”。點擊配置列表下面的+號,然後選擇”Duplicate Debug configuration”,因為從Debug配置中刪除我們不需要的東西,比在Release配置放回所需的東西容易得多。
在剛出現的第一個單元格中,填寫Staging,完成這個動作後,你現在有三個級別的配置。
使用Xcode配置文件(.xcconfig)
如上所述,我們使用Xcode配置文件(.xcconfig)取代conditional compilation blocks,來管理構建設置(例如token、api keys,以及與後端串接使用的urls)。
如果你不知道Xcode配置文件(.xcconfig
) 是什麼,它實際上是一個基於key/value的文件,你可以透過key/value的形式存儲構建設置,類似於我們所用的dictionaries,通過使用.xcconfig文件,為每個構建定義構建參數非常容易,你會在接下來的教程內容中明白我的意思。
現在回到專案來創建一個.xcconfig文件,在項目導航器中,右鍵點擊專案文件夾並選擇New file…. 在彈出的視窗中選擇Configurations Settings File。 在下一個畫面中,將其命名為“Staging”,並確保targets複選框全部都是未選取狀態,因為我們不希望將其包含在應用程式的bundle中。
現在進入你專案的info頁面中,在Configurations這個Section下展開列表,並從下拉框中選擇xcconfile “Staging”。
完成後,你可以選擇Debug重複該流程,同樣的,我們也對Release重複這個操作。
更改構建資訊(Changing the Build Information)
一旦你有Xcode的配置文件設置,就可以非常直接的改變構建內容。假設你想要改變構建資訊,如應用程式名稱、應用程式版本,或是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
你可以在project settings,info.plist和entitlement files中使用你的配置變數(configuration variables)。在本文範例中,我們將在info.plist中使用它改變app名稱、app版本和bundle identifier,如下所示:
為了看得更清楚,我將自己開發工作室的名稱IntensifyStudio,用來作為一個自定義前綴詞“IS”,以便與預設內容做出區別。
更改App Icon
使用Xcode配置文件,你現在可以輕鬆配置不同版本的app icon,自定義不同版本app icon的過程與前面章節中展示的過程相同,只是該變量將在Build settings中使用。 參考下列做法編輯每個.xcconfig
文件:
Debug.xcconfig:
IS_APP_ICON = AppIconDebug
Staging.xcconfig:
IS_APP_ICON = AppIconStaging
Release.xcconfig:
IS_APP_ICON = AppIconRelease
完成後,切換到Build Settings,將AppIcon替換為變數${IS_APP_ICON}:
然後在“Assets.xcassets”中創建幾套新的iOS 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
接下來,通過建立新的欄位,將這些變量添加到Info.plist,如下圖所示:
你就可以使用下面的範例程式碼在運行時從plist文件讀取所需的值:
func infoForKey(_ key: String) -> String? { return (Bundle.main.infoDictionary?[key] as? String)? .replacingOccurrences(of: "\\", with: "") }
程式碼非常簡單,我們正在訪問Main Bundle來取得我們想要使用的資訊,接著,如果返回的值是一個URL,我們從字符中刪除所有反斜線(backslashes)。
在不同的構建配置之間切換
要在構建配置之間進行切換,只需按住Option鍵並點擊頂部的scheme即可更改scheme,然後可以選擇你偏好的build configuration。
總結
Xcode的Configuration file是配置不同build configuration的實用作法,使開發者可以輕鬆管理構建變數,你對這個教程有什麼想法嗎?如果對xcconfig有任何疑問,請在下方討論區告訴我們。
FB : https://www.facebook.com/yishen.chen.54
Twitter : https://twitter.com/YeEeEsS
原文:Using Xcode Configuration (.xcconfig) to Manage Different Build Settings