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 。