iOS SDK開發(fā)中伴隨的Bundle包

講到了SDK開發(fā),這篇來講講iOS中伴隨SDK開發(fā)的Bundle包巩趁。

Bundle是什么塑顺?你可以理解為iOS中一種特殊的目錄,它可以包含各種資源文件挨稿,如:圖片、音頻京痢、視頻奶甘、xib文件、storyboard文件等祭椰。

為什么會有bundle包臭家?
App工程中引入bundle包主要由兩大來源:

  1. 提供庫文件的開發(fā)者,同時提供了bundle包方淤。
  2. App開發(fā)者自己為了集中管理資源而打的bundle包

第二種比較好理解钉赁,我們不討論。這里主要討論第一種情況下這么做的本質(zhì)原因携茂。

提供庫的開發(fā)者你踩,如果他們在庫中有使用到某些資源(聲音、視頻讳苦、圖片或圖標(biāo)等)带膜,那么他們提供庫的同時,也是需要提供這些資源文件的鸳谜。這樣他們的庫才能被我們正常使用膝藕。

下面是重點(diǎn):

  • 通常而言,只有打包為靜態(tài)庫的咐扭,如果有需要才應(yīng)該打包一個配套的bundle文件芭挽。動態(tài)庫的資源文件應(yīng)該內(nèi)置到.framework文件內(nèi)部的滑废。因?yàn)?framework自身也是一個bundle,可以包含資源文件览绿。

下面詳細(xì)分析下:
首先說明工程設(shè)置:
SDKDemo:制作SDK庫的工程
SDKApp:應(yīng)用SDK庫的App工程

1. 靜態(tài)庫 VS 動態(tài)庫:
編譯App工程時策严,靜態(tài)庫會被編譯進(jìn)App可執(zhí)行文件中,成為可執(zhí)行文件的一部分饿敲。而動態(tài)庫僅會在App可執(zhí)行文件中通過rpath記錄動態(tài)庫的鏈接加載路徑妻导,在App啟動運(yùn)行時,動態(tài)加載器dyld會根據(jù)rpath的值去正確的加載動態(tài)庫怀各,其本身是不會被整合進(jìn)App可執(zhí)行文件中的倔韭。

2. SDKDemo工程(僅是添加了三張圖片):

image.png

先將SDKDemo打包為靜態(tài)庫:
配置生成靜態(tài)庫

終端下通過file命令驗(yàn)證是靜態(tài)庫還是動態(tài)庫:
SDKDemo是靜態(tài)庫

生成的framework文件里的內(nèi)容:
圖片資源在.framework文件里

3. 將SDKDemo.framework導(dǎo)入SDKApp工程中,編譯SDKApp工程瓢对。在生成的SDKApp.app上右鍵顯示包內(nèi)容:

SDKApp.app包中的內(nèi)容

從中我們沒有看到SDKDemo.framework中的圖片資源文件寿酌。要知道iOS App運(yùn)行時所需的資源文件都是從.app文件中獲取的。既然圖片資源不在該目錄下硕蛹,自然代碼中是引用不到的醇疼。所以為了解決這個問題,我們才需要單獨(dú)打包一個bundle文件法焰,將所有的圖片等資源文件放入其中秧荆,然后把這個bundle文件導(dǎo)入App工程中,這樣編譯后的.app文件將會包含這個bundle文件埃仪。這樣只要代碼中引用對了這個bundle乙濒,圖片將會正確被加載顯示...

4. 再來看看將SDKDemo打包為動態(tài)庫:

配置生成動態(tài)庫

SDKDemo是動態(tài)庫
生成的.framework文件同樣包含了導(dǎo)入的圖片資源

和靜態(tài)framework文件不同的是,動態(tài)的framework文件是獨(dú)立存在的卵蛉,其在App運(yùn)行時颁股,是作為一個整體鏈接進(jìn)App的可執(zhí)行文件中的。并且Framework文件本身也是一個Bundle傻丝,通過如下接口可獲取特定的bundle:

  • (NSBundle *)bundleForClass:(Class)aClass;

aClass: .framework中任何一個聲明類的類對象
返回值:返回參數(shù)aClass對應(yīng)類聲明所在的.framework(是個bundle對象)

