場(chǎng)景說明:
-之前做的App,使用Swift框架語言省艳,混合編程娘纷,內(nèi)含少部分OC代碼。
-需要App整體功能打包成靜態(tài)庫跋炕,完整移植到另一個(gè)App使用赖晶,該App使用OC。
-所以涉及到一個(gè)語言互轉(zhuǎn)的處理辐烂,以及一些AppDelegate的代碼減除變化遏插。
--------------------------------打包篇-------------------------------
實(shí)現(xiàn)步驟:
一、新建 Project - Framework&Library - Cocoa Touch Framework纠修,Next 語言選擇Swift
建立完成胳嘲,會(huì)看到默認(rèn)生成的一個(gè) ?xxx.h 和 ?Info.plist ?文件(只看紅框內(nèi))。
解釋一下這兩個(gè)文件:
1??xxx.h 文件的作用是整個(gè)包對(duì)外提供的入口頭文件分瘾,除了正常定義參數(shù)屬性之外胎围,還有
1、提供 Swift項(xiàng)目?jī)?nèi)引用的OC文件的import引用德召,注意白魂,這里引用之前必須在Build Phrases的Headers內(nèi)暴露到 Public,見步驟六
2上岗、提供 第三方文件的import引用福荸,這里的第三方管理,我們依然選擇使用Pods管理肴掷,下文會(huì)具體描述敬锐。
以上兩部完成后,舉例效果圖:
2??info.plist文件的作用就如同正常項(xiàng)目的plist文件作用呆瞻,用來定義或添加一些屬性台夺。
二、添加文件痴脾,這里可以自己新建颤介,或者從已有項(xiàng)目拷貝過來都可以。
這里要注意一下:由于打包類庫工程不是一個(gè)完整項(xiàng)目工程赞赖,所以并沒有AppDelegate等文件滚朵,所以涉及到這些的文件要額外處理,或改代碼前域,或適當(dāng)改變功能辕近。
注意:工程如果有橋接文件,是不能拷貝過來的匿垄,否則編譯不通過移宅。
原因見步驟五归粉。
三、如果有第三方類庫引用吞杭,添加第三方庫文件盏浇,有幾個(gè)注意點(diǎn):(沒有第三方可以跳過這步)
a、第三方庫依然使用Pods進(jìn)行管理芽狗,添加方法同正常項(xiàng)目一樣绢掰。
b、引用的時(shí)候童擎,我們需要添加 【use_frameworks!】來告訴pod 生成動(dòng)態(tài)庫文件Framework類型滴劲,這樣做的好處是在正式項(xiàng)目用到本類庫的時(shí)候,如果兩者第三方庫有引用沖突顾复,可以根據(jù)沖突類庫班挖,對(duì)本類庫引入的這些依賴庫進(jìn)行移除。
但有時(shí)第三方類庫只有 .a 類型的芯砸,怎么辦萧芙?
解決:如果第三方庫只有.a類型,就需要手動(dòng)把庫文件拷貝到項(xiàng)目假丧,而不能通過pod添加双揪,否則在往步驟1內(nèi)的頭文件添加import時(shí)會(huì)找不到文件,造成報(bào)錯(cuò)包帚。
四渔期、以上三部做完,本類庫的雛形基本已經(jīng)具備了渴邦,參考如下:
紅框1:自己的業(yè)務(wù)代碼
紅框2:類庫原有文件
紅框3:添加的資源文件
紅框4:引入的第三方疯趟,pod管理
PS:這里涉及到一個(gè)資源文件的問題,比如圖片谋梭、視頻信峻、音頻等的處理。
之前正常項(xiàng)目的做法可能是這樣瓮床,
1:直接用Assets.xcassets
2:新建resources文件夾站欺,存放圖片
但這里,需要注意一點(diǎn):
對(duì)于方法1纤垂,這樣做是無效的,我們可以新建一個(gè)bundle文件磷账,將圖片移植過來峭沦。
對(duì)于方法2,我們可以在本地逃糟,直接修改添加后綴.bundle實(shí)現(xiàn)
然后另一個(gè)重點(diǎn)就是路徑問題:
由于類庫的資源文件吼鱼,當(dāng)我們?cè)谡巾?xiàng)目使用時(shí)蓬豁,查找的路徑文件不是針對(duì)項(xiàng)目,而是針對(duì)類庫的路徑菇肃,所以我們這里引用的資源文件路徑都要改變一下地粪,而且類庫里的其他xib、storyboard文件引用路徑都需要更改一下琐谤。
修改辦法就是:在代碼的引用處添加前綴蟆技。
定義前綴:
如圖:
resourceRooturl是xib、storyboard文件前綴路徑斗忌。
resourceImagesRooturl是圖片文件前綴路徑质礼。(需要添加一層/images.bundle/)
這個(gè)路徑怎么來的呢?
Frameworks/XXXX.framework/ ? ? 其中XXXX就是你建立的類庫名稱织阳。
如何引用呢:在代碼引用的地方眶蕉,這樣改動(dòng)
注意:這里我說的只是針對(duì)Framework包里使用圖片的路徑需要修改。如果外部項(xiàng)目需要使用包內(nèi)的圖片資源唧躲,暫未測(cè)試造挽,理論上不需要修改。
五弄痹、文件都基本添加完畢饭入,可以嘗試build一下了
理論上:
只要類庫xxx.h文件內(nèi),對(duì)于使用的oc頭文件和第三方頭文件界酒,都添加正常引用申明了圣拄,就不會(huì)有問題。
而且一般報(bào)錯(cuò)毁欣,也都是因?yàn)檫@里沒做好或遺漏的緣故庇谆。
此外:如果項(xiàng)目都是純swift文件(沒有混編使用oc文件),這里xxx.h文件只需要導(dǎo)入第三方頭文件即可(如果有使用第三方凭疮,沒有的話基本什么都不用做)饭耳。
=======================這里解釋一下,xxx.h文件為什么要這樣做:=================
因?yàn)檎G闆r下执解,如果我們swift項(xiàng)目引入了oc文件寞肖,我們必須通過一個(gè)橋接文件來處理兩者之間的轉(zhuǎn)換,而我們?cè)谛陆悗彀臅r(shí)候衰腌,是禁止橋接文件存在的新蟆,即使你添加了,也會(huì)永遠(yuǎn)編譯不過右蕊,打包不了琼稻。
所以這里就用到這個(gè) xxx.h 頭文件了。
我們可以通過這個(gè)文件來實(shí)現(xiàn)兩者之間的轉(zhuǎn)換饶囚,前提就是必須先將oc的.h暴露出來帕翻,否則即使你import鸠补,也會(huì)報(bào)錯(cuò)找不到.h 文件。
(這里有個(gè)問題嘀掸,如果oc文件過多紫岩,這里需要暴露的就很多,而這里太多的話睬塌,一個(gè)是不美觀铣焊,第二是后面項(xiàng)目引用本類庫都是能看到這些文件的扎阶。所以敲长,能不能通過一個(gè)文件凰锡,來裝載這些所有文件,達(dá)到只需要一個(gè)文件暴露就行的效果文狱,如果有人實(shí)現(xiàn)了粥鞋,歡迎指導(dǎo)一下,不甚感激瞄崇。)
六呻粹、暴露文件給外部使用
到這里基本就快完成了,那么我們打包的目的就是給外部使用苏研,怎么暴露文件出來呢等浊?
1、將我們要暴露的swift文件拖到Public內(nèi)即可摹蘑。
2筹燕、將需要暴露的swift文件的訪問權(quán)限申明為public屬性。
兩步缺一不可衅鹿。
七撒踪、編譯通過,查看這里
紅框內(nèi)就是最終我們得到的Framework包大渤。
右擊本地查看制妄,會(huì)看到本類庫以及對(duì)應(yīng)的依賴第三方庫包,后面在其他項(xiàng)目引用的時(shí)候泵三,這些都是需要的(需要一起拷貝添加)耕捞。
PS:如果沒有引用第三方,這里只需要本類庫包即可烫幕。
------------------------------引用篇------------------------------
1俺抽、我們新建一個(gè)空的工程,由于我的業(yè)務(wù)需要较曼,這里工程語言選擇OC凌埂。
2、新建Framework文件夾,拷貝之前所有的framework包到文件夾內(nèi)瞳抓。
3、在工程Targets-General-EmbeddedBinaries內(nèi)添加Frameworks包
4伏恐、由于我的類庫包是基于swift建立的孩哑,這里oc使用的話,必須設(shè)置一個(gè)屬性:
5翠桦、由于我們自己的工程都有自己的第三方庫引用横蜒,這里如果發(fā)現(xiàn)兩者之間有沖突或重復(fù)引用,解決如下:
a:如果pod引用內(nèi)销凑,沒有標(biāo)注use_frameworks! ? ?我們先加上這句話丛晌,并pod update,目地是保持兩邊引用的第三方類庫都是Framework類型斗幼。
b:移除剛才添加過來中的重復(fù)類庫澎蛛,比如AFN
6、添加完蜕窿,我們就可以在新項(xiàng)目使用類庫集成的功能了
這邊引用的時(shí)候有點(diǎn)特殊:
我們只需要把一個(gè)文件import即可谋逻,而不需要把每一個(gè)需要使用的swift文件import。
舉例如圖:
這個(gè)文件是系統(tǒng)幫我們自動(dòng)生成的一個(gè)轉(zhuǎn)換文件桐经,我們要暴露的文件毁兆,系統(tǒng)都已經(jīng)幫我們自動(dòng)轉(zhuǎn)換后儲(chǔ)存在這個(gè)文件內(nèi),很強(qiáng)大阴挣,有么有F椤!畔咧!
比如:我的登錄頁面 ?login.swift文件暴露給外部茎芭,需要提供入口,我們使用的時(shí)候盒卸,是不需要import login.swift的骗爆,即使你想import,也會(huì)發(fā)現(xiàn)找不到!蔽介!
如果你點(diǎn)進(jìn)去紅框文件摘投,會(huì)發(fā)現(xiàn)類似這樣的內(nèi)容:
所以我們使用的時(shí)候,頭部只需要import一個(gè)文件虹蓄,下面使用的時(shí)候犀呼,該使用哪個(gè)類就使用哪個(gè)類。
前提就是:在打包的時(shí)候薇组,你已經(jīng)把這個(gè)文件 添加到Public里了外臂,并且申明了public屬性,否則是找不到該文件的律胀。
最后宋光,把我過程中遇到的一些問題紀(jì)錄一下
引用集成時(shí)遇到的坑:
==================================報(bào)錯(cuò)1:==================================
dyld: Library not loaded: @rpath/AFNetworking.framework/AFNetworking
這里是因?yàn)橹灰昧酥暗念悗毂旧砻部螅瑳]有將類庫自身的依賴庫一并引用過來,
解決辦法:
方法1:
方法2:
按照我的引用篇-步驟3去做罪佳,在general處逛漫,全部添加,就不會(huì)報(bào)這個(gè)問題赘艳。
==================================報(bào)錯(cuò)2:==================================
dyld: Library not loaded: @rpath/libswiftCore.dylib
解決辦法:
按照我的引用篇-步驟4去做?酌毡,設(shè)置屬性為Yes。
Xcode8升級(jí)之后屬性名稱有所變化:
==================================報(bào)錯(cuò)3:==================================
Unknown class in Interface Builder file .... image not ?found 等
解決辦法:
==================================報(bào)錯(cuò)4:==================================
load ?storyboard 或xib ?崩潰
解決辦法:
是因?yàn)榇虬牡胤揭梦募窂經(jīng)]有改動(dòng)蕾管,需要加上類庫前綴路徑枷踏,詳見打包篇-步驟四。
-----------------------打包合并真機(jī)和模擬器------------------------
詳細(xì)內(nèi)容有點(diǎn)多: