iOS新建target,使兩個不同項目共用某一模塊

一、背景介紹,為什么要新建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ù)制target方法

復(fù)制成功后,工程目錄下會出現(xiàn)copy-Info.plist文件。

方法二:新建target

通過菜單-->Editor-->Add Target--> Application --> Singe View Application --> Product Name

新建target方法

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

新出現(xiàn)的文件

方法一、二的不同點:

方法一中,新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進行管理。

不同target的資源文件

其作用如下:

  • 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、新建一個共用模塊文件夾

468468465.png

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

498446486.png

4、在工程中目錄中,徹底刪除原target中共用模塊代碼。(Move to Trash)

5、再把這些共用模塊代碼拉到CommonModule工程目錄下,Add to選中: 原target+新target

BEE2D83C-4AA6-4EC8-88F6-19B40CFF8855.png

PS:(2、3、4、5概括來說就是:共用模塊獨立出來,并被新舊兩個target所引用)

6、在工程中目錄中,徹底刪除新target里的所有東西

首先,徹底刪除掉這幾個文件:

刪除的文件
徹底刪除

如果新target的finder目錄下還有一些空文件夾,也全部刪除。

7、把原target的finder目錄下所有文件,拷貝到新target的finder目錄下。

8、把新target的finder目錄下所有文件,拉到新target的工程目錄下。Add to選中:新target

1449846515616.png

9、至此,新建target的前期工作就完成了,剩下的改配置、修復(fù)報錯和修復(fù)引用之類的了。

六、CocoaPods在多target中安裝相同pod的優(yōu)雅解決方案

如果工程中使用了CocoaPods,請參考這篇文章解決。

七、修改新target的配置

1、下圖的配置修改我就不詳細(xì)說了,作為iOS開發(fā)者應(yīng)該都懂。

1351151561.png

2、然后就是設(shè)置編譯宏來區(qū)別代碼

分別在新舊兩個target的Build Settings中搜索Preprocessor Macros然后增加宏(這里用IsUserTarget=1)

468486446136.png

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

884616846.png

八、修復(fù)報錯

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

263161516.png

報錯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,把版本改為你所需要的。

1651646416.png

報錯2:

No known class method for selector 'yy_modelWithJSON:

解決2:

沒有方法yy_modelWithJSON。因為YYModel我是加到pch預(yù)編譯頭文件里面去了,所以這個報錯就是pch沒有正確引用。

在新target的Build Settings中搜索prefix header,然后添加一下路徑。

48484156165.png

報錯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。

1568161651.png

原文鏈接:http://www.itdecent.cn/p/365e211b6ed0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,626評論 30 472
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,122評論 25 708
  • 需求:當(dāng)兩個甚至兩個以上的app存在小差異時,可以在一個工程(project)創(chuàng)建多個target每個target...
    寸光片靜閱讀 30,702評論 21 70
  • $ sudo apt-get install screenfetch$ screenfetch 系統(tǒng)信息 順便提一...
    好棒啊閱讀 4,856評論 1 7
  • 第一次見到麻子,是在一場群架現(xiàn)場,他以一敵五,最后以麻子的勝利結(jié)束。 那場架打得那么理所當(dāng)然,酒后鬧事。 麻子愛喝...
    陵山閱讀 3,955評論 4 11

友情鏈接更多精彩內(nèi)容