iOS 完整項(xiàng)目制作Framework

場(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)多:

參考我這篇博文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掰曾,一起剝皮案震驚了整個(gè)濱河市旭蠕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婴梧,老刑警劉巖下梢,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塞蹭,居然都是意外死亡孽江,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門番电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岗屏,“玉大人,你說我怎么就攤上這事漱办≌馑ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵娩井,是天一觀的道長(zhǎng)暇屋。 經(jīng)常有香客問我,道長(zhǎng)洞辣,這世上最難降的妖魔是什么咐刨? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮扬霜,結(jié)果婚禮上定鸟,老公的妹妹穿的比我還像新娘。我一直安慰自己著瓶,他們只是感情好联予,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般沸久。 火紅的嫁衣襯著肌膚如雪季眷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天卷胯,我揣著相機(jī)與錄音瘟裸,去河邊找鬼。 笑死诵竭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兼搏。 我是一名探鬼主播卵慰,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼佛呻!你這毒婦竟也來了裳朋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤吓著,失蹤者是張志新(化名)和其女友劉穎鲤嫡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绑莺,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暖眼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纺裁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诫肠。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖欺缘,靈堂內(nèi)的尸體忽然破棺而出栋豫,到底是詐尸還是另有隱情,我是刑警寧澤谚殊,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布丧鸯,位于F島的核電站,受9級(jí)特大地震影響嫩絮,放射性物質(zhì)發(fā)生泄漏丛肢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一絮记、第九天 我趴在偏房一處隱蔽的房頂上張望摔踱。 院中可真熱鬧,春花似錦怨愤、人聲如沸派敷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篮愉。三九已至腐芍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間试躏,已是汗流浹背猪勇。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颠蕴,地道東北人泣刹。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像犀被,于是被迫代替她去往敵國(guó)和親椅您。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容