簡(jiǎn)述iOS開發(fā)framework制作與使用

前言

  • 我的第一次洛搀,請(qǐng)多多指教!目的是給予有需要的朋友以及方便自己日后的查閱睛竣。

iOS開發(fā)庫(kù)文件的分類

靜態(tài)庫(kù):

    1. 靜態(tài)庫(kù)有 .a 和 .framework 兩種形式;
    1. 在程序編譯時(shí)會(huì)被鏈接到目標(biāo)代碼中滨嘱,程序運(yùn)行時(shí)將不再需要改靜態(tài)庫(kù)。

動(dòng)態(tài)庫(kù):

    1. .dylib 和 .framework 形式浸间,后來.dylib動(dòng)態(tài)庫(kù)又被蘋果替換成.tbd的形式;
    1. 在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)代碼中太雨,只是在程序運(yùn)行時(shí)才被載入,因?yàn)樵诔绦蜻\(yùn)行期間還需要?jiǎng)討B(tài)庫(kù)的存在魁蒜。

結(jié)論

  • 同一個(gè)靜態(tài)庫(kù)在不同程序中使用時(shí)囊扳,每一個(gè)程序中都得導(dǎo)入一次,打包時(shí)也被打包進(jìn)去兜看,形成一個(gè)程序锥咸;
  • 而動(dòng)態(tài)庫(kù)在不同程序中,打包時(shí)并沒有被打包進(jìn)去细移,只在程序運(yùn)行使用時(shí)搏予,才鏈接載入(如系統(tǒng)的框架如 UIKit、Foundation 等)弧轧,所以程序體積會(huì)小很多雪侥,但是蘋果不讓使用自己的動(dòng)態(tài)庫(kù),否則審核就無法通過(為什么不讓使用本人不是很清楚精绎,還請(qǐng)大神普及)速缨。

framework 制作過程

1. 首先新建一個(gè)項(xiàng)目,選擇 Cocoa touch Framework :

新建CocoaTouchFramework

2. 然后隨便取一個(gè)名字 MyFramework_Create:

取名MyFramework_Create

3. 然后根據(jù)不能的業(yè)務(wù)需求寫好自己的代碼代乃,這里因?yàn)槭菧y(cè)試旬牲,我隨便寫點(diǎn),新建一個(gè) Dog 類,然后公開一個(gè)方法并隨便 log 一點(diǎn)東西:

新建Dog類

4. 工程配置:

  • 4.1 選擇工程文件 > target 第一項(xiàng) > Build Setting > 搜索 linking搁吓,然后幾個(gè)需要設(shè)置的選項(xiàng)都顯現(xiàn)出來原茅,首先是 Dead Code Stripping 設(shè)置為 NO,網(wǎng)上對(duì)此項(xiàng)的解釋如下擎浴,意思是如果開啟此項(xiàng)就會(huì)對(duì)代碼中的 " dead ”员咽、" unreachable ” 的代碼過濾,不過這個(gè)開關(guān)是否關(guān)閉贮预,似乎沒有多大影響,不過為了完整還原 framework 中的代碼契讲,將此項(xiàng)關(guān)閉也未曾不可仿吞。

    • The resulting executable will not include any “dead” or unreachable code.
  • 4.2 然后將Link With Standard Libraries關(guān)閉,我想可能是為了避免重復(fù)鏈接:

  • 4.3 最后將 Mach-O Type 設(shè)為 Static Library捡偏,framework 可以是動(dòng)態(tài)庫(kù)也可以是靜態(tài)庫(kù)唤冈,對(duì)于系統(tǒng)的framework 是動(dòng)態(tài)庫(kù),而用戶制作的 framework 只能是靜態(tài)庫(kù).


    工程配置

5. 頭文件的設(shè)置:將需要公開的頭文件從 Project 中拖入 Public银伟,至于是否需要將私有的頭文件拖入Private你虹,我覺得直接放在 Project 中即可绘搞,若是 Private 中有頭文件,打包以后的 framework 中會(huì)多出一個(gè)Private 的文件夾包含著放入 Private 的頭文件傅物,不過我覺得如果是私有最好還是不要讓別人看到夯辖。以下有三種設(shè)置方法,設(shè)置前需要在 .h 文件導(dǎo)入:

