iOS多Target開發(fā)相似App

我們?cè)趇OS開發(fā)中可能會(huì)遇到同時(shí)開發(fā)多個(gè)類似項(xiàng)目的情況废离。這些項(xiàng)目大同小異侄泽,有諸多代碼可以共用,如果每個(gè)項(xiàng)目都分別開發(fā)蜻韭,這在后期的迭代中會(huì)十分繁瑣悼尾。為了解決這個(gè)問題,使用多Target開發(fā)是一種比較好的選擇肖方,本文就這一技術(shù)實(shí)現(xiàn)進(jìn)行簡(jiǎn)要總結(jié)闺魏。

一、理解項(xiàng)目中的Porject與Target

使用Xcode來開發(fā)項(xiàng)目俯画,其中的Project是一個(gè)整體項(xiàng)目相當(dāng)于一個(gè)倉(cāng)庫(kù)析桥,包括了所有的代碼和資源文件。而Target相當(dāng)于一個(gè)具體的產(chǎn)品,包含了對(duì)于代碼烹骨,資源文件的具體使用規(guī)則和配置。一個(gè)Project可以包含多個(gè)Target材泄,也就是說通過不同Target我們可以生成不同的APP沮焕。

二、多Target開發(fā)項(xiàng)目的實(shí)踐步驟

使用多Target來創(chuàng)建項(xiàng)目拉宗,就以我當(dāng)前正在開發(fā)的親戚買房APP為例峦树。需求是這樣的:親戚買房是一個(gè)為買房人提供砍價(jià)服務(wù)的APP,APP的用戶需要區(qū)分為用戶旦事, 專家砍價(jià)師三個(gè)用戶群體魁巩。所以這里以Customer,Consultant姐浮,Bargain三個(gè)Target來開發(fā)應(yīng)用

  1. 以QQMF(親戚買房)為名創(chuàng)建一個(gè)新的工程如下:


    屏幕快照 2017-11-20 上午11.25.03.png
  2. 創(chuàng)建三種Target
    創(chuàng)建新Target的方式有兩種:
    第一種:依次選擇File->New->Target谷遂,然后選擇一個(gè)模板(通常是Single View App)來創(chuàng)建。只是這樣創(chuàng)建的target帶有Appdelegate和main等文件卖鲤,在這里并不會(huì)用到這些文件肾扰,所以我們采用第二種方式創(chuàng)建。
    第二種:
    在Targets中點(diǎn)擊已有的Target蛋逾,右鍵選擇Duplicate可以復(fù)制生成一個(gè)copy的新Target集晚,并且在文件目錄中生成對(duì)應(yīng)的copy-Info.plist文件。這樣生成的target與被拷貝的target相似度很大区匣,減少了過多的修改偷拔。通常為了減少后期的修改,我們也會(huì)首先在原有的Target中修改一些配置之后再Duplicate亏钩。

    屏幕快照 2017-11-20 上午11.27.06.png

執(zhí)行了Duplicate操作之后的效果如下:


屏幕快照 2017-11-20 上午11.29.38.png
  1. 修改Targe和plist文件的名稱為自己需要的名稱
    在Target里可以直接修改Target的名稱莲绰,在文件目錄下也可以直接修改plist文件的名稱。如果我們不想文件結(jié)構(gòu)那么亂铸屉,也可以像其他文件一樣移動(dòng)plist文件的位置并重新引用到工程中钉蒲,如下:


    屏幕快照 2017-11-20 下午6.35.12.png

    特別注意:我們?cè)谝苿?dòng)文件的時(shí)候可能需要重新引用文件到工程中,此時(shí)add文件的時(shí)候一定要注意選擇Target彻坛,如果是共用文件一定要勾選對(duì)應(yīng)的Target顷啼,類似AppDelegate這樣文件的操作如下:


    屏幕快照 2017-11-20 下午6.29.01.png
  2. 修改Xcode左上角的Target名稱
    選中Xcode左上角的創(chuàng)建工程時(shí)的Target(QQMF),選擇Manage schemes


    屏幕快照 2017-11-20 下午6.38.06.png

    在如下的schemes中修改Target的名稱昌屉,這里也可以刪除多余的最初的QQMF


    屏幕快照 2017-11-20 上午11.47.18.png

