iOS制作framework

轉(zhuǎn)載請(qǐng)注明出處:

http://www.lxweimin.com/p/04a7e28f11b9

作者:紀(jì)小衰

framework的使用十分方便,一般來說直接拖入到項(xiàng)目中就可以直接使用接口,而不用在意具體的實(shí)現(xiàn)細(xì)節(jié),對(duì)于功能的封裝是個(gè)很好的途徑。當(dāng)我們寫的工具給別人使用的同時(shí)又不想讓別人知道自己的代碼,這個(gè)時(shí)候使用framework就可以派上用場(chǎng)了(ps:個(gè)人覺得開源是一個(gè)大牛必須要體會(huì)到的思想)。。。

廢話不多說,xcode如今已經(jīng)到了7,對(duì)于framework的制作可以說是十分方便了。公司之前的framework的制作都是采用執(zhí)行純腳本的方法,可以直接命令行編譯和融合不同版本(模擬器,真機(jī),debug,release)的framework,個(gè)人不是很喜歡,還是喜歡用較為官方的方式來制作framework,當(dāng)然為了方便還是少量地參照了網(wǎng)上的一些腳本。

一、新建framework工程


xcode->file->new->project選中iOS下的cocoa touch framework->next

創(chuàng)建工程

接下來的步驟和創(chuàng)建一個(gè)普通的工程沒什么區(qū)別,創(chuàng)建完畢以后在工程中新建JRModel類和JRModel2類文件,在我們的framework工程創(chuàng)建以后系統(tǒng)會(huì)默認(rèn)創(chuàng)建一個(gè)和工程名相同的頭文件,我這里是JRDataModel.h。一般來說我們會(huì)把framework中需要提供給外部的頭文件都在這個(gè)頭文件中import一下,這樣使用者只要包含一個(gè)頭文件就可以使用所有的類了。

創(chuàng)建文件后導(dǎo)入公共頭文件

這個(gè)地方需要注意到兩點(diǎn),一個(gè)就是導(dǎo)入的時(shí)候必須要使用framework的方式導(dǎo)入,使用<包名/頭文件名.h>,因?yàn)樵趯?shí)際使用framework的時(shí)候是需要從包中搜索頭文件的。還有一個(gè)坑就是右邊的那個(gè)設(shè)置,對(duì)于總的頭文件還有所有需要用到的頭文件,都需要公開,選中以后把右邊包的編譯屬性改為public,否則打出來的包在別的工程中實(shí)際上是不能引用的。

二、編譯工程


接下來就是開始編譯工程了(如下圖),選中運(yùn)行按鈕右邊的編譯目標(biāo),選擇Generic iOS Device,然后command+b編譯一下,這個(gè)時(shí)候我們工程中的products文件夾下面的framework文件會(huì)由原來的紅色(表示文件丟失)變成黑色(表示文件存在)。如果我們選擇的是Generic iOS Device那么編譯出來的framework只能在真機(jī)中使用,如果選中的是普通的模擬器,那么編譯出來framewo只能在模擬器中使用。

tips:這里需要注意一下,如果一開始選擇的是模擬器,那么即使build成功,framework也不會(huì)變成黑色,可能是因?yàn)檫@里的framework指向的是真機(jī)中對(duì)應(yīng)的framework,但是在相對(duì)應(yīng)的目錄下的模擬器對(duì)應(yīng)的framework是存在的

編譯framework

右擊生成好的framework,選中show in finder可以查看framework在磁盤中的位置。進(jìn)入目錄以后,一般來說最多有四個(gè)目錄,我這里只有三個(gè)(如下圖)因?yàn)閷?duì)于模擬器一般不會(huì)要release版本的。也可以通過finder,快捷鍵control+command+g輸入~/Library/Developer/Xcode/DerivedData/Build/Products默認(rèn)路徑進(jìn)入

分別在模擬器和真機(jī)選項(xiàng)中編譯,發(fā)現(xiàn)實(shí)際只產(chǎn)生了模擬器和真機(jī)的debug版本的framework包,而沒有release版本的包。這需要我們調(diào)整一下xcode的build類型,選中運(yùn)行的target在下來列表中選Edit Scheme,進(jìn)入以后把run中的Build Configureation修改為Release,這時(shí)候就可以編譯出release版本的包了(如下圖)

三、合并framework


到此,我們已經(jīng)制作出對(duì)于各種情況下使用的framework了,對(duì)于不同的環(huán)境需要使用不同種類的framework,這在很多時(shí)候顯得很麻煩。能不能制作一個(gè)能在所有場(chǎng)景使用的包呢。

這個(gè)時(shí)候我們可以考慮合并所有版本的包,一般來說可以使用腳本進(jìn)行合并,但是每次使用腳本比較麻煩,我們可以在xcode中添加一個(gè)共同體aggregate,然后添加編譯腳本來實(shí)現(xiàn)。

在工程中點(diǎn)擊上方工具欄File->New->Target,在選項(xiàng)中選擇Other中的Aggregate,命名最好和工程名有關(guān),我這里就寫成JRDataModelAggregate。

新建Aggregate

