一、背景介紹,為什么要新建target?
公司的一個新需求,需要在原有的企業(yè)版app基礎(chǔ)上,新做一個用戶版的app。由于兩個app大部分內(nèi)容很相似,而且有一個共用的業(yè)務(wù)模塊。
大概情況如上,而痛點如下:
- 雖然大部分內(nèi)容一開始相同,但后面分歧會越來越大,畢竟是兩個app,各有各的業(yè)務(wù),所以這大部分相同的代碼,將會被
拷貝成兩份代碼。 - 共用一個業(yè)務(wù)模塊。在第1個痛點的時候,我們已經(jīng)把不共用的代碼拷貝成兩份了,如果共用模塊也拷貝兩份代碼的話,那以后共用模塊出現(xiàn)修改的話,就需要在
共用模塊的兩份代碼都修改一遍,容易出錯。 - 共用模塊也會出現(xiàn)小部分的兩個app
不同的業(yè)務(wù)處理。
針對以上三個痛點,新建一個target正好可以解決這幾個問題。
二、如何新建target?
新建target有兩個方法。
方法一:復(fù)制target
在已有的target上,已有target-->右鍵-->Duplicaate-->Duplicaate Only。

復(fù)制成功后,工程目錄下會出現(xiàn)copy-Info.plist文件。
方法二:新建target
通過菜單-->Editor-->Add Target--> Application --> Singe View Application --> Product Name

新建成功后,工程目錄會出現(xiàn)新target目錄,里面會包含以下文件

方法一、二的不同點:
方法一中,新target保留了被拷貝的target全部配置和文件引用,只需稍作修改就能生成一個新的app(比如修改包名、圖標(biāo)和啟動圖之類的)。
方法二中,新target將不保留被拷貝的target全部配置和文件引用,相當(dāng)于一個全新的app(Singe View Application)。
三、不同的target作用
每個Target都包含了Copy Bundle Resources, Compile Sources, Link Binary With Libraries、info.plist等,對不同的app進行管理。

其作用如下:
-
Copy Bundle Resources是指生成app后里面所包含的資源文件,比如圖片。 -
Compile Sources是指哪些源代碼會被該target引用編譯。 -
Link Binary With Libraries是指引用哪些庫文件。 -
info.plist,這個應(yīng)該都是知道是比較重要的,比如包名、版本號和權(quán)限之類的。
四、選擇方案
為了解決上面的第1個痛點,我選擇方法二來新建target。因為方法一會引用原有的大部分源代碼,不符合我需要拷貝兩份代碼的需求。
好了,方案確定了,就準(zhǔn)備大干一場了,因為方法二會相對復(fù)雜很多,也會報很多的錯誤,接下來一一解決。
五、開始新建target工作
1、使用方法二新建target
2、新建一個共用模塊文件夾

3、把需要共用模塊的代碼(看你的需要),拷貝到CommonModule的finder目錄下。

4、在工程中目錄中,徹底刪除原target中共用模塊代碼。(Move to Trash)
5、再把這些共用模塊代碼拉到CommonModule工程目錄下,Add to選中: 原target+新target

PS:(2、3、4、5概括來說就是:共用模塊獨立出來,并被新舊兩個target所引用)
6、在工程中目錄中,徹底刪除新target里的所有東西
首先,徹底刪除掉這幾個文件:


如果新target的finder目錄下還有一些空文件夾,也全部刪除。
7、把原target的finder目錄下所有文件,拷貝到新target的finder目錄下。
8、把新target的finder目錄下所有文件,拉到新target的工程目錄下。Add to選中:新target

9、至此,新建target的前期工作就完成了,剩下的改配置、修復(fù)報錯和修復(fù)引用之類的了。
六、CocoaPods在多target中安裝相同pod的優(yōu)雅解決方案
如果工程中使用了CocoaPods,請參考這篇文章解決。
七、修改新target的配置
1、下圖的配置修改我就不詳細(xì)說了,作為iOS開發(fā)者應(yīng)該都懂。

2、然后就是設(shè)置編譯宏來區(qū)別代碼
分別在新舊兩個target的Build Settings中搜索Preprocessor Macros然后增加宏(這里用IsUserTarget=1)

然后在代碼中驗證一下就知道了。

八、修復(fù)報錯
首先,切換target編譯一下,看一下報什么錯(每個人的報錯可以不一樣,這里只解決我遇到的)

報錯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:
這里說swift版本的問題,在新target的Build Settings中搜索swift language,把版本改為你所需要的。

報錯2:
No known class method for selector 'yy_modelWithJSON:
解決2:
沒有方法yy_modelWithJSON。因為YYModel我是加到pch預(yù)編譯頭文件里面去了,所以這個報錯就是pch沒有正確引用。
在新target的Build Settings中搜索prefix header,然后添加一下路徑。

報錯3:
NSTimer+Blocks.m:16:12: ARC forbids explicit message send of 'release'
解決3:
NSTimer+Blocks.m這個文件是使用MRC的,所以要改為ARC。
在新target的Build Phases中搜索NSTimer+Blocks,然后改為ARC。
