由于項目需要為一個APP生成不同環(huán)境下的版本承桥,例如Debug版本、Release版本、Test版本母廷,于是研究了一下Build Configuration
椎咧。
本文是對本人學習iOS multi-environment
configuration這篇文章的簡單記錄總結(jié),原文內(nèi)容可查看
http://appfoundry.be/blog/2014/07/04/Xcode-Env-Configuration/
接下來進入正文哈~~
以下這個小例子將展示如何在你的Xcode項目中進行多環(huán)境配置巢墅。
- 目標
在開發(fā)應(yīng)用程序時蓄髓,你可能需要在不同情況下做不同的事情玩郊。例如通過不同的URL連接到AdHoc分布與AppStore中發(fā)布耻陕。Xcode提供了一個非常容易使用的機制:Configurations
最終的目標是:
每個環(huán)境有一個單獨的配置文件已卷。如果我們每個環(huán)境中有一個或多個文件存皂,例如我們可以改變URL從測試服務(wù)器到正式服務(wù)器疤孕。
每個環(huán)境中有不同的bundleID、bundleName和app圖標境输。這樣做可以確保您可以直接識別安裝在設(shè)備上的不同版本黔攒。也許更重要的是赏胚,它能夠使我們在設(shè)備上有多個不同的版本劫哼,因為在每個環(huán)境中都有自己的bundleID
有一個預(yù)處理宏以便能夠根據(jù)不同的環(huán)境動態(tài)切換。當你需要切換環(huán)境的時候這可能是便利的糯耍。例如登錄的開發(fā)版本舵鳞,但是避免在AdHoc和AppStore中發(fā)布這些日志套才。
- 在Xcode中添加配置
你可能知道也可能不知道携兵,當你創(chuàng)建了一個新的項目時巴柿,Xcode已經(jīng)提供了兩種配置:Debug
和Release
這種配置的好處是至非,你可以基于這些配置構(gòu)建自己的配置味悄,你還可以自定義腳本和自定義設(shè)置茧球。通過這些技術(shù)我們可以提高我們的項目設(shè)置福侈。我們在GitHub上的項目就是這種設(shè)置的結(jié)果堰汉。GitHub例子(https://github.com/appfoundry/ios-multi-env-configuration) 汉匙,接下來我們將引導您如何讓這一切發(fā)生伤锚。
我們增加了一個額外的配置叫AdHoc
耳胎。
要添加這個配置,你需要選擇你的Xcode項目驶社,如下所示
然后點擊+
,選擇Duplication "Release" Configuration
,添加一個新的配置
接下來,你需要告訴Xcode如何來使用它。
- 設(shè)置配置構(gòu)建方案
我們將創(chuàng)建一個新的方案能夠發(fā)布在AdHoc中,要做到這一點,選擇項目的Manage Schemes
選擇當前的應(yīng)用程序避除,點擊左下角的小齒輪怎披,然后點擊Duplicate
,該應(yīng)用程序構(gòu)建方案具有相同的名稱并且作為項目默認設(shè)置
在新的對話框中瓶摆,更改方案的名稱凉逛,例如你的App名稱+AdHoc
,然后選擇Archive
選項并且設(shè)置Configuration為AdHoc群井,完成之后點擊close按鈕
如果你正與其他人一同在此項目中状飞,他們將不會看到你的新方案,因為你沒有分享它书斜。如果你選擇你的方案诬辈,并且點擊share復選框,然后提交到你的源代碼管理系統(tǒng)荐吉,其他人將能夠使用這些方案了焙糟。
- 為每個環(huán)境設(shè)置不同的配置文件
具體目錄如下
請確保您是以下目錄結(jié)構(gòu)
<source root
folder>/config/<configuration>/Configuration.plist
source root folder
跟.xcodeproj
位于同一目錄下。這些Configuration文件夾命名必須與你的項目配置名稱匹配样屠,顯然這些是區(qū)分大小寫的穿撮。
- 為了確保我們?yōu)槊總€環(huán)境使用了正確的配置,讓我們從應(yīng)用程序中移除剛剛添加的文件瞧哟。有以下幾種不同的方法:
1混巧、你可以在文件目錄選擇文件,并在Target Membership
中取消勾選
2勤揩、你可以選擇項目根目錄,然后選擇
Build Phases
秘蛔,在Copy Bundle Resources
中移除
3陨亡、你可以直接從目標中通過勾選復選框添加或移除文件
最后一步是當應(yīng)用程序被編譯的時候拷貝到應(yīng)用程序中。要做到這一點深员,進入項目根目錄负蠕,選擇NewRun Script Phase,并命名為CopyConfiguration File(s)
RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/${CONFIGURATION}BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app echo "Copying all
files under ${RESOURCE_PATH} to ${BUILD_APP_DIR}"cp -v "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"
將以上內(nèi)容拷貝到script中倦畅,如下所示
該腳本將根據(jù)你的具體配置文件夾中的所有文件復制到構(gòu)建應(yīng)用程序包文件夾中遮糖。重要是保持CopyBundle Resources和添加文件的順序。
繼續(xù)構(gòu)建你的項目叠赐,然后檢查輸出欲账,應(yīng)該能看到echo 消息和列表文件被打印出來
- 使用配置的值
例如屡江,在應(yīng)用程序中獲取配置文件的路徑
- (NSString*) readValueFromConfigurationFile {
NSBundle*bundle = [NSBundlemainBundle];
NSString *path =[bundle pathForResource:@"Configuration"ofType:@"plist"];
NSDictionary*config = [NSDictionarydictionaryWithContentsOfFile:path];
return config[@"configParameter"];
}
注:以上的代碼片段是從示例代碼中提供的,具體可查看DRYShowConfigurationViewController
請記住赛不,你也可以從你的應(yīng)用程序info.plist
文件中查看惩嘉,尤其是界面化的顯示。
NSDictionary *infoDictionary= [[NSBundle mainBundle]infoDictionary];
NSString *bundleId =infoDictionary[@"CFBundleIdentifier"];
NSString *bundleVersion =infoDictionary[@"CFBundleVersion"];
- 發(fā)布/構(gòu)建不同的版本
雖然將每個環(huán)境的配置分離開是很好的踢故,但真正有幫助的是同一時間發(fā)布多個版本文黎。例如,它可以方便的讓你的設(shè)備分別安裝從AppStore下載的殿较、AdHoc發(fā)布的和最近的開發(fā)版本耸峭。尤其是當有bug出現(xiàn)的時候,這是非沉芨伲可喜的設(shè)置劳闹。
由于每個配置環(huán)境具有相同的AppID,新安裝的應(yīng)用將會覆蓋當前安裝的應(yīng)用程序帚戳,我們需要為每個環(huán)境定義不同的AppID玷或,這可以通過User-Defined
來設(shè)置。
具體操作如下:
選中targets
重命名CustomAppBundleld
為不同的環(huán)境設(shè)置如下
//AdHoc
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}.${CONFIGURATION}
//Debug
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}.${CONFIGURATION}
//Release
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}
本項目的配置如下
Xcode中解決了使用變量的正確方式并展示了具體的使用值片任,我們?yōu)椴煌呐渲锰砑恿撕缶Y為Debug和AdHoc偏友,而Release則不使用Release后綴。
我們?nèi)匀恍枰獮閼?yīng)用程序設(shè)置bundleId对供,將Bundle identifier
的值改為${CustomAppBundleId}
位他,設(shè)置如下
有了這個設(shè)置,你現(xiàn)在就可以在你的設(shè)備上安裝多個版本产场。由于所有的版本仍具有相同的名稱和圖標鹅髓,很難區(qū)分不同的版本。讓我們繼續(xù)尋求更完美的為不同的應(yīng)用程序更改名稱和圖標京景。
- 為每個環(huán)境設(shè)置正式的名稱
仍然通過User-Defined
進行設(shè)置窿冯,給新添加的usedefined命名為CustomProductName
//AdHoc
ConApp AH
//Debug
ConApp DE
//Release
${PRODUCT_NAME}
正如你看到的,我們?yōu)镽elease命名為應(yīng)用程序的名稱,其他兩項使用自定義值。接下來修改Bundle name
和Bundle display name
的值為${CustomProductName}
- 為每個環(huán)境設(shè)置不同的圖標
為了讓每一個環(huán)境都有自己的圖標仔引,我們將使用的是默認情況下為每個項目創(chuàng)建的目錄。Xcode默認會在應(yīng)用程序下創(chuàng)建Images.xcassets
文件目錄芜赌,里邊包含了AppIcon
和LaunchImage
集。
注意:在Xcode5之前是沒有此目錄的伴逸,你可以通過info.plist
文件中改變Icon files
值缠沈。
我們將需要兩個額外的App Icon。點擊Editor->New App Icon
,分別重命名為AppStoreIcon-Debug
和AppIcon-AdHoc
,并將默認的AppIcon更改為AppIcon-Release
洲愤,為每個圖標集拖拽合適的圖標颓芭,如下所示
現(xiàn)在我們已經(jīng)把所有的圖標準備完畢,我們需要告訴Xcode來如何顯示它們禽篱。具體操作如下:
命名規(guī)范如下
AppIcon-${CONFIGURATION}
至此畜伐,你的應(yīng)用程序為不同的環(huán)境已經(jīng)配置完畢,現(xiàn)在你要做的就是測試它們躺率。運行在Xcode上玛界,看看Debug配置。切換到AdHoc下看看悼吱,最后在切換到發(fā)布版本看看慎框,如果均能正常工作,那么我們的配置即是成功的后添。
部署完應(yīng)用程序笨枯,你也可以通過以下檢查是否正常,如果正常遇西,那么每個環(huán)境中BundleName 馅精、Bundle Display Name、BundleID粱檀、AppIcon均顯示正常
- 獎勵:功能開關(guān)與宏
為了使代碼根據(jù)當前環(huán)境的某些部分洲敢,可以使用預(yù)處理宏∏羊牵或許你現(xiàn)在可能已經(jīng)猜到了,你可以在Build
Settings中設(shè)置這些宏压彭。
具體設(shè)置如下:
CONFIGURATION_${CONFIGURATION}
這樣做后,你可以使用宏在你代碼中監(jiān)測某種環(huán)境渗常,使用如下:
#if defined (CONFIGURATION_AdHoc) || defined (CONFIGURATION_Debug)
//Code placed here
will only be compiled and thus
//included at runtime in AdHoc and Debug releases.
#endif
備注:
本文主要是我本人記錄使用的壮不,由于英語水平及其有限,翻譯內(nèi)容有什么錯誤還請大家及時指出皱碘,將不勝感激~~