上一篇寫了一下常規(guī)的組件化方式,但是我發(fā)現(xiàn)那一種形式在面對(duì)OC,swift混編的私有庫(kù)時(shí)問(wèn)題多多,我接觸swift的時(shí)間不算很長(zhǎng),在swift的項(xiàng)目中如果使用OC的代碼,需要在一個(gè)叫做Bridging-Header的文件中聲明OC的頭文件,但是如果建立私有庫(kù)就不能使用這種文件,雖然網(wǎng)上很多文章給出了解決辦法,但還是有很多預(yù)想不到的問(wèn)題出現(xiàn),后來(lái)試了一下使用靜態(tài)庫(kù)的形式來(lái)進(jìn)行組件化部署,之前遇到的奇奇怪怪的問(wèn)題都不見(jiàn)了,所以在這里推薦大家使用靜態(tài)庫(kù)的形式來(lái)進(jìn)行組件化開發(fā),而且據(jù)我所了解,現(xiàn)在很多大廠都在使用動(dòng)態(tài)庫(kù)或靜態(tài)庫(kù)的形式來(lái)進(jìn)行組件化開發(fā),這個(gè)還是看不同公司的業(yè)務(wù)需要吧。
好了下面我們就開始靜態(tài)庫(kù)的組件化部署吧,我還是用在騰訊開放平臺(tái)的私有庫(kù)來(lái)進(jìn)行演示,開始還是一樣的步驟,建立一個(gè)新的項(xiàng)目。

靜態(tài)庫(kù)項(xiàng)目
通過(guò)項(xiàng)目地址clone到本地的空文件夾

clone至本地
接下來(lái)的操作就稍稍的不太一樣了,使用終端CD到剛剛建立的文件夾下面,輸入如下代碼pod lib create ZRTestFramework,名字就是你私有庫(kù)的名稱,以后pod的時(shí)候也會(huì)用的名字,根據(jù)終端提示一步步根據(jù)你的需求輸入。

根據(jù)問(wèn)題輸入你想要的方式
成功之后Xcode會(huì)自動(dòng)打開,文件目錄結(jié)構(gòu)如下圖,一般我們會(huì)將封裝好的代碼放在classes中,而我們的項(xiàng)目配套Demo在Example文件夾下。


我們先來(lái)編寫podspec文件,打開Example中的workspace,podspec在如下圖的位置,我們對(duì)其進(jìn)行編寫,特別說(shuō)明一下,一定要指定swift版本,我是這個(gè)東西的資深受害者,再次奉勸大家一定要寫上。

編寫podspec文件
然后我們CD到Example文件夾路徑下執(zhí)行pod install來(lái)對(duì)我們的Demo工程進(jìn)行配置,這一步的目的是,假如我們將要加入私有庫(kù)的代碼有些用到了三方庫(kù),我們先pod下來(lái),以防到時(shí)候加進(jìn)來(lái)找不到三方庫(kù)然后報(bào)錯(cuò)。

現(xiàn)在我們將想封裝的代碼加入到Classes文件夾,然后加入到工程中,注意加入的位置是在pod中

添加封裝好的代碼
這時(shí)我們就要說(shuō)到最一開始說(shuō)到的問(wèn)題了,swift項(xiàng)目如果想使用OC的類,要使用橋接文件,但是在私有庫(kù)中我們不會(huì)去建立這個(gè)橋接文件也就是Bridging-Header,在私有庫(kù)中是使用一個(gè)結(jié)尾名字為umbrella的文件來(lái)實(shí)現(xiàn)混編的,這個(gè)文件不用我們?nèi)?chuàng)建,也不用我們?nèi)ゾ帉?/h6>
私有庫(kù)中的橋接文件
既不用自己生成,也不用自己去編寫,那么要怎么用呢,我們需要把OC類的頭文件暴露出來(lái),設(shè)置為public
20190515101048.jpg
然后我們編譯一下這個(gè)framework,然后再次CD到Example中,執(zhí)行pod install,成功之后重新打開workspace,我們?cè)賮?lái)看看這個(gè)umbrella文件
自動(dòng)生成import代碼
已經(jīng)自動(dòng)的#import了兩個(gè)public頭文件,這時(shí)在swift中就可以使用這兩個(gè)OC的類了,這時(shí)我們需要找到編譯成功生成的framework,并且把它的位置做個(gè)小小的調(diào)整,將它移動(dòng)到與podspec文件相同的目錄下面。
這時(shí)我們需要再次修改一下podspec,添加這一句代碼s.ios.vendored_frameworks = 'ZRTestFramework.framework'指定項(xiàng)目所依賴的framework,也就是我們自己生成的framework,這樣在別的項(xiàng)目中pod時(shí),才會(huì)將我們的生成的framework導(dǎo)入。
然后我們?cè)俅蝐d到Example中執(zhí)行pod install,然后重新打開workspace,你會(huì)發(fā)現(xiàn)目錄中多了一個(gè)文件夾,沒(méi)錯(cuò),這個(gè)就是我們的framework
接下來(lái)我們就用sourcetree或者終端將我們的代碼push到遠(yuǎn)端,push成功之后的操作,就和上一篇的操作一摸一樣啦,打tag,本地校驗(yàn),遠(yuǎn)程校驗(yàn),push podspec文件。
校驗(yàn)成功
我們隨便找一個(gè)項(xiàng)目來(lái)pod一下剛剛弄好的靜態(tài)私有庫(kù),記得先pod repo update!
我們就可以直接在項(xiàng)目中來(lái)直接使用這個(gè)framework了,如果我們的framework中使用了xib文件,那我們就要換個(gè)方式在項(xiàng)目中使用,之前很多人都會(huì)使用配套的bundle,但是我在網(wǎng)上查資料發(fā)現(xiàn)了更好的辦法
_collectionView.register(UINib.init(nibName: "DeviceControllCell", bundle: Bundle.init(for: self.classForCoder)), forCellWithReuseIdentifier: "DeviceControllCell")
直接在bundle的位置填上Bundle.init(for: self.classForCoder)即可,當(dāng)然如果是圖片的話,大家把圖片的xcassets文件添加到Assets文件夾下,然后我們?cè)賹⑦@個(gè)文件夾拖出來(lái)到podspec相同目錄下(純屬個(gè)人習(xí)慣),然后更改podspec文件。
然后我們?cè)賑d到Example中進(jìn)行pod install,當(dāng)然,圖片的顯示方式也是要更改一下,這些圖片就已經(jīng)在項(xiàng)目中可以顯示了。
cell.swithBtn.setImage(UIImage.init(named: "unselected", in: Bundle.init(for: self.classForCoder), compatibleWith: nil), for: .normal)
其實(shí)是和獲取xib是一樣的,至此framework的組件化形式就是這樣,對(duì)了,還忘說(shuō)了一點(diǎn),提到了很多次Example這個(gè)文件,這里面放著的是我們私有庫(kù)配套的Demo工程,大家可以在demo中引用我們封裝好的私有庫(kù)代碼來(lái)查看效果。以后發(fā)現(xiàn)新問(wèn)題我會(huì)及時(shí)更新,有不懂的同學(xué)請(qǐng)及時(shí)評(píng)論我,或者我說(shuō)的哪里不對(duì)也請(qǐng)各位來(lái)及時(shí)糾正我,以免我誤導(dǎo)了大家??

