framework及其制作

原創(chuàng)精選來(lái)自我的博客文章

目錄


<a id="framework了解"></a>framework了解

一、什么是庫(kù)?

庫(kù)是共享程序代碼的方式掏熬,一般分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兆龙。

二要糊、靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別

靜態(tài)庫(kù):鏈接時(shí)完整地拷貝至可執(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)存脐嫂。

三统刮、iOS里靜態(tài)庫(kù)形式

.a.framework

四、iOS里動(dòng)態(tài)庫(kù)形式

.dylib.framework

五账千、framework為什么既是靜態(tài)庫(kù)又是動(dòng)態(tài)庫(kù)侥蒙?

系統(tǒng)的.framework是動(dòng)態(tài)庫(kù),我們自己創(chuàng)建的.framework是靜態(tài)庫(kù)匀奏。

六鞭衩、.a 和 .framework 有什么區(qū)別

.a 是一個(gè)純二進(jìn)制文件,.framework中除了有二進(jìn)制文件之外還有資源文件娃善。

.a 文件不能直接使用论衍,至少要有 .h 文件配合,.framework 文件可以直接使用聚磺。

.a + .h + sourceFile = .framework

七坯台、為什么要使用靜態(tài)庫(kù)?

方便共享代碼咧最,便于合理使用捂人。

實(shí)現(xiàn)iOS程序的模塊化御雕,可以把固定業(yè)務(wù)模塊化成靜態(tài)庫(kù)矢沿。

和別人分享你的代碼庫(kù),但是不想讓別人看到你的代碼實(shí)現(xiàn)酸纲。

開(kāi)發(fā)第三方sdk的需求捣鲸。


<a id="制作 framework"></a>制作 framework

Xcode版本: 8.3.2 (8E2002)

<a id="Xcode 中創(chuàng)建一個(gè)空的 framework"></a>1、Xcode 中創(chuàng)建一個(gè)空的 framework

Xcode: File -> New -> Project -> Framework & Library -> Cocoa Touch Framework

create_empty_framework.png

<a id="更改參數(shù)"></a>2闽坡、更改參數(shù)

2.1栽惶、TARGET -> Build Settings -> Architectures

fk_architecture.png

2.2、TARGET -> Build Settings -> Linking 下更改幾個(gè)參數(shù)

fk_Linking.png

2.3疾嗅、對(duì)于使用category時(shí)外厂,必須配置 Other Linker Flags-ObjC

<a id="創(chuàng)建自己功能類(lèi)代碼"></a>3、創(chuàng)建自己功能類(lèi)代碼

fk_demo_style.png

<a id="設(shè)置 Headers 和 Resources"></a>4代承、設(shè)置 Headers 和 Resources

TARGETS -> Build Phases -> Headers 中添加頭文件汁蝶,Public 中添加公開(kāi)的頭文件

TARGETS -> Build Phases -> Copu Bundle Resources 中添加framework中使用的bundle資源文件

fk_headers_resources.png

<a id="編譯與合并"></a>編譯與合并

合并則分為兩種,一個(gè)手動(dòng)论悴,一個(gè)腳本

如果打包出去只需要真機(jī)或者模擬器中的一種掖棉,那么我們只需編譯就可以得到,合并是為了同時(shí)滿(mǎn)足模擬器和真機(jī)進(jìn)行的操作膀估。

1幔亥、在模擬器 和 真機(jī) 環(huán)境下分別編譯我們的 framework

隨便選擇一個(gè)simulatorGeneric Device(代表真機(jī)) 分別編譯 command + B

2、選中我們的 framework察纯,右鍵在Finder中顯示帕棉,并找到對(duì)應(yīng)環(huán)境 .framework文件夾下的文件

Debug-iphoneos 代表debug狀態(tài)下真機(jī)編譯結(jié)果

Debug-iphonesimulator 代表debug狀態(tài)下模擬器編譯結(jié)果

在真實(shí)上架項(xiàng)目中针肥,我們就是需要編譯release版本

fk_ShowInFinder.png
fk_finder_debug.png

3、將模擬器和真機(jī)編譯得到的文件進(jìn)行合并香伴,生成一個(gè)真機(jī)模擬器同時(shí)兼容的文件

3.1祖驱、手動(dòng)合并

  • 終端輸入命令語(yǔ)句

    合并的文件路徑:在某個(gè)地方創(chuàng)建一個(gè)文件,命名和我們編譯得到文件的名字一致瞒窒,然后拖拉文件到終端即可得到路徑
    在終端中使用命令時(shí)捺僻,這些路徑都只要直接托拉過(guò)來(lái)
    
    $ lipo -create 真機(jī)文件路徑 模擬器文件路徑 -output 合并得到的文件路徑
    
  • 合并得到文件 替換 真機(jī)編譯得到的.framework文件下的文件(或者用模擬器編譯得到的也一樣),即可得到最終模擬器和真機(jī)都可使用的 framework