特別說明:QQMF是我們創(chuàng)建工程自帶的Target,其實(shí)也可以修改它的名字以供自定義使用钙蒙,而這里我們是直接刪掉了它,這樣之后间驮,項(xiàng)目自帶的info.plist也是沒用的了躬厌,也可以刪掉。

  1. 設(shè)置Target與plist文件對(duì)應(yīng)
    切換到Target目錄下,我們可以在這里刪掉用不到的QQMF扛施,選擇其中一個(gè)Target之后并選擇general鸿捧,然后可以看到每個(gè)Target的右側(cè)都有對(duì)應(yīng)的choose info.plist file選項(xiàng),點(diǎn)擊可以選擇與Target對(duì)應(yīng)的plist文件疙渣。這也就相當(dāng)于不同的Target項(xiàng)目對(duì)應(yīng)了不同的plist配置匙奴。


    屏幕快照 2017-11-20 下午2.01.27.png
  2. 為每個(gè)Target設(shè)置Display Name,Bundle Identifier等信息
    點(diǎn)擊Target->選擇General妄荔,我們分別設(shè)置不同項(xiàng)目的名稱和BundleID信息泼菌,以及證書等


    屏幕快照 2017-11-20 下午2.28.17.png
  3. 同一份代碼區(qū)分不同Target的操作
    使用多Target是為了共用一部分代碼,但是有些共用的文件在不同的Target下是有細(xì)微不同的啦租,那么我們?cè)诰唧w實(shí)現(xiàn)的時(shí)候就需要作出區(qū)分哗伯。這里解決的方法是針對(duì)不同的Target定義宏。
    首先選擇一個(gè)Target,如Customer篷角,依次選擇Build Settings ->搜索PreprocessorMacros, 在找到PreprocessorMacros之后焊刹,我們分別在Debug和Release中設(shè)置TargetType=1如下圖進(jìn)行設(shè)置:


    屏幕快照 2017-11-20 下午6.45.35.png

其他的Target也是同樣的設(shè)置方式,只是要區(qū)分TargetType的值内地,分別是2伴澄,3(TargetType及其值都是自定義的)。然后就是在代碼中的使用如下圖阱缓,分別選擇Xcode左上角不同的Target運(yùn)行非凌,查看控制臺(tái)驗(yàn)證是否成功。

屏幕快照 2017-11-20 下午6.55.02.png
  1. 解決使用Cocoapods的問題
    因?yàn)榇嬖诙鄠€(gè)Target荆针,我們需要區(qū)別的設(shè)置不同target需要的第三方庫(kù)敞嗡,如下圖。這里可能出現(xiàn)的問題是如果有很多類似AFNetworking這樣的被多個(gè)Target需要的類庫(kù)航背,我們?cè)趧h除和增加的時(shí)候就會(huì)頻繁的操作而且會(huì)代碼冗余喉悴。


    屏幕快照 2017-11-20 下午7.22.34.png

    解決上述問題的比較優(yōu)雅的做法是如下:


    屏幕快照 2017-11-20 下午7.39.25.png

三、遇到的問題

1.問題:invalid token at start of a preprocessor expression
原因:這是我在pch文件中判斷target類型出現(xiàn)的錯(cuò)誤玖媚,這句話的大致意思是:在預(yù)編譯階段箕肃,代碼并未運(yùn)行,無法判斷宏定義的值今魔。最后查找到原因是我在上述步驟設(shè)置宏定義的時(shí)候勺像,手誤設(shè)置了TargetType==1,這本是一句需要執(zhí)行才能得到結(jié)果的代碼错森。所以無法在#if的條件編譯中通過吟宦。
解決:在條件編譯中不使用代碼運(yùn)行時(shí)才生成的量即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載涩维,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者殃姓。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜗侈,更是在濱河造成了極大的恐慌篷牌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踏幻,死亡現(xiàn)場(chǎng)離奇詭異娃磺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叫倍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豺瘤,“玉大人吆倦,你說我怎么就攤上這事∽螅” “怎么了蚕泽?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)桥嗤。 經(jīng)常有香客問我须妻,道長(zhǎng),這世上最難降的妖魔是什么泛领? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任荒吏,我火速辦了婚禮,結(jié)果婚禮上渊鞋,老公的妹妹穿的比我還像新娘绰更。我一直安慰自己,他們只是感情好锡宋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布儡湾。 她就那樣靜靜地躺著,像睡著了一般执俩。 火紅的嫁衣襯著肌膚如雪徐钠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天役首,我揣著相機(jī)與錄音尝丐,去河邊找鬼。 笑死宋税,一個(gè)胖子當(dāng)著我的面吹牛摊崭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杰赛,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼呢簸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起根时,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤瘦赫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蛤迎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體确虱,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年替裆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了校辩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辆童,死狀恐怖宜咒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情把鉴,我是刑警寧澤故黑,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站庭砍,受9級(jí)特大地震影響场晶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怠缸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一诗轻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揭北,春花似錦概耻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嫉柴,卻和暖如春厌杜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背计螺。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工夯尽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人登馒。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓匙握,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親陈轿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子圈纺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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