輕松玩轉(zhuǎn)自定義ios庫(kù)

1.庫(kù)的介紹碾牌。

  • 什么是庫(kù)?
    • 庫(kù)是程序代碼的集合,是共享程序代碼的一種方式
  • 根據(jù)源代碼的公開(kāi)情況秩仆,庫(kù)可以分為2種類(lèi)型
    • 開(kāi)源庫(kù)
      • 公開(kāi)源代碼瀑梗,能看到具體實(shí)現(xiàn)
      • 比如SDWebImage烹笔、AFNetworking
    • 閉源庫(kù)
      • 不公開(kāi)源代碼,是經(jīng)過(guò)編譯后的二進(jìn)制文件抛丽,看不到具體實(shí)現(xiàn)
      • 主要分為:靜態(tài)庫(kù)谤职、動(dòng)態(tài)庫(kù)
  • 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)
    • 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的存在形式
      • 靜態(tài)庫(kù):.a 和 .framework
      • 動(dòng)態(tài)庫(kù):.dylib 和 .framework
    • 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)在使用上的區(qū)別
      • 靜態(tài)庫(kù):鏈接時(shí),靜態(tài)庫(kù)會(huì)被完整地復(fù)制到可執(zhí)行文件中亿鲜,被多次使用就有多份冗余拷貝
      • 動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制允蜈,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用蒿柳,系統(tǒng)只加載一次饶套,多個(gè)程序共用,節(jié)省內(nèi)存
      • 需要注意的是: 項(xiàng)目中如果使用了自制的動(dòng)態(tài)庫(kù)其馏,不能被上傳到AppStore
  • 應(yīng)用場(chǎng)景
    • 靜態(tài)庫(kù)應(yīng)用場(chǎng)景(一)
      • 百度地圖想開(kāi)發(fā)者在應(yīng)用程序中集成百度地圖
      • 但是百度不想公布自己的技術(shù)實(shí)現(xiàn),如何完成呢?
      • 百度將自己的核心代碼編譯成靜態(tài)庫(kù)
      • 對(duì)外暴露統(tǒng)一的接口
      • 開(kāi)發(fā)者集成靜態(tài)庫(kù),并且調(diào)用靜態(tài)庫(kù)即可集成
    • 靜態(tài)庫(kù)應(yīng)用場(chǎng)景(二)
      • 公司項(xiàng)目開(kāi)發(fā)有一部分代碼為核心代碼
      • 如果任何人都可以拿到核心代碼,那么一旦有人離職,公司核心代碼就會(huì)一起被拿到.如何防止這種情況呢?
      • 公司抽出一部分核心團(tuán)隊(duì)成員,專(zhuān)門(mén)開(kāi)發(fā)這部分核心代碼
      • 開(kāi)發(fā)后,將核心代碼編譯成靜態(tài)庫(kù)給其他程序員調(diào)用
      • 核心成員很少會(huì)離職,非核心成員離職無(wú)法帶走核心代碼

2.制作庫(kù):

下面有請(qǐng)我們的攻城利器閃亮登場(chǎng)!1病叛复!


Snip20161120_13.png

你沒(méi)有看錯(cuò)在開(kāi)發(fā)ios庫(kù)時(shí),Xcode為我們提供了兩個(gè)開(kāi)發(fā)工具扔仓,左邊工具是生成后綴為.Framework的庫(kù)的褐奥,默認(rèn)生成的是動(dòng)態(tài)庫(kù),開(kāi)發(fā)語(yǔ)言是可選的(Swift或者OC)翘簇,撬码;右邊工具只能生成后綴為.a的靜態(tài)庫(kù),開(kāi)發(fā)語(yǔ)言不可選(只能是OC)
說(shuō)了辣么多版保,到底我們?cè)撨x哪個(gè)呢呜笑?
其實(shí)上文我已經(jīng)給出答案:"項(xiàng)目中如果使用了自制的動(dòng)態(tài)庫(kù)夫否,不能被上傳到AppStore",所以實(shí)際開(kāi)發(fā)中我們常用的是右邊的工具(Cocoa Touch Static Library)來(lái)自定義靜態(tài)庫(kù),當(dāng)然了這也并不絕對(duì)下文我會(huì)告訴你如何使用Cocoa Touch Framework 制作靜態(tài)庫(kù)順利上傳AppStore叫胁。

2.1如何自定義.a靜態(tài)庫(kù)

  • 創(chuàng)建項(xiàng)目時(shí),選擇Framework&Library-->Static Library
Paste_Image.png
  • 編寫(xiě)核心代碼(例子如下)
Paste_Image.png
  • 編譯靜態(tài)庫(kù)前,將頭文件暴露出去