fk_hebing.png

3.2崇裁、腳本合并

  • Xcode: File -> New -> Target 在當(dāng)前庫(kù)路徑下創(chuàng)建腳本所需的文件匕坯,任意命名即可
fk_new_Aggregate.png
  • 添加運(yùn)行的腳本
fk_new_runscript.png
fk_script_contents.png
  • 具體腳本內(nèi)容

    # Sets the target folders and the final framework product.
    # 如果工程名稱(chēng)和Framework的Target名稱(chēng)不一樣的話(huà),要自定義FMKNAME
    # 例如: FMK_NAME = "MyFramework"
    FMK_NAME=${PROJECT_NAME}
    # Install dir will be the final output to the framework.
    # The following line create it in the root folder of the current project.
    INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
    # Working dir will be deleted after the framework creation.
    WRK_DIR=build
    DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
    SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
    # -configuration ${CONFIGURATION}
    # Clean and Building both architectures.
    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
    # Cleaning the oldest.
    if [ -d "${INSTALL_DIR}" ]
    then
    rm -rf "${INSTALL_DIR}"
    fi
    mkdir -p "${INSTALL_DIR}"
    cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
    cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"
    # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
    lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
    rm -r "${WRK_DIR}"
    open "${INSTALL_DIR}"
    
  • 編譯腳本拔稳,同前面編譯framework一樣葛峻,編譯完成會(huì)自動(dòng)彈出真機(jī)和模擬器都可使用的framework

fk_run_script.png

<a id="在其他地方使用我們的 framework"></a>在其他地方使用我們的 framework

1、將符合要求的 framework 拖拉到其他項(xiàng)目中巴比,如果有 bundle 資源文件术奖,那么也必須單獨(dú)拖拉一份到項(xiàng)目中去

fk_use.png

2、檢查是否添加完全

fk_check.png

<a id="注意事項(xiàng)"></a>注意事項(xiàng)

1轻绞、當(dāng)framework不是同時(shí)支持模擬器和真機(jī)的時(shí)候采记,運(yùn)行項(xiàng)目則會(huì)出現(xiàn)以下的問(wèn)題

fk_error.png

<a id="Reference"></a>Reference


原創(chuàng)文章來(lái)自 我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奸远,隨后出現(xiàn)的幾起案子既棺,更是在濱河造成了極大的恐慌,老刑警劉巖懒叛,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丸冕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡薛窥,警方通過(guò)查閱死者的電腦和手機(jī)胖烛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拆檬,“玉大人洪己,你說(shuō)我怎么就攤上這事【构幔” “怎么了答捕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)屑那。 經(jīng)常有香客問(wèn)我拱镐,道長(zhǎng)艘款,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任沃琅,我火速辦了婚禮哗咆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘益眉。我一直安慰自己晌柬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布郭脂。 她就那樣靜靜地躺著年碘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪展鸡。 梳的紋絲不亂的頭發(fā)上屿衅,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音莹弊,去河邊找鬼涤久。 笑死,一個(gè)胖子當(dāng)著我的面吹牛忍弛,可吹牛的內(nèi)容都是我干的响迂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剧罩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼栓拜!你這毒婦竟也來(lái)了座泳?” 一聲冷哼從身側(cè)響起惠昔,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挑势,沒(méi)想到半個(gè)月后镇防,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潮饱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年来氧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片香拉。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啦扬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凫碌,到底是詐尸還是另有隱情扑毡,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布盛险,位于F島的核電站瞄摊,受9級(jí)特大地震影響勋又,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜换帜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一楔壤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惯驼,春花似錦蹲嚣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至疲眷,卻和暖如春禾蚕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狂丝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工换淆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人几颜。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓倍试,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛋哭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子县习,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/04a7e28f11b9作者:紀(jì)小衰 frame...
    紀(jì)小衰閱讀 6,512評(píng)論 3 16
  • (原文:How to Create a Framework for iOS 作者:Sam Davies 譯者:Mr...
    王憲嶺閱讀 4,883評(píng)論 2 23
  • 如果你想將你開(kāi)發(fā)的控件與別人分享,一種方法是直接提供源代碼文件谆趾。然而躁愿,這種方法并不是很優(yōu)雅。它會(huì)暴露所有的實(shí)現(xiàn)細(xì)節(jié)...
    小熱狗閱讀 3,468評(píng)論 3 9
  • 前言 如果你想將你開(kāi)發(fā)的控件與別人分享沪蓬,一種方法是直接提供源代碼文件彤钟。然而,這種方法并不是很優(yōu)雅跷叉。它會(huì)暴露所有的實(shí)...
    大沖哥閱讀 1,391評(píng)論 0 4
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理逸雹,服務(wù)發(fā)現(xiàn),斷路器云挟,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139