頭文件的設(shè)置
  • 5.1 在 target 下找到 Build Phases, 點(diǎn)開 Headers 看到 Project 下面的文件直接右鍵就可以看到一些選項(xiàng),選擇你所需 Public 的即可董饰。


    頭文件的設(shè)置1
  • 5.2 在上面的 Headers 界面的時(shí)候直接將 Project 下面的文件拖到 Public 下面即可蒿褂。


    頭文件的設(shè)置2
  • 5.3 選中 Dog.h 文件,在 Xcode 右邊找到 Target Memership 右下角的(注意不是 Xcode 整個(gè)界面右下角)上下箭頭卒暂,那里就有你想要的:


    頭文件的設(shè)置3

6. iPhone 5 和 iPhone 5c 特殊機(jī)型架構(gòu)的支持配置

  • 選中 Build Settings > Architectures > 單擊該選項(xiàng)的右邊 > other > armv7s ,即可


    特殊機(jī)型架構(gòu)的支持配置1

    特殊機(jī)型架構(gòu)的支持配置2

7. 編譯生成 .framework 文件

  • 7.1 先選擇Generic iOS Device啄栓,按下 Command+B:Build 一下:
真機(jī)編譯.png
  • 7.2 然后隨意選擇一個(gè)模擬器再次 Build 一下:
模擬器編譯.png

8. 合并真機(jī)與模擬器生成 .framework 文件:

  • 8.1 Show in Finder 找到 Build 后的 framework
Show in Finder.png
  • 8.2 我們看到總共有兩個(gè)文件夾,上面是真機(jī)編譯生成的文件也祠,下面是模擬器編譯生成的文件昙楚。
真機(jī)與模擬器的framework.png
  • 8.3 我們?cè)?Products 同級(jí)目錄下(路徑可以任意選)新建一個(gè) 名為 MyFramework_Create 的文件夾作為輸出路徑,這里取名要與項(xiàng)目名一致诈嘿,至于為什么到后面自己會(huì)明白的堪旧。
新建MyFramework_Create的文件夾作.png
  • 8.4 使用命令行合并:lipo -create + 上面兩個(gè)文件的路徑(是指真機(jī)與模擬器MyFramework_Create.framework 目錄下的 MyFramework_Create文件) + -output + 合成后文件的輸出路徑。 最后回車即可永淌。


    命令行合并
  • 8.5 將生成的 MyFramework_Test.lipo 文件刪除后綴名并代替真機(jī)下的 MyFramework_Test 文件就完成了崎场。


    代替MyFramework_Create

framework的測(cè)試

1. 新建名為 MyFramework_Test 的工程,注意選擇的是 Single View Application :