新建好以后,選擇targets列表下的JRDataModelAggregate,點(diǎn)擊build phases,點(diǎn)擊+新建一個(gè)New Run Script Phase,把下面的腳本復(fù)制到shell下的選項(xiàng)中(腳本來源自網(wǎng)絡(luò),感謝這段腳本的原作者)。有能力的可以根據(jù)自己的需要修改下面的腳本。

# 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}"

粘貼shell腳本

復(fù)制完以后,點(diǎn)擊左上角運(yùn)行旁邊的target(上圖左上角那個(gè)黃色的選項(xiàng)),在下拉的列表中選中我們剛才創(chuàng)建的JRDataModelAggregate,command+B編譯一下,如果沒什么意外,等到編譯成功便會(huì)彈出我們編譯好的framework了。

四、驗(yàn)證framework


framework其實(shí)可以看做是一個(gè)帶擴(kuò)展名的文件夾,所以我們可以直接進(jìn)入framework的內(nèi)部。通過下面的控制臺(tái)指令進(jìn)入到framework中(cd后面是你自己的framework路徑)

cd /Users/ctzxh/Desktop/JRModel/JRDataModel/Products/JRDataModel.framework

執(zhí)行下面的命令判斷當(dāng)前framework支持的架構(gòu)

lipo -info JRDataModel

完成驗(yàn)證

Tips1:

對(duì)于上面的每種處理器架構(gòu)對(duì)應(yīng)的設(shè)備請(qǐng)自行百度。這里說明一下,如果讓你的包可以支持armv7s的架構(gòu)(這里說的支持指的是針對(duì)這種架構(gòu)的優(yōu)化),可以根據(jù)下圖的方式添加,新版的xcode默認(rèn)便沒有加上armv7s的架構(gòu),由于處理器向下兼容,所以即使不添加,所使用包的工程也是可以在armv7s架構(gòu)上的機(jī)器運(yùn)行的。個(gè)人推薦還是不必考慮了,按照官方的來就可以了。添加完以后在驗(yàn)證包的時(shí)候會(huì)多顯示一個(gè)armv7s。

添加armv7s架構(gòu)

Tips2:

上面用Aggregate制作的庫(kù)是拖入到使用的工程是直接可以使用的,但是之前分別制作的庫(kù)直接拖入是不能使用的,解決的方式有兩種:

第一種:制作鏈接庫(kù)的時(shí)候,選擇生成靜態(tài)庫(kù)

第二種:在使用動(dòng)態(tài)鏈接庫(kù)的時(shí)候嵌入二進(jìn)制庫(kù),在下面的選項(xiàng)中添加要導(dǎo)入的動(dòng)態(tài)庫(kù)

網(wǎng)上有種方式是把framework的屬性從required變成Optional,親測(cè)行不通,能導(dǎo)入但是不能用。。。

就到這兒吧~~~

Add:如果只做的是.a的靜態(tài)庫(kù)可以使用下面的腳本,方法一樣

if["${ACTION}"="build"]

then

#要build的target名

target_Name=${PROJECT_NAME}

echo"target_Name=${target_Name}"

#build之后的文件夾路徑

build_DIR=${SRCROOT}/build

echo"build_DIR=${build_DIR}"

#真機(jī)build生成的頭文件的文件夾路徑

DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}

echo"DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"

#真機(jī)build生成的.a文件路徑

DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a

echo"DEVICE_DIR_A=${DEVICE_DIR_A}"

#模擬器build生成的.a文件路徑

SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a

echo"SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"

#目標(biāo)文件夾路徑

INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}

echo"INSTALL_DIR=${INSTALL_DIR}"

#目標(biāo)頭文件文件夾路徑

INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers

echo"INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"

#目標(biāo).a路徑

INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a

echo"INSTALL_DIR_A=${INSTALL_DIR_A}"

#判斷build文件夾是否存在,存在則刪除

if[ -d"${build_DIR}"]

then

rm -rf"${build_DIR}"

fi

#判斷目標(biāo)文件夾是否存在,存在則刪除該文件夾

if[ -d"${INSTALL_DIR}"]

then

rm -rf"${INSTALL_DIR}"

fi

#創(chuàng)建目標(biāo)文件夾

mkdir -p"${INSTALL_DIR}"

#build之前clean一下

xcodebuild -target${target_Name}clean

#模擬器build

xcodebuild -target${target_Name}-configuration Release -sdk iphonesimulator

#真機(jī)build

xcodebuild -target${target_Name}-configuration Release -sdk iphoneos

#復(fù)制頭文件到目標(biāo)文件夾

cp -R"${DEVICE_DIR_INCLUDE}""${INSTALL_DIR_Headers}"

#合成模擬器和真機(jī).a包

lipo -create"${DEVICE_DIR_A}""${SIMULATOR_DIR_A}"-output"${INSTALL_DIR_A}"

#打開目標(biāo)文件夾

open"${INSTALL_DIR}"

fi

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,860評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,025評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,421評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,642評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,177評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,970評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,157評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,410評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評(píng)論 1 289
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,896評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,157評(píng)論 2 375

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