iOS多環(huán)境配置

由于項目需要為一個APP生成不同環(huán)境下的版本,例如Debug版本、Release版本、Test版本,于是研究了一下Build Configuration。

本文是對本人學(xué)習(xí)iOS multi-environment
configuration這篇文章的簡單記錄總結(jié),原文內(nèi)容可查看
http://appfoundry.be/blog/2014/07/04/Xcode-Env-Configuration/

接下來進入正文哈~~

以下這個小例子將展示如何在你的Xcode項目中進行多環(huán)境配置。

  • 目標(biāo)

在開發(fā)應(yīng)用程序時,你可能需要在不同情況下做不同的事情。例如通過不同的URL連接到AdHoc分布與AppStore中發(fā)布。Xcode提供了一個非常容易使用的機制:Configurations

最終的目標(biāo)是:

每個環(huán)境有一個單獨的配置文件。如果我們每個環(huán)境中有一個或多個文件,例如我們可以改變URL從測試服務(wù)器到正式服務(wù)器。

每個環(huán)境中有不同的bundleID、bundleName和app圖標(biāo)。這樣做可以確保您可以直接識別安裝在設(shè)備上的不同版本。也許更重要的是,它能夠使我們在設(shè)備上有多個不同的版本,因為在每個環(huán)境中都有自己的bundleID

有一個預(yù)處理宏以便能夠根據(jù)不同的環(huán)境動態(tài)切換。當(dāng)你需要切換環(huán)境的時候這可能是便利的。例如登錄的開發(fā)版本,但是避免在AdHoc和AppStore中發(fā)布這些日志。

  • 在Xcode中添加配置

你可能知道也可能不知道,當(dāng)你創(chuàng)建了一個新的項目時,Xcode已經(jīng)提供了兩種配置:DebugRelease

這種配置的好處是,你可以基于這些配置構(gòu)建自己的配置,你還可以自定義腳本和自定義設(shè)置。通過這些技術(shù)我們可以提高我們的項目設(shè)置。我們在GitHub上的項目就是這種設(shè)置的結(jié)果。GitHub例子(https://github.com/appfoundry/ios-multi-env-configuration) ,接下來我們將引導(dǎo)您如何讓這一切發(fā)生。

我們增加了一個額外的配置叫AdHoc。

要添加這個配置,你需要選擇你的Xcode項目,如下所示

1.png

然后點擊+,選擇Duplication "Release" Configuration ,添加一個新的配置

2.png

接下來,你需要告訴Xcode如何來使用它。

  • 設(shè)置配置構(gòu)建方案

我們將創(chuàng)建一個新的方案能夠發(fā)布在AdHoc中,要做到這一點,選擇項目的Manage Schemes

3.png

4.png

選擇當(dāng)前的應(yīng)用程序,點擊左下角的小齒輪,然后點擊Duplicate,該應(yīng)用程序構(gòu)建方案具有相同的名稱并且作為項目默認設(shè)置

在新的對話框中,更改方案的名稱,例如你的App名稱+AdHoc,然后選擇Archive選項并且設(shè)置Configuration為AdHoc,完成之后點擊close按鈕

41.png

如果你正與其他人一同在此項目中,他們將不會看到你的新方案,因為你沒有分享它。如果你選擇你的方案,并且點擊share復(fù)選框,然后提交到你的源代碼管理系統(tǒng),其他人將能夠使用這些方案了。

5.png
  • 為每個環(huán)境設(shè)置不同的配置文件

具體目錄如下

未命名圖片.png

請確保您是以下目錄結(jié)構(gòu)

<source root
folder>/config/<configuration>/Configuration.plist

source root folder.xcodeproj位于同一目錄下。這些Configuration文件夾命名必須與你的項目配置名稱匹配,顯然這些是區(qū)分大小寫的。

6.png
  • 為了確保我們?yōu)槊總€環(huán)境使用了正確的配置,讓我們從應(yīng)用程序中移除剛剛添加的文件。有以下幾種不同的方法:

1、你可以在文件目錄選擇文件,并在Target Membership中取消勾選

7.png

2、你可以選擇項目根目錄,然后選擇Build Phases,在Copy Bundle Resources中移除

71.png

3、你可以直接從目標(biāo)中通過勾選復(fù)選框添加或移除文件

8.png

最后一步是當(dāng)應(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中,如下所示

9.png

該腳本將根據(jù)你的具體配置文件夾中的所有文件復(fù)制到構(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ā)版本。尤其是當(dāng)有bug出現(xiàn)的時候,這是非??上驳脑O(shè)置。

由于每個配置環(huán)境具有相同的AppID,新安裝的應(yīng)用將會覆蓋當(dāng)前安裝的應(yīng)用程序,我們需要為每個環(huán)境定義不同的AppID,這可以通過User-Defined來設(shè)置。

具體操作如下:
選中targets

10.png
11.png

重命名CustomAppBundleld

為不同的環(huán)境設(shè)置如下

//AdHoc
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}.${CONFIGURATION} 
//Debug 
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}.${CONFIGURATION} 
//Release 
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}

本項目的配置如下


12.png

Xcode中解決了使用變量的正確方式并展示了具體的使用值,我們?yōu)椴煌呐渲锰砑恿撕缶Y為Debug和AdHoc,而Release則不使用Release后綴。

我們?nèi)匀恍枰獮閼?yīng)用程序設(shè)置bundleId,將Bundle identifier的值改為${CustomAppBundleId},設(shè)置如下

13.png

有了這個設(shè)置,你現(xiàn)在就可以在你的設(shè)備上安裝多個版本。由于所有的版本仍具有相同的名稱和圖標(biāo),很難區(qū)分不同的版本。讓我們繼續(xù)尋求更完美的為不同的應(yīng)用程序更改名稱和圖標(biāo)。

  • 為每個環(huán)境設(shè)置正式的名稱
    仍然通過User-Defined進行設(shè)置,給新添加的usedefined命名為CustomProductName
14.png
//AdHoc
ConApp AH
//Debug
ConApp DE
//Release
${PRODUCT_NAME}

正如你看到的,我們?yōu)镽elease命名為應(yīng)用程序的名稱,其他兩項使用自定義值。接下來修改Bundle nameBundle display name的值為${CustomProductName}

15.png

  • 為每個環(huán)境設(shè)置不同的圖標(biāo)
    為了讓每一個環(huán)境都有自己的圖標(biāo),我們將使用的是默認情況下為每個項目創(chuàng)建的目錄。Xcode默認會在應(yīng)用程序下創(chuàng)建 Images.xcassets文件目錄,里邊包含了AppIconLaunchImage集。
    注意:在Xcode5之前是沒有此目錄的,你可以通過info.plist文件中改變Icon files值。

我們將需要兩個額外的App Icon。點擊Editor->New App Icon,分別重命名為AppStoreIcon-DebugAppIcon-AdHoc,并將默認的AppIcon更改為AppIcon-Release,為每個圖標(biāo)集拖拽合適的圖標(biāo),如下所示

16.png

現(xiàn)在我們已經(jīng)把所有的圖標(biāo)準(zhǔn)備完畢,我們需要告訴Xcode來如何顯示它們。具體操作如下:
17.png

命名規(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均顯示正常


171.png
  • 獎勵:功能開關(guān)與宏

為了使代碼根據(jù)當(dāng)前環(huán)境的某些部分,可以使用預(yù)處理宏?;蛟S你現(xiàn)在可能已經(jīng)猜到了,你可以在Build
Settings中設(shè)置這些宏。


18.png

具體設(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)容有什么錯誤還請大家及時指出,將不勝感激~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容