【iOS 開(kāi)發(fā)】將自己的框架打包成 Framework 的方法

Framework

最近需要將公司項(xiàng)目中的公共代碼給提取出來(lái)金踪,打包成 Framework 來(lái)使用,這樣可以使得我們的公共代碼易于分享牵敷,并且可以在多個(gè)工程中易于復(fù)用热康,而且將這些代碼給別人使用時(shí),可以隱藏實(shí)現(xiàn)細(xì)節(jié)劣领,控制公開(kāi)的頭文件,下面分享一下打包成 Framework 的步驟铁材。

如果你要打包的代碼需要用到別的第三方庫(kù)的話尖淘,可以轉(zhuǎn)到我的另一篇文章:【iOS 開(kāi)發(fā)】打包 Framework 時(shí)使用 CocoaPods 引入第三方庫(kù)的方法


創(chuàng)建 Framework 工程

1. 創(chuàng)建打包工程

  • 打開(kāi) Xcode 新建一個(gè)工程,選擇 Framework & Libray 選項(xiàng)中的 Cocoa Touch Framework 著觉,這里說(shuō)一下我的 Xcode 版本是 8.3.2 村生。
創(chuàng)建工程
  • 因?yàn)橐虬璧奈募赃@里我自己創(chuàng)建了一個(gè)測(cè)試類饼丘,在實(shí)際的打包過(guò)程中趁桃,直接把需要打包的所有文件拖到該工程中即可。
測(cè)試類

2. 添加公開(kāi)頭文件

  • 選中 Target 肄鸽,選擇 Build Phases - Headers 卫病,可以看出有三個(gè)選項(xiàng),分別是 Public 典徘、Private 蟀苛、Project ,把需要公開(kāi)給別人的 .h 文件拖到 Public 中逮诲,把不想公開(kāi)的帜平,即為隱藏的 .h 文件拖到 Project 中幽告。
Headers
  • 完成上述步驟之后,在默認(rèn)生成的 .h 文件中裆甩,我的是 TestFramework.h 冗锁,把所有需要暴露的 .h 文件都用 #import <TestFramework/PublicHeader.h>引入,記住一定要將所有需要暴露的 .h 文件都引入嗤栓,也就是上面 Headers - Public 中加的所有 .h 文件冻河,不然編譯后生成的 .framework 在引用的時(shí)候會(huì)有警告。
引入頭文件

3. 更改設(shè)置參數(shù)

  • 選中 Target 抛腕,選擇 Build Settings 芋绸,在 Architectures 下增加 armv7s
更改設(shè)置參數(shù)
  • 選中 Target 担敌,選擇 Build Settings 摔敛,在搜索欄搜索 Mach-O Type ,將 Mach-O Type 修改為 Static Library全封。
更改設(shè)置參數(shù)

工程打包成 Framework

1. 創(chuàng)建 Aggregate

  • 新建一個(gè) Target 马昙,選擇 Cross-platform - Aggregate ,名字隨便起一個(gè)刹悴。
創(chuàng)建 Aggregate
  • 選中新建的 Target 行楞,點(diǎn)擊 Build Pharas 中的 + ,選擇 New Run Script Phase 土匀。
New Run Script Phase
  • 點(diǎn)開(kāi) Run Script 子房,添加以下的腳本代碼。
# Sets the target folders and the final framework product.
# 如果工程名稱和Framework的Target名稱不一樣的話就轧,要自定義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}/"
# 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}"
Run Script

2. 編譯所有文件

  • 按照下圖將編譯的 Target 選擇為剛才創(chuàng)建的 Aggregate 证杭,Device 選擇為 Generic iOS Device ,然后按下 Command + B 開(kāi)始編譯妒御。
編譯文件
  • 編譯完成后會(huì)自動(dòng)彈出已經(jīng)創(chuàng)建完成的 Framework 包內(nèi)容解愤,最終打包完的 .framework 會(huì)在項(xiàng)目下的 Products 文件夾下。
Products

測(cè)試打包完的 Framework

  • 新建一個(gè)測(cè)試工程 TestDemo 乎莉,將打包完的 TestFramework.framework 拖到工程中送讲,測(cè)試一下剛才創(chuàng)建的 TestClass 類,可以看到信息打印出來(lái)了惋啃,測(cè)試成功哼鬓。
測(cè)試工程
  • 如果使用打包完的 Framework 有出現(xiàn)崩潰的情況,可以考慮在項(xiàng)目 Other linker flags 中加入一些參數(shù)边灭,下面介紹三個(gè)常用參數(shù):
-ObjC:加了這個(gè)參數(shù)后魄宏,鏈接器就會(huì)把靜態(tài)庫(kù)中所有的 Objective-C 類和分類都加載到最后的可執(zhí)行文件中。

-all_load:會(huì)讓鏈接器把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中存筏,但是千萬(wàn)不要隨便使用這個(gè)參數(shù)宠互!假如你使用了不止一個(gè)靜態(tài)庫(kù)文件味榛,然后又使用了這個(gè)參數(shù),那么你很有可能會(huì)遇到 ld: duplicate symbol 錯(cuò)誤予跌,因?yàn)椴煌膸?kù)文件里面可能會(huì)有相同的目標(biāo)文件搏色,所以建議在遇到 -ObjC 失效的情況下使用 -force_load 參數(shù)。

-force_load:所做的事情跟 -all_load 其實(shí)是一樣的券册,但是 -force_load 需要指定要進(jìn)行全部加載的庫(kù)文件的路徑频轿,這樣的話,你就只是完全加載了一個(gè)庫(kù)文件烁焙,不影響其余庫(kù)文件的按需加載航邢。

主要步驟大概就是這樣,如果有發(fā)現(xiàn)什么問(wèn)題可以給我留言骄蝇,希望能夠幫助大家少走一些坑膳殷。

將來(lái)的你,一定會(huì)感激現(xiàn)在拼命的自己九火,愿自己與讀者的開(kāi)發(fā)之路無(wú)限美好赚窃。

我的傳送門(mén): 博客簡(jiǎn)書(shū) 岔激、微博 勒极、GitHub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虑鼎,一起剝皮案震驚了整個(gè)濱河市辱匿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炫彩,老刑警劉巖掀鹅,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異媒楼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)戚丸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)划址,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人限府,你說(shuō)我怎么就攤上這事夺颤。” “怎么了胁勺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵世澜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我署穗,道長(zhǎng)寥裂,這世上最難降的妖魔是什么嵌洼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮封恰,結(jié)果婚禮上麻养,老公的妹妹穿的比我還像新娘。我一直安慰自己诺舔,他們只是感情好鳖昌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著低飒,像睡著了一般许昨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褥赊,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天糕档,我揣著相機(jī)與錄音,去河邊找鬼崭倘。 笑死翼岁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的司光。 我是一名探鬼主播琅坡,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼残家!你這毒婦竟也來(lái)了榆俺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤坞淮,失蹤者是張志新(化名)和其女友劉穎茴晋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體回窘,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诺擅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啡直。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烁涌。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酒觅,靈堂內(nèi)的尸體忽然破棺而出撮执,到底是詐尸還是另有隱情,我是刑警寧澤舷丹,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布抒钱,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谋币。R本人自食惡果不足惜仗扬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瑞信。 院中可真熱鬧厉颤,春花似錦、人聲如沸凡简。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秤涩。三九已至帜乞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筐眷,已是汗流浹背黎烈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匀谣,地道東北人照棋。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像武翎,于是被迫代替她去往敵國(guó)和親烈炭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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