所以在代碼中甘有,可直接通過+ (NSBundle *)bundleForClass:(Class)aClass;獲取到目標(biāo)framework,然后通過bundle對象的- (nullable NSString *)pathForResource:(nullable NSString *)name ofType:(nullable NSString *)ext; 等接口方法獲取framework下面的各種資源文件

此乃動態(tài)framework文件不需要單獨(dú)bundle包的原因桑滩。根據(jù)模塊化梧疲、高內(nèi)聚、低耦合等等這些設(shè)計要求运准,我們也應(yīng)該盡量避免讓一個模塊中的東西分成兩個模塊來發(fā)布,此所謂越簡單越好缭受。

5. 總結(jié)
靜態(tài)庫和動態(tài)庫對資源文件處理方式的不同胁澳,本質(zhì)上是因?yàn)橐粋€App運(yùn)行時只能在自己的沙盒空間內(nèi)加載引用可以找到的資源,對于找不到的資源就會出現(xiàn)加載不了的情況米者。通過上面的實(shí)踐可以知道韭畸,靜態(tài)framework中的圖片在打包App時是不會將它的圖片資源文件包含進(jìn)來的宇智。而動態(tài)庫最終會在.app文件內(nèi)創(chuàng)建一個Frameworks目錄,里面是所有App引入的動態(tài)庫胰丁,只要定位到某個動態(tài)framework随橘,自然就可以找到它下面的圖片等資源文件了...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锦庸,隨后出現(xiàn)的幾起案子机蔗,更是在濱河造成了極大的恐慌,老刑警劉巖甘萧,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝嘁,死亡現(xiàn)場離奇詭異,居然都是意外死亡扬卷,警方通過查閱死者的電腦和手機(jī)牙言,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怪得,“玉大人咱枉,你說我怎么就攤上這事⊥搅担” “怎么了蚕断?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長因谎。 經(jīng)常有香客問我基括,道長,這世上最難降的妖魔是什么财岔? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任风皿,我火速辦了婚禮,結(jié)果婚禮上匠璧,老公的妹妹穿的比我還像新娘桐款。我一直安慰自己,他們只是感情好夷恍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布魔眨。 她就那樣靜靜地躺著,像睡著了一般酿雪。 火紅的嫁衣襯著肌膚如雪遏暴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天指黎,我揣著相機(jī)與錄音朋凉,去河邊找鬼。 笑死醋安,一個胖子當(dāng)著我的面吹牛杂彭,可吹牛的內(nèi)容都是我干的墓毒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亲怠,長吁一口氣:“原來是場噩夢啊……” “哼所计!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起团秽,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤主胧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后徙垫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讥裤,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年姻报,在試婚紗的時候發(fā)現(xiàn)自己被綠了己英。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吴旋,死狀恐怖损肛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荣瑟,我是刑警寧澤治拿,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站笆焰,受9級特大地震影響劫谅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嚷掠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一捏检、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧不皆,春花似錦贯城、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至犬耻,卻和暖如春踩晶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枕磁。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工合瓢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人透典。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓晴楔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親峭咒。 傳聞我的和親對象是個殘疾皇子税弃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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

  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動態(tài)庫有什么異同?靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中凑队,被多次使用就有多份冗...
    190CM閱讀 4,210評論 0 4
  • 前言 1.靜態(tài)庫和動態(tài)庫有什么異同则果? 靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝漩氨。利用靜態(tài)...
    Ly夢k閱讀 8,580評論 3 18
  • 這幾天公司有一個新的需求西壮,就是要將我們開發(fā)的某些東西都抽取出來,打個比方我們開發(fā)了A項(xiàng)目叫惊,可以以后B項(xiàng)目要包含A項(xiàng)...
    黃魚兒啦啦啦閱讀 6,166評論 2 16
  • 原文鏈接在上一篇教程(中譯版)中款青,你學(xué)到了怎么樣創(chuàng)建一個可復(fù)用的圓形旋鈕控件。然而你可能不清楚怎樣讓其他開發(fā)者更方...
    _冷憶閱讀 2,448評論 9 5
  • 最新 iOS SDK(二):Bundle 以下內(nèi)容可忽略霍狰。 參考 Bundle Programming Guide...
    上發(fā)條的樹閱讀 31,404評論 5 90