![](file:////Users/dinpay/Desktop/MyFramework_Create/新建SingleViewApplication.png)
![](file:////Users/dinpay/Desktop/MyFramework_Create/新建MyFramework_Test.png)

新建MyFramework_Test.png

新建SingleViewApplication

2. 將所需要的頭文件導(dǎo)入工程遂蛀,新建一個(gè) dog 對(duì)象谭跨,并調(diào)用 doSmothing 方法,查看控制臺(tái)的輸出李滴,現(xiàn)在已經(jīng)成功導(dǎo)入測(cè)試完成:

運(yùn)行結(jié)果

經(jīng)典報(bào)錯(cuò)

1. 缺少相關(guān)頭文件的路徑螃宙,在有些博客上看到說在測(cè)試之前就要導(dǎo)入 framework 的 Headers 的路徑,發(fā)現(xiàn)這不完全正確所坯,在我的經(jīng)驗(yàn)中如果 framework 中引入了第三方不導(dǎo)入會(huì)報(bào)錯(cuò)谆扎,沒有引用的就沒有報(bào)錯(cuò),所以個(gè)人認(rèn)為還是看情況芹助,如果運(yùn)行起來報(bào)錯(cuò)說找不到頭文件的話堂湖,那再做相關(guān)配置也無妨,配置方法如下:

![](file:////Users/dinpay/Desktop/MyFramework_Create/頭文件配置.png)

頭文件配置.png

2. 缺少相關(guān)設(shè)備架構(gòu)状土,報(bào)錯(cuò)如下:

缺少相關(guān)設(shè)備架構(gòu)
  • 2.1 庫(kù)中缺少了i386架構(gòu)的文件无蜂,這時(shí)我就比較困惑了件相,明明將模擬器生成的庫(kù)文件合并進(jìn)來了瓢宦,怎么在模擬器上編不通呢!用 lipo -info 命令查看一下参萄,果然沒有i386架構(gòu)的文件
    ![](file:////Users/dinpay/Desktop/MyFramework_Create/架構(gòu)前.png)
架構(gòu)前.png
  • 2.2 重新選擇 iPhone 5 模擬器與 iPhone 7 模擬器兩者運(yùn)行生成的 .framework 文件合并后與真機(jī)生成的 .framework 文件再次合并查看信息累驮,果然有了


    架構(gòu)后
  • 2.3 架構(gòu)總結(jié):

    • 對(duì)于模擬器來說 4s 和5的模架構(gòu)是 i386 的32位架構(gòu)酣倾,5s 至今是 x86_64 的64位架構(gòu)舵揭。對(duì)于真機(jī)來說 3GS~4s 是 armv7 架構(gòu),5 和 5c 是 armv7s 架構(gòu)躁锡,5s 至今是 arm64 架構(gòu)午绳。

3. 將下圖中的選項(xiàng)設(shè)為 YES,導(dǎo)致其編譯時(shí)只生成當(dāng)前機(jī)器的框架稚铣,將其設(shè)置為 NO 后箱叁,發(fā)現(xiàn)用模擬器編譯后生成的 framework 同時(shí)包含 x86_64 和 i386 架構(gòu)。

4. 在項(xiàng)目中引入靜態(tài)庫(kù)后惕医,archive 的時(shí)候會(huì)出現(xiàn)錯(cuò)誤

  • 解決辦法:



    MacDown logo
  • Bitcode 是蘋果在 Xcode7 及以后推出的新功能耕漱。用于代碼的二次編譯,針對(duì) CPU 進(jìn)行優(yōu)化抬伺,編譯工作由蘋果 AppStore 后臺(tái)來完成螟够。針對(duì) iOS 是可選項(xiàng),默認(rèn)打開峡钓。watchOS 和 tvOS 是必選項(xiàng)妓笙,所以需要打開庫(kù)工程的此選項(xiàng)并加上 -fembed-bitcode 參數(shù),重新編譯能岩。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寞宫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拉鹃,更是在濱河造成了極大的恐慌辈赋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膏燕,死亡現(xiàn)場(chǎng)離奇詭異钥屈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坝辫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門篷就,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人近忙,你說我怎么就攤上這事竭业。” “怎么了及舍?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵永品,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我击纬,道長(zhǎng),這世上最難降的妖魔是什么钾麸? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任更振,我火速辦了婚禮炕桨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肯腕。我一直安慰自己献宫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布实撒。 她就那樣靜靜地躺著姊途,像睡著了一般。 火紅的嫁衣襯著肌膚如雪知态。 梳的紋絲不亂的頭發(fā)上捷兰,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音负敏,去河邊找鬼贡茅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛其做,可吹牛的內(nèi)容都是我干的顶考。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼妖泄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼驹沿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹈胡,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤渊季,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后审残,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梭域,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年搅轿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了病涨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡璧坟,死狀恐怖既穆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雀鹃,我是刑警寧澤幻工,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站黎茎,受9級(jí)特大地震影響囊颅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一踢代、第九天 我趴在偏房一處隱蔽的房頂上張望盲憎。 院中可真熱鬧,春花似錦胳挎、人聲如沸饼疙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窑眯。三九已至,卻和暖如春医窿,著一層夾襖步出監(jiān)牢的瞬間磅甩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工留搔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留更胖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓隔显,卻偏偏與公主長(zhǎng)得像却妨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子括眠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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