私有庫(kù)中的橋接文件
OC類的頭文件暴露出來(lái),設(shè)置為public

20190515101048.jpg
framework,然后再次CD到Example中,執(zhí)行pod install,成功之后重新打開workspace,我們?cè)賮?lái)看看這個(gè)umbrella文件
自動(dòng)生成import代碼
#import了兩個(gè)public頭文件,這時(shí)在swift中就可以使用這兩個(gè)OC的類了,這時(shí)我們需要找到編譯成功生成的framework,并且把它的位置做個(gè)小小的調(diào)整,將它移動(dòng)到與podspec文件相同的目錄下面。

podspec,添加這一句代碼s.ios.vendored_frameworks = 'ZRTestFramework.framework'指定項(xiàng)目所依賴的framework,也就是我們自己生成的framework,這樣在別的項(xiàng)目中pod時(shí),才會(huì)將我們的生成的framework導(dǎo)入。
Example中執(zhí)行pod install,然后重新打開workspace,你會(huì)發(fā)現(xiàn)目錄中多了一個(gè)文件夾,沒(méi)錯(cuò),這個(gè)就是我們的framework

push到遠(yuǎn)端,push成功之后的操作,就和上一篇的操作一摸一樣啦,打tag,本地校驗(yàn),遠(yuǎn)程校驗(yàn),push podspec文件。
校驗(yàn)成功
pod一下剛剛弄好的靜態(tài)私有庫(kù),記得先pod repo update!
framework了,如果我們的framework中使用了xib文件,那我們就要換個(gè)方式在項(xiàng)目中使用,之前很多人都會(huì)使用配套的bundle,但是我在網(wǎng)上查資料發(fā)現(xiàn)了更好的辦法 _collectionView.register(UINib.init(nibName: "DeviceControllCell", bundle: Bundle.init(for: self.classForCoder)), forCellWithReuseIdentifier: "DeviceControllCell")
bundle的位置填上Bundle.init(for: self.classForCoder)即可,當(dāng)然如果是圖片的話,大家把圖片的xcassets文件添加到Assets文件夾下,然后我們?cè)賹⑦@個(gè)文件夾拖出來(lái)到podspec相同目錄下(純屬個(gè)人習(xí)慣),然后更改podspec文件。

Example中進(jìn)行pod install,當(dāng)然,圖片的顯示方式也是要更改一下,這些圖片就已經(jīng)在項(xiàng)目中可以顯示了。cell.swithBtn.setImage(UIImage.init(named: "unselected", in: Bundle.init(for: self.classForCoder), compatibleWith: nil), for: .normal)
xib是一樣的,至此framework的組件化形式就是這樣,對(duì)了,還忘說(shuō)了一點(diǎn),提到了很多次Example這個(gè)文件,這里面放著的是我們私有庫(kù)配套的Demo工程,大家可以在demo中引用我們封裝好的私有庫(kù)代碼來(lái)查看效果。以后發(fā)現(xiàn)新問(wèn)題我會(huì)及時(shí)更新,有不懂的同學(xué)請(qǐng)及時(shí)評(píng)論我,或者我說(shuō)的哪里不對(duì)也請(qǐng)各位來(lái)及時(shí)糾正我,以免我誤導(dǎo)了大家??