一、背景介紹伏嗜,為什么要新建target坛悉?
公司的一個(gè)新需求伐厌,需要在原有的企業(yè)版app基礎(chǔ)上,新做一個(gè)用戶版的app裸影。由于兩個(gè)app大部分內(nèi)容很相似挣轨,而且有一個(gè)共用的業(yè)務(wù)模塊。
大概情況如上空民,而痛點(diǎn)
如下:
- 雖然大部分內(nèi)容一開(kāi)始相同刃唐,但后面分歧會(huì)越來(lái)越大,畢竟是兩個(gè)app界轩,各有各的業(yè)務(wù)画饥,所以這大部分相同的代碼,將會(huì)被
拷貝成兩份代碼
浊猾。 - 共用一個(gè)業(yè)務(wù)模塊抖甘。在第1個(gè)痛點(diǎn)的時(shí)候,我們已經(jīng)把不共用的代碼拷貝成兩份了葫慎,如果共用模塊也拷貝兩份代碼的話衔彻,那以后共用模塊出現(xiàn)修改的話,就需要在
共用模塊的兩份代碼都修改一遍
偷办,容易出錯(cuò)艰额。 - 共用模塊也會(huì)出現(xiàn)小部分的兩個(gè)app
不同的業(yè)務(wù)處理
。
針對(duì)以上三個(gè)痛點(diǎn)椒涯,新建一個(gè)target正好可以解決這幾個(gè)問(wèn)題柄沮。
二、如何新建target废岂?
新建target有兩個(gè)方法祖搓。
方法一:復(fù)制target
在已有的target上,已有target
-->右鍵
-->Duplicaate
-->Duplicaate Only
湖苞。
復(fù)制成功后拯欧,工程目錄下會(huì)出現(xiàn)copy-Info.plist文件。
方法二:新建target
通過(guò)菜單
-->Editor
-->Add Target
--> Application
--> Singe View Application
--> Product Name
新建成功后财骨,工程目錄會(huì)出現(xiàn)新target目錄镐作,里面會(huì)包含以下文件
方法一、二的不同點(diǎn):
方法一中隆箩,新target保留了被拷貝的target全部配置和文件引用滑肉,只需稍作修改就能生成一個(gè)新的app(比如修改包名、圖標(biāo)和啟動(dòng)圖之類的)摘仅。
方法二中,新target將不保留被拷貝的target全部配置和文件引用问畅,相當(dāng)于一個(gè)全新的app(Singe View Application)娃属。
三六荒、不同的target作用
每個(gè)Target都包含了Copy Bundle Resources
, Compile Sources
, Link Binary With Libraries
、info.plist
等矾端,對(duì)不同的app進(jìn)行管理掏击。
其作用如下:
-
Copy Bundle Resources
是指生成app后里面所包含的資源文件,比如圖片秩铆。 -
Compile Sources
是指哪些源代碼會(huì)被該target引用編譯砚亭。 -
Link Binary With Libraries
是指引用哪些庫(kù)文件。 -
info.plist
殴玛,這個(gè)應(yīng)該都是知道是比較重要的捅膘,比如包名、版本號(hào)和權(quán)限之類的滚粟。
四寻仗、選擇方案
為了解決上面的第1個(gè)痛點(diǎn),我選擇方法二來(lái)新建target
凡壤。因?yàn)?code>方法一會(huì)引用原有的大部分源代碼署尤,不符合我需要拷貝兩份代碼的需求。
好了亚侠,方案確定了曹体,就準(zhǔn)備大干一場(chǎng)了,因?yàn)榉椒ǘ?huì)相對(duì)復(fù)雜很多硝烂,也會(huì)報(bào)很多的錯(cuò)誤箕别,接下來(lái)一一解決。
五钢坦、開(kāi)始新建target工作
1究孕、使用方法二新建target
2、新建一個(gè)共用模塊文件夾
3爹凹、把需要共用模塊的代碼(看你的需要)厨诸,拷貝到CommonModule的finder目錄下。
4禾酱、在工程中目錄中微酬,徹底刪除原target中共用模塊代碼。(Move to Trash)
5颤陶、再把這些共用模塊代碼拉到CommonModule工程目錄下颗管,Add to選中: 原target+新target
PS:(2、3滓走、4垦江、5概括來(lái)說(shuō)就是:共用模塊獨(dú)立出來(lái),并被新舊兩個(gè)target所引用)
6搅方、在工程中目錄中比吭,徹底刪除新target里的所有東西
首先绽族,徹底刪除掉這幾個(gè)文件:
如果新target的finder目錄下還有一些空文件夾,也全部刪除衩藤。
7吧慢、把原target的finder目錄下所有文件,拷貝到新target的finder目錄下赏表。
8检诗、把新target的finder目錄下所有文件,拉到新target的工程目錄下瓢剿。Add to選中:新target
9逢慌、至此,新建target的前期工作就完成了跋选,剩下的改配置涕癣、修復(fù)報(bào)錯(cuò)和修復(fù)引用之類的了。
六前标、CocoaPods在多target中安裝相同pod的優(yōu)雅解決方案
如果工程中使用了CocoaPods坠韩,請(qǐng)參考這篇文章解決。
七炼列、修改新target的配置
1只搁、下圖的配置修改我就不詳細(xì)說(shuō)了,作為iOS開(kāi)發(fā)者應(yīng)該都懂俭尖。
2氢惋、然后就是設(shè)置編譯宏來(lái)區(qū)別代碼
分別在新舊兩個(gè)target的Build Settings中搜索Preprocessor Macros然后增加宏(這里用IsUserTarget=1)
然后在代碼中驗(yàn)證一下就知道了。
八稽犁、修復(fù)報(bào)錯(cuò)
首先焰望,切換target編譯一下,看一下報(bào)什么錯(cuò)(每個(gè)人的報(bào)錯(cuò)可以不一樣已亥,這里只解決我遇到的)
報(bào)錯(cuò)1:
The “Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported value for targets which use Swift. This setting can be set in the build settings editor.
解決1:
這里說(shuō)swift版本的問(wèn)題熊赖,在新target的Build Settings中搜索swift language,把版本改為你所需要的虑椎。
報(bào)錯(cuò)2:
No known class method for selector 'yy_modelWithJSON:
解決2:
沒(méi)有方法yy_modelWithJSON震鹉。因?yàn)閅YModel我是加到pch預(yù)編譯頭文件里面去了,所以這個(gè)報(bào)錯(cuò)就是pch沒(méi)有正確引用捆姜。
在新target的Build Settings中搜索prefix header传趾,然后添加一下路徑。
報(bào)錯(cuò)3:
NSTimer+Blocks.m:16:12: ARC forbids explicit message send of 'release'
解決3:
NSTimer+Blocks.m這個(gè)文件是使用MRC的泥技,所以要改為ARC浆兰。
在新target的Build Phases中搜索NSTimer+Blocks,然后改為ARC。