iOS多環(huán)境配置

由于項目需要為一個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)提供了兩種配置:DebugRelease

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

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

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

1.png

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

2.png

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

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

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

3.png

4.png

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

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

41.png

如果你正與其他人一同在此項目中状飞,他們將不會看到你的新方案,因為你沒有分享它书斜。如果你選擇你的方案诬辈,并且點擊share復選框,然后提交到你的源代碼管理系統(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陨亡、你可以直接從目標中通過勾選復選框添加或移除文件

8.png

最后一步是當應(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ù)你的具體配置文件夾中的所有文件復制到構(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

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è)備上安裝多個版本产场。由于所有的版本仍具有相同的名稱和圖標鹅髓,很難區(qū)分不同的版本。讓我們繼續(xù)尋求更完美的為不同的應(yīng)用程序更改名稱和圖標京景。

  • 為每個環(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è)置不同的圖標
    為了讓每一個環(huán)境都有自己的圖標仔引,我們將使用的是默認情況下為每個項目創(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洲愤,為每個圖標集拖拽合適的圖標颓芭,如下所示

16.png

現(xiàn)在我們已經(jīng)把所有的圖標準備完畢,我們需要告訴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ù)當前環(huán)境的某些部分洲敢,可以使用預(yù)處理宏∏羊牵或許你現(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)系作者
  • 序言:七十年代末询一,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子癌椿,更是在濱河造成了極大的恐慌家凯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件如失,死亡現(xiàn)場離奇詭異,居然都是意外死亡送粱,警方通過查閱死者的電腦和手機褪贵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脆丁,你說我怎么就攤上這事世舰。” “怎么了槽卫?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵跟压,是天一觀的道長。 經(jīng)常有香客問我歼培,道長震蒋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任躲庄,我火速辦了婚禮查剖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘噪窘。我一直安慰自己笋庄,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布倔监。 她就那樣靜靜地躺著直砂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浩习。 梳的紋絲不亂的頭發(fā)上静暂,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音瘦锹,去河邊找鬼籍嘹。 笑死,一個胖子當著我的面吹牛弯院,可吹牛的內(nèi)容都是我干的辱士。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼听绳,長吁一口氣:“原來是場噩夢啊……” “哼颂碘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起椅挣,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤头岔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鼠证,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峡竣,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年量九,在試婚紗的時候發(fā)現(xiàn)自己被綠了适掰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颂碧。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖类浪,靈堂內(nèi)的尸體忽然破棺而出载城,到底是詐尸還是另有隱情,我是刑警寧澤费就,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布诉瓦,位于F島的核電站,受9級特大地震影響力细,放射性物質(zhì)發(fā)生泄漏睬澡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一艳汽、第九天 我趴在偏房一處隱蔽的房頂上張望猴贰。 院中可真熱鬧,春花似錦河狐、人聲如沸米绕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栅干。三九已至,卻和暖如春捐祠,著一層夾襖步出監(jiān)牢的瞬間碱鳞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工踱蛀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窿给,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓率拒,卻偏偏與公主長得像崩泡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子猬膨,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容