原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載自Keegan小鋼
并標(biāo)明原文鏈接:http://keeganlee.me/post/architecture/20160404
微信訂閱號(hào):keeganlee_me
寫于2016-04-04
App環(huán)境分離的實(shí)現(xiàn):Android篇
App環(huán)境分離的實(shí)現(xiàn):iOS篇
說(shuō)到App環(huán)境分離在iOS的實(shí)現(xiàn),我曾在iOS技術(shù)群里問過:如何實(shí)現(xiàn)在同一臺(tái)手機(jī)能同時(shí)安裝同個(gè)應(yīng)用的測(cè)試和生產(chǎn)版本?應(yīng)用名稱要有區(qū)分,圖標(biāo)也要有所區(qū)別。不要手動(dòng)修改Bundle id和應(yīng)用名稱,也不要手動(dòng)替換圖標(biāo),更不要維護(hù)兩個(gè)項(xiàng)目。如何才能簡(jiǎn)單地實(shí)現(xiàn)?
結(jié)果發(fā)現(xiàn)很多人都不知道該怎么實(shí)現(xiàn)。其實(shí),實(shí)現(xiàn)方案很簡(jiǎn)單,只要建立多個(gè)Target即可。當(dāng)然,有些細(xì)節(jié)問題要注意,不然會(huì)出錯(cuò)。接下來(lái),看如何一步步地實(shí)現(xiàn)環(huán)境分離。
關(guān)于Xcode中Target的概念,文檔中有這么一段說(shuō)明:
A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defines a single product; it organizes the inputs into the build system—the source files and instructions for processing those source files—required to build that product. Projects can contain one or more targets, each of which produces one product.
即是說(shuō),每個(gè)Target代表一個(gè)編譯的產(chǎn)品。每個(gè)Target,可以有不同的編譯源文件和資源文件。那么,實(shí)現(xiàn)環(huán)境分離的方案,就是分別建立測(cè)試環(huán)境和生產(chǎn)環(huán)境的兩個(gè)Target。默認(rèn)的Target作為生產(chǎn)環(huán)境的Target,在此基礎(chǔ)上復(fù)制多一個(gè)Target作為測(cè)試環(huán)境的Target。
如下圖,選擇默認(rèn)的Target,從右鍵菜單中選擇Duplicate,就可以復(fù)制出一個(gè)新的Target了。
新Target默認(rèn)名稱為productname copy。復(fù)制完成后,不只是TARGETS列表中多出了名為productname copy的新Target,同時(shí)也會(huì)為該新Target生成名為productname copy的新的scheme,以及在項(xiàng)目的根目錄下生成productname copy-Info.plist文件。
不喜歡productname copy這樣的名字,productnameBeta這樣的名字才是測(cè)試版本該有的名字。那么,需要改名的地方有三處:target名稱、scheme名稱、plist文件名稱。
修改target名稱很簡(jiǎn)單,只要在TARGETS列表中選中后,再點(diǎn)擊一下即可編輯修改名稱。修改scheme則可以在Xcode左上角的Run\Stop按鈕右邊的scheme列表菜單中選擇Manage Schemes,打開彈出框,如下圖,則可將productname copy修改為productnameBeta
接下來(lái),就要修改Target的配置,實(shí)現(xiàn)真正的環(huán)境分離了。默認(rèn)的productname的Target,作為生產(chǎn)版本,基本不需要改動(dòng),需要改的是作為測(cè)試版的productnameBeta。
首先,修改productnameBeta的Bundle id,在原有的基礎(chǔ)上添加后綴“.beta”,以實(shí)現(xiàn)能和生產(chǎn)版同時(shí)安裝在同一臺(tái)設(shè)備上。
接著,修改Bundle display name,可在原有名稱的基礎(chǔ)上添加后綴“Beta”,以實(shí)現(xiàn)和生產(chǎn)版應(yīng)用名稱上的區(qū)分。
然后,需要更換圖標(biāo)了。默認(rèn)會(huì)使用AppIcon這一項(xiàng)Assets,但AppIcon是給生產(chǎn)版設(shè)置的圖標(biāo),既然測(cè)試版要使用不同圖標(biāo),那就需要新建一套新的App Icon,如下圖:
那么,設(shè)置了不同Target后,代碼上可能需要根據(jù)不同Target做不同處理,因此,需要在代碼上能判斷當(dāng)前編譯的是哪個(gè)Target。這可以通過預(yù)編譯宏來(lái)區(qū)分。例如,我們?cè)?strong>productnameBeta的Build Settings中,將Preprocessor Macros屬性值設(shè)置為BETA,也就是為productnameBeta定義了一個(gè)預(yù)編譯宏,宏名稱為BETA。
然后,在代碼中可以通過如下預(yù)編譯指令判斷當(dāng)前是在哪個(gè)Target下:
#ifdef BETA // 測(cè)試版需要執(zhí)行的代碼#else // 默認(rèn)生產(chǎn)版需要執(zhí)行的代碼#endif
通過多個(gè)Target可以實(shí)現(xiàn)環(huán)境的分離,本文的實(shí)現(xiàn)很簡(jiǎn)單。而關(guān)于Target的用法也不只限于此,若想了解Target更多高級(jí)用法,可查詢相關(guān)資料,在此就不展開了。
掃描以下二維碼即可關(guān)注訂閱號(hào)。
回復(fù) zyg: 修改一下比較好,名字上也區(qū)分一下
聯(lián)系客服