由于項目需要為一個APP生成不同環境下的版本,例如Debug版本、Release版本、Test版本,于是研究了一下Build Configuration
。
本文是對本人學習iOS multi-environment
configuration這篇文章的簡單記錄總結,原文內容可查看
http://appfoundry.be/blog/2014/07/04/Xcode-Env-Configuration/
接下來進入正文哈~~
以下這個小例子將展示如何在你的Xcode項目中進行多環境配置。
- 目標
在開發應用程序時,你可能需要在不同情況下做不同的事情。例如通過不同的URL連接到AdHoc分布與AppStore中發布。Xcode提供了一個非常容易使用的機制:Configurations
最終的目標是:
每個環境有一個單獨的配置文件。如果我們每個環境中有一個或多個文件,例如我們可以改變URL從測試服務器到正式服務器。
每個環境中有不同的bundleID、bundleName和app圖標。這樣做可以確保您可以直接識別安裝在設備上的不同版本。也許更重要的是,它能夠使我們在設備上有多個不同的版本,因為在每個環境中都有自己的bundleID
有一個預處理宏以便能夠根據不同的環境動態切換。當你需要切換環境的時候這可能是便利的。例如登錄的開發版本,但是避免在AdHoc和AppStore中發布這些日志。
- 在Xcode中添加配置
你可能知道也可能不知道,當你創建了一個新的項目時,Xcode已經提供了兩種配置:Debug
和Release
這種配置的好處是,你可以基于這些配置構建自己的配置,你還可以自定義腳本和自定義設置。通過這些技術我們可以提高我們的項目設置。我們在GitHub上的項目就是這種設置的結果。GitHub例子(https://github.com/appfoundry/ios-multi-env-configuration) ,接下來我們將引導您如何讓這一切發生。
我們增加了一個額外的配置叫AdHoc
。
要添加這個配置,你需要選擇你的Xcode項目,如下所示
然后點擊+
,選擇Duplication "Release" Configuration
,添加一個新的配置
接下來,你需要告訴Xcode如何來使用它。
- 設置配置構建方案
我們將創建一個新的方案能夠發布在AdHoc中,要做到這一點,選擇項目的Manage Schemes
選擇當前的應用程序,點擊左下角的小齒輪,然后點擊Duplicate
,該應用程序構建方案具有相同的名稱并且作為項目默認設置
在新的對話框中,更改方案的名稱,例如你的App名稱+AdHoc
,然后選擇Archive
選項并且設置Configuration為AdHoc,完成之后點擊close按鈕
如果你正與其他人一同在此項目中,他們將不會看到你的新方案,因為你沒有分享它。如果你選擇你的方案,并且點擊share復選框,然后提交到你的源代碼管理系統,其他人將能夠使用這些方案了。
- 為每個環境設置不同的配置文件
具體目錄如下
請確保您是以下目錄結構
<source root
folder>/config/<configuration>/Configuration.plist
source root folder
跟.xcodeproj
位于同一目錄下。這些Configuration文件夾命名必須與你的項目配置名稱匹配,顯然這些是區分大小寫的。
- 為了確保我們為每個環境使用了正確的配置,讓我們從應用程序中移除剛剛添加的文件。有以下幾種不同的方法:
1、你可以在文件目錄選擇文件,并在Target Membership
中取消勾選
2、你可以選擇項目根目錄,然后選擇
Build Phases
,在Copy Bundle Resources
中移除
3、你可以直接從目標中通過勾選復選框添加或移除文件
最后一步是當應用程序被編譯的時候拷貝到應用程序中。要做到這一點,進入項目根目錄,選擇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}/"
將以上內容拷貝到script中,如下所示
該腳本將根據你的具體配置文件夾中的所有文件復制到構建應用程序包文件夾中。重要是保持CopyBundle Resources和添加文件的順序。
繼續構建你的項目,然后檢查輸出,應該能看到echo 消息和列表文件被打印出來
- 使用配置的值
例如,在應用程序中獲取配置文件的路徑
- (NSString*) readValueFromConfigurationFile {
NSBundle*bundle = [NSBundlemainBundle];
NSString *path =[bundle pathForResource:@"Configuration"ofType:@"plist"];
NSDictionary*config = [NSDictionarydictionaryWithContentsOfFile:path];
return config[@"configParameter"];
}
注:以上的代碼片段是從示例代碼中提供的,具體可查看DRYShowConfigurationViewController
請記住,你也可以從你的應用程序info.plist
文件中查看,尤其是界面化的顯示。
NSDictionary *infoDictionary= [[NSBundle mainBundle]infoDictionary];
NSString *bundleId =infoDictionary[@"CFBundleIdentifier"];
NSString *bundleVersion =infoDictionary[@"CFBundleVersion"];
- 發布/構建不同的版本
雖然將每個環境的配置分離開是很好的,但真正有幫助的是同一時間發布多個版本。例如,它可以方便的讓你的設備分別安裝從AppStore下載的、AdHoc發布的和最近的開發版本。尤其是當有bug出現的時候,這是非??上驳脑O置。
由于每個配置環境具有相同的AppID,新安裝的應用將會覆蓋當前安裝的應用程序,我們需要為每個環境定義不同的AppID,這可以通過User-Defined
來設置。
具體操作如下:
選中targets
重命名CustomAppBundleld
為不同的環境設置如下
//AdHoc
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}.${CONFIGURATION}
//Debug
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}.${CONFIGURATION}
//Release
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}
本項目的配置如下
Xcode中解決了使用變量的正確方式并展示了具體的使用值,我們為不同的配置添加了后綴為Debug和AdHoc,而Release則不使用Release后綴。
我們仍然需要為應用程序設置bundleId,將Bundle identifier
的值改為${CustomAppBundleId}
,設置如下
有了這個設置,你現在就可以在你的設備上安裝多個版本。由于所有的版本仍具有相同的名稱和圖標,很難區分不同的版本。讓我們繼續尋求更完美的為不同的應用程序更改名稱和圖標。
- 為每個環境設置正式的名稱
仍然通過User-Defined
進行設置,給新添加的usedefined命名為CustomProductName
//AdHoc
ConApp AH
//Debug
ConApp DE
//Release
${PRODUCT_NAME}
正如你看到的,我們為Release命名為應用程序的名稱,其他兩項使用自定義值。接下來修改Bundle name
和Bundle display name
的值為${CustomProductName}
- 為每個環境設置不同的圖標
為了讓每一個環境都有自己的圖標,我們將使用的是默認情況下為每個項目創建的目錄。Xcode默認會在應用程序下創建Images.xcassets
文件目錄,里邊包含了AppIcon
和LaunchImage
集。
注意:在Xcode5之前是沒有此目錄的,你可以通過info.plist
文件中改變Icon files
值。
我們將需要兩個額外的App Icon。點擊Editor->New App Icon
,分別重命名為AppStoreIcon-Debug
和AppIcon-AdHoc
,并將默認的AppIcon更改為AppIcon-Release
,為每個圖標集拖拽合適的圖標,如下所示
現在我們已經把所有的圖標準備完畢,我們需要告訴Xcode來如何顯示它們。具體操作如下:
命名規范如下
AppIcon-${CONFIGURATION}
至此,你的應用程序為不同的環境已經配置完畢,現在你要做的就是測試它們。運行在Xcode上,看看Debug配置。切換到AdHoc下看看,最后在切換到發布版本看看,如果均能正常工作,那么我們的配置即是成功的。
部署完應用程序,你也可以通過以下檢查是否正常,如果正常,那么每個環境中BundleName 、Bundle Display Name、BundleID、AppIcon均顯示正常
- 獎勵:功能開關與宏
為了使代碼根據當前環境的某些部分,可以使用預處理宏?;蛟S你現在可能已經猜到了,你可以在Build
Settings中設置這些宏。
具體設置如下:
CONFIGURATION_${CONFIGURATION}
這樣做后,你可以使用宏在你代碼中監測某種環境,使用如下:
#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
備注:
本文主要是我本人記錄使用的,由于英語水平及其有限,翻譯內容有什么錯誤還請大家及時指出,將不勝感激~~