Paste_Image.png
  • 選擇模擬器/真機(jī)分別編譯(原因如下)
    知識(shí)點(diǎn)補(bǔ)充:
  • 設(shè)備的CPU架構(gòu)
    • 不同的設(shè)備使用的CPU是不同的
    • CPU的不同造成使用的CPU架構(gòu)(指令集)不同
  • 靜態(tài)庫(kù)有其支持的CPU架構(gòu)
    • 如果靜態(tài)庫(kù)在不支持的CPU架構(gòu)上運(yùn)行就會(huì)報(bào)錯(cuò)
  • 模擬器使用的CPU架構(gòu)
    • iPhone4s-iPhone5 : i386
    • iPhone5s-iPhone6plus : x86_64
  • 真機(jī)使用的CPU架構(gòu)
    • iPhone3gs-iPhone4s : armv7
    • iPhone5-iPhone5c : armv7s
    • iPhone5s-iPhone6plus : arm64
    • 唯一特殊:只要支持armv7的靜態(tài)庫(kù)可以在armv7s上正常運(yùn)行
  • 綜上:
    暫且不考慮真機(jī)和模擬器共存凰慈,僅僅當(dāng)我們決定好在某一環(huán)境下使用時(shí),最好在這個(gè)環(huán)境下編譯一次處處運(yùn)行吧驼鹅!操作如下:
Paste_Image.png

注意:
觀察編譯前后:


Paste_Image.png
Paste_Image.png

讓我們進(jìn)入里面一探究竟微谓!

Paste_Image.png
Paste_Image.png

從里面內(nèi)容我們也可以發(fā)現(xiàn)我們編譯是在調(diào)試(Debug)模式下,并且是區(qū)分設(shè)備的输钩,此時(shí)顯示時(shí)的是Phone模擬器 => 驗(yàn)證了我們之前的說(shuō)法豺型,編譯創(chuàng)建的庫(kù)是分設(shè)備(架構(gòu))的。

之前我們考慮好了各個(gè)環(huán)境下都應(yīng)該是一次編譯處處運(yùn)行买乃,是時(shí)候該考慮模擬器和真機(jī)通用的時(shí)候了姻氨,模仿模擬器的編譯過(guò)程我們當(dāng)然首先也要編譯生成一個(gè)真機(jī)架構(gòu)下的庫(kù)

Paste_Image.png

再次進(jìn)入庫(kù)


Paste_Image.png

兩個(gè)庫(kù)!为牍!不可能一次拖兩個(gè)庫(kù)吧:甙蟆!讓我們來(lái)合并一下他們好了碉咆。
終端命令補(bǔ)充:

  • 查看靜態(tài)庫(kù)支持的架構(gòu)
    • lipo -info 靜態(tài)庫(kù)
  • 合并靜態(tài)庫(kù)
    • lipo -create 靜態(tài)庫(kù)1 靜態(tài)庫(kù)2 -output 合并的靜態(tài)庫(kù)

為了驗(yàn)證我們合并是否成功抖韩,我們先分別查看他們所支持的架構(gòu):
先看真機(jī)的:

Paste_Image.png

再看模擬器:

Paste_Image.png

接下來(lái)進(jìn)入最激動(dòng)人心的時(shí)刻:合并

Paste_Image.png

合并成不成功,驗(yàn)證一下就可以了

Paste_Image.png

恭喜你疫铜,還差最后一步??
生成了一個(gè)指定的合并庫(kù)茂浮,總不能就直接拖它進(jìn)入你的項(xiàng)目吧(庫(kù)是看不到源碼的,你知道怎么使用壳咕?席揽?這下你該知道頭文件暴露的好處了吧,暴露了你就應(yīng)該把它和你新生成的庫(kù)存放在同一個(gè)文件夾下呀N嚼濉;闲摺!)具體操作如下

Paste_Image.png

最后試試你的庫(kù)到底好不好使(測(cè)試下自己會(huì)不會(huì)用??)


Paste_Image.png

2.2如何自定義.Framewor靜態(tài)庫(kù)
聲明:默認(rèn)情況下利用Cocoa Touch Framework 制作的庫(kù)為動(dòng)態(tài)庫(kù)竟稳,動(dòng)態(tài)庫(kù)雖然能在模擬器下正常使用属桦,但是不能上傳AppStore,故我在這里不做深入介紹他爸。其制作過(guò)程幾乎與制作.a靜態(tài)庫(kù)一樣聂宾。

一.編譯.framework靜態(tài)庫(kù)

  • 創(chuàng)建項(xiàng)目時(shí),選擇Framework&Library-->Frameword
Paste_Image.png
  • 默認(rèn)創(chuàng)建的項(xiàng)目中有一個(gè)主頭文件,可以將其他頭文件在該頭文件中import一下
Paste_Image.png
  • 編寫(xiě)核心代碼
  • 編譯庫(kù)前,將頭文件都暴露出去
Paste_Image.png
  • 分別設(shè)置好模擬器和真機(jī)環(huán)境下都適配
Paste_Image.png
  • 將庫(kù)設(shè)置為編譯生成靜態(tài)庫(kù)!U矬浴系谐!
Paste_Image.png
  • 再進(jìn)入庫(kù)內(nèi)部文件,去合并兩個(gè)庫(kù)讨跟,具體操作和生成靜態(tài)庫(kù)一致纪他,這里就不在贅述鄙煤。

3實(shí)際開(kāi)發(fā)中如何自定義庫(kù)
1.直接新建一個(gè)庫(kù),寫(xiě)代碼 -> 編譯 -> 合并 -> 好了止喷?馆类?文件一多,你能確保百分百正確弹谁?故這種方式不可惹伞!预愤!
2.將兩個(gè)程序沟于,一個(gè)測(cè)試,一個(gè)寫(xiě)庫(kù)植康。旷太。∠觯可以供璧,只要你不嫌麻煩!冻记!
3主流:邊開(kāi)發(fā)邊調(diào)試靜態(tài)庫(kù)
操作如下:

Paste_Image.png

接下來(lái)操作與常規(guī)開(kāi)發(fā)一致睡毒,當(dāng)確保庫(kù)無(wú)誤之后,切換編譯Target冗栗,轉(zhuǎn)為庫(kù)演顾,再分別編譯 => 合并

注意:
1.如果制作的是動(dòng)態(tài)庫(kù)的話,一定要embeded binaries中將庫(kù)導(dǎo)入一下隅居,
2.如果編譯的靜態(tài)庫(kù)中有分類(lèi)的話必須在 Build Settings --> Other Linker Flags 中加 -Objc 如果還崩潰钠至,還得加上 -all_load

3.關(guān)于在靜態(tài)庫(kù)中添加資源,一般使用的是bundle文件夾胎源,如何創(chuàng)建呢棉钧?很簡(jiǎn)單先創(chuàng)建一個(gè)文件夾,然后將所需資源扔進(jìn)去涕蚤,最后將文件夾名稱(chēng)加上后綴bundle就ok了宪卿。***注意,默認(rèn)的靜態(tài)庫(kù)編輯是不會(huì)將bundle一起編譯進(jìn)去的赞季,所以這個(gè)文件夾需要我們手動(dòng)添加到使用靜態(tài)庫(kù)的工程中去愧捕。
4.如果在swift中使用OC動(dòng)態(tài)庫(kù)奢驯,可不用建立橋接文件
5.用swift建立動(dòng)態(tài)庫(kù):記得類(lèi)和方法需要public 或open 具體看需求

4.關(guān)于庫(kù)的那些坑申钩!
1添加自定義動(dòng)態(tài)庫(kù)位置得手動(dòng)添加!1窀蟆撒遣!


Paste_Image.png

修改如下:

Paste_Image.png

2.合并庫(kù)后的取名注意不要隨便取邮偎,盡量與原庫(kù)名一致,否則一致報(bào)錯(cuò)

Paste_Image.png

(對(duì)了义黎,如果你想提升用戶(hù)體驗(yàn)禾进,那么你真正用到項(xiàng)目中的編譯好的靜態(tài)庫(kù)其實(shí)只要支持真機(jī)的架構(gòu)就行,那樣app的占用空間會(huì)相對(duì)很小)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廉涕,一起剝皮案震驚了整個(gè)濱河市泻云,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狐蜕,老刑警劉巖宠纯,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異层释,居然都是意外死亡婆瓜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)贡羔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)廉白,“玉大人,你說(shuō)我怎么就攤上這事乖寒『秕澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵宵统,是天一觀的道長(zhǎng)晕讲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)马澈,這世上最難降的妖魔是什么瓢省? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮痊班,結(jié)果婚禮上勤婚,老公的妹妹穿的比我還像新娘。我一直安慰自己涤伐,他們只是感情好馒胆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著凝果,像睡著了一般祝迂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上器净,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天型雳,我揣著相機(jī)與錄音,去河邊找鬼。 笑死纠俭,一個(gè)胖子當(dāng)著我的面吹牛沿量,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冤荆,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼朴则,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了钓简?” 一聲冷哼從身側(cè)響起乌妒,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎外邓,沒(méi)想到半個(gè)月后芥被,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坐榆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年拴魄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片席镀。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匹中,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豪诲,到底是詐尸還是另有隱情顶捷,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布屎篱,位于F島的核電站服赎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏交播。R本人自食惡果不足惜重虑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秦士。 院中可真熱鬧缺厉,春花似錦、人聲如沸隧土。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)曹傀。三九已至辐脖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皆愉,已是汗流浹背嗜价。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工落萎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炭剪。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像翔脱,于是被迫代替她去往敵國(guó)和親奴拦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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