場景說明:
-之前做的App挽荡,使用Swift框架語言藐石,混合編程,內(nèi)含少部分OC代碼定拟。
-需要App整體功能打包成靜態(tài)庫于微,完整移植到另一個App使用,該App使用OC青自。
-所以涉及到一個語言互轉(zhuǎn)的處理株依,以及一些AppDelegate的代碼減除變化。
--------------------------------打包篇-------------------------------****
實現(xiàn)步驟:
一恋腕、新建 Project - Framework&Library - Cocoa Touch Framework荠藤,Next 語言選擇Swift
建立完成获高,會看到默認生成的一個 xxx.h 和 Info.plist 文件(只看紅框內(nèi))。
解釋一下這兩個文件:
1??xxx.h 文件的作用是整個包對外提供的入口頭文件念秧,除了正常定義參數(shù)屬性之外,還有
1缎除、提供 Swift項目內(nèi)引用的OC文件的import引用,注意渐行,這里引用之前必須在Build Phrases的Headers內(nèi)暴露到 Public祟印,見步驟六
2蕴忆、提供 第三方文件的import引用套鹅,這里的第三方管理卓鹿,我們依然選擇使用Pods管理吟孙,下文會具體描述杰妓。
以上兩部完成后,舉例效果圖:
2??info.plist ****文件的作用就如同正常項目的plist文件作用,用來定義或添加一些屬性凿宾。
二初厚、添加文件排作,這里可以自己新建妄痪,或者從已有項目拷貝過來都可以。
這里要注意一下:由于打包類庫工程不是一個完整項目工程罪针,所以并沒有AppDelegate等文件,所以涉及到這些的文件要額外處理墓阀,或改代碼岂津,或適當改變功能。
注意:工程如果有橋接文件粱甫,是不能拷貝過來的,否則編譯不通過乌庶。
原因見步驟五瞒大。
三、如果有第三方類庫引用酗电,添加第三方庫文件背率,有幾個注意點:(沒有第三方可以跳過這步)
a退渗、第三方庫依然使用Pods進行管理个粱,添加方法同正常項目一樣稻薇。
b塞椎、引用的時候,我們需要添加 【use_frameworks!】來告訴pod 生成動態(tài)庫文件Framework類型骂铁,這樣做的好處是在正式項目用到本類庫的時候,如果兩者第三方庫有引用沖突钞支,可以根據(jù)沖突類庫,對本類庫引入的這些依賴庫進行移除信夫。
但有時第三方類庫只有 .a 類型的警没,怎么辦?
解決:如果第三方庫只有.a類型树酪,就需要手動把庫文件拷貝到項目,而不能通過pod添加疮茄,否則在往步驟1內(nèi)的頭文件添加import時會找不到文件,造成報錯畸裳。
四、以上三部做完蓬抄,本類庫的雛形基本已經(jīng)具備了,參考如下:
紅框1:自己的業(yè)務(wù)代碼
紅框2:類庫原有文件
紅框3:添加的資源文件
紅框4:引入的第三方,pod管理
PS:這里涉及到一個資源文件的問題,比如圖片百侧、視頻辫狼、音頻等的處理膨处。
之前正常項目的做法可能是這樣,
1:直接用Assets.xcassets
2:新建resources文件夾突硝,存放圖片
但這里,需要注意一點:
對于方法1查库,這樣做是無效的樊销,我們可以新建一個bundle文件裤园,將圖片移植過來。
對于方法2淤袜,我們可以在本地,直接修改添加后綴.bundle實現(xiàn)
然后另一個重點就是路徑問題:
由于類庫的資源文件尽爆,當我們在正式項目使用時漱贱,查找的路徑文件不是針對項目,而是針對類庫的路徑,所以我們這里引用的資源文件路徑都要改變一下,而且類庫里的其他xib泵肄、storyboard文件引用路徑都需要更改一下。
修改辦法就是:在代碼的引用處添加前綴冯丙。
定義前綴:
如圖:
resourceRooturl是xib哪雕、storyboard文件前綴路徑利虫。
resourceImagesRooturl是圖片文件前綴路徑。(需要添加一層/images.bundle/)
這個路徑怎么來的呢寞钥?
Frameworks/XXXX.framework/ 其中XXXX就是你建立的類庫名稱蹄溉。
如何引用呢:在代碼引用的地方,這樣改動
注意:這里我說的只是針對Framework包里使用圖片的路徑需要修改冀膝。如果外部項目需要使用包內(nèi)的圖片資源麻掸,暫未測試,理論上不需要修改诚隙。
五、文件都基本添加完畢烈评,可以嘗試build一下了
理論上:
只要類庫xxx.h文件內(nèi)瓜客,對于使用的oc頭文件和第三方頭文件谱仪,都添加正常引用申明了疯攒,就不會有問題。
而且一般報錯署恍,也都是因為這里沒做好或遺漏的緣故。
此外:如果項目都是純swift文件(沒有混編使用oc文件),這里xxx.h文件只需要導(dǎo)入第三方頭文件即可(如果有使用第三方朵逝,沒有的話基本什么都不用做)。
=======================這里解釋一下,xxx.h文件為什么要這樣做:=================
因為正常情況下芋膘,如果我們swift項目引入了oc文件,我們必須通過一個橋接文件來處理兩者之間的轉(zhuǎn)換,而我們在新建類庫包的時候,是禁止橋接文件存在的鸯匹,即使你添加了,也會永遠編譯不過根蟹,打包不了。
所以這里就用到這個 xxx.h 頭文件了。
我們可以通過這個文件來實現(xiàn)兩者之間的轉(zhuǎn)換悲龟,前提就是必須先將oc的.h暴露出來,否則即使你import,也會報錯找不到.h 文件贬养。
(這里有個問題迷殿,如果oc文件過多蜘犁,這里需要暴露的就很多,而這里太多的話止邮,一個是不美觀,第二是后面項目引用本類庫都是能看到這些文件的奏窑。所以导披,能不能通過一個文件埃唯,來裝載這些所有文件撩匕,達到只需要一個文件暴露就行的效果,如果有人實現(xiàn)了墨叛,歡迎指導(dǎo)一下止毕,不甚感激模蜡。)
六、暴露文件給外部使用
到這里基本就快完成了扁凛,那么我們打包的目的就是給外部使用忍疾,怎么暴露文件出來呢?
1谨朝、將我們要暴露的swift文件拖到Public內(nèi)即可卤妒。
2、將需要暴露的swift文件的訪問權(quán)限申明為public屬性字币。
兩步缺一不可则披。
七、編譯通過洗出,查看這里
紅框內(nèi)就是最終我們得到的Framework包士复。
右擊本地查看,會看到本類庫以及對應(yīng)的依賴第三方庫包翩活,后面在其他項目引用的時候阱洪,這些都是需要的(需要一起拷貝添加)。
PS:如果沒有引用第三方隅茎,這里只需要本類庫包即可澄峰。
** ------------------------------引用篇------------------------------**
1、我們新建一個空的工程辟犀,由于我的業(yè)務(wù)需要俏竞,這里工程語言選擇OC。
2堂竟、新建Framework文件夾魂毁,拷貝之前所有的framework包到文件夾內(nèi)。
3出嘹、在工程Targets-General-EmbeddedBinaries內(nèi)添加Frameworks包
4席楚、由于我的類庫包是基于swift建立的,這里oc使用的話税稼,必須設(shè)置一個屬性:
5烦秩、由于我們自己的工程都有自己的第三方庫引用,這里如果發(fā)現(xiàn)兩者之間有沖突或重復(fù)引用郎仆,解決如下:
a:如果pod引用內(nèi)只祠,沒有標注 use_frameworks! 我們先加上這句話,并pod update扰肌,目地是保持兩邊引用的第三方類庫都是Framework類型抛寝。
b:移除剛才添加過來中的重復(fù)類庫,比如AFN
6、添加完盗舰,我們就可以在新項目使用類庫集成的功能了
這邊引用的時候有點特殊:
我們只需要把一個文件import即可晶府,而不需要把每一個需要使用的swift文件import。
舉例如圖:
這個文件是系統(tǒng)幫我們自動生成的一個轉(zhuǎn)換文件钻趋,我們要暴露的文件川陆,系統(tǒng)都已經(jīng)幫我們自動轉(zhuǎn)換后儲存在這個文件內(nèi),很強大爷绘,有么有J槿啊!土至!
比如:我的登錄頁面 login.swift文件暴露給外部购对,需要提供入口,我們使用的時候陶因,是不需要import login.swift的镀钓,即使你想import,也會發(fā)現(xiàn)找不到1凇钾恢!
如果你點進去紅框文件廷粒,會發(fā)現(xiàn)類似這樣的內(nèi)容:
所以我們使用的時候,頭部只需要import一個文件烘苹,下面使用的時候躲株,該使用哪個類就使用哪個類。
前提就是:在打包的時候镣衡,你已經(jīng)把這個文件 添加到Public里了霜定,并且申明了public屬性,否則是找不到該文件的廊鸥。
最后望浩,把我過程中遇到的一些問題紀錄一下
引用集成時遇到的坑:
==================================報錯1:==================================
dyld: Library not loaded: @rpath/AFNetworking.framework/AFNetworking
這里是因為只引用了之前的類庫本身,沒有將類庫自身的依賴庫一并引用過來惰说,
解決辦法:
方法1:
方法2:
按照我的引用篇-步驟3去做磨德,在general處,全部添加吆视,就不會報這個問題典挑。
==================================報錯2:==================================
dyld: Library not loaded: @rpath/libswiftCore.dylib
解決辦法:
按照我的引用篇-步驟4去做 ,設(shè)置屬性為Yes啦吧。
Xcode8升級之后屬性名稱有所變化:
==================================報錯3:==================================
Unknown class in Interface Builder file .... image not found 等
解決辦法:
==================================報錯4:==================================
load storyboard 或xib 崩潰
解決辦法:
是因為打包的地方引用文件路徑?jīng)]有改動搔弄,需要加上類庫前綴路徑,詳見打包篇-步驟四丰滑。
** -----------------------打包合并真機和模擬器------------------------**
詳細內(nèi)容有點多:
若還有其他問題歡迎留言。
enjoy~~
原文:https://www.cnblogs.com/yajunLi/p/5987687.html
作者:那一抹風(fēng)情