引言:? 在簡(jiǎn)書(shū)混跡也有些時(shí)日了,一直在關(guān)注IT界大牛們的分享,各位無(wú)私的分享,對(duì)我裨益匪淺,也越來(lái)越喜歡這里,雖然我還是個(gè)iOS開(kāi)發(fā)的“小白白”,O(∩_∩)O~!不過(guò)呢我也會(huì)虛心學(xué)習(xí)并隨時(shí)記錄我的學(xué)習(xí)心得,點(diǎn)滴積累,不積跬步無(wú)以至千里,不積小流無(wú)以成江海,為了自己的夢(mèng),起航吧!此過(guò)程中肯定會(huì)有瑕疵,不足,歡迎批評(píng)指正,我會(huì)虛心接受,如果也會(huì)給你帶來(lái)一點(diǎn)點(diǎn)的幫助,我非常榮幸!
?????? 1.創(chuàng)建一個(gè)新工程文件:
如圖所示選擇上述的箭頭所指的Cocoa Touch Framework文件,第二個(gè)是靜態(tài)庫(kù)文件,也就是我們常說(shuō)的.a文件。今天我們做的是Framework(框架)文件。
? ? ? 2.將自動(dòng)生成的.h文件刪掉,因?yàn)槲覀兗刃枰^文件也需要實(shí)現(xiàn)文件,所以我們自己新建個(gè)類(lèi)文件,繼承自NSObject即可,名字為與項(xiàng)目名稱(chēng)相同,因?yàn)镕ramework制作完成使用的時(shí)候簡(jiǎn)單、方便。如下圖所示:
?????? 3. 在頭文件內(nèi)自定義一個(gè)測(cè)試方法,在實(shí)現(xiàn)文件內(nèi)實(shí)現(xiàn)此方法。
????? 4.下面進(jìn)行整個(gè)工程的配置:
??????????? 4.1、TARGETS - >Build Settings -> Architectures:添加 armv7s;
上述3步驟完成后會(huì)出現(xiàn)other選項(xiàng),點(diǎn)擊后如下圖操作:
注:此處為什么添加armv7s?
??? 首先了解一下什么是ARM,ARM是微處理器,而armv6, armv7, armv7s是ARM CPU的不同指令集,
armv6設(shè)備:iPhone, iPhone2, iPhone 3G,第一代、第二代iPod Touch
armv7設(shè)備:iPhone 3GS,iPhone 4,iPhone 4S,iPad ,iPad 2,iPod Touch 3G,iPod Touch 4
armv7s設(shè)備:iPhone 5,iPad4
arm64設(shè)備:iPhone 5S,iPad Air,iphone6,iphone6plus,iPhone6s,iPhone6s Plus等
? ? Xcode6更新后,默認(rèn)不支持armv7s,也就是默認(rèn)不會(huì)編譯armv7s架構(gòu),雖然其處理器架構(gòu)會(huì)向下兼容,但是無(wú)法進(jìn)行相關(guān)優(yōu)化操作。如果你提供的Framework默認(rèn)不支持armv7s架構(gòu),但是使用者要支持armv7s架構(gòu),這時(shí)就會(huì)有沖突,Xcode無(wú)法構(gòu)建代碼原因是丟失某架構(gòu)(armv7s架構(gòu))鏈接庫(kù)的錯(cuò)誤,所以為了避免沖突,F(xiàn)ramework默認(rèn)支持armv7s架構(gòu),使用過(guò)程中由使用者自行決定是否支持。
???????? 4.2"Build Active Architecture Only" 設(shè)置為 "NO"
注:Build active Architecture Only為什么設(shè)置為NO?
????? 在目標(biāo)設(shè)備上,執(zhí)行設(shè)備對(duì)應(yīng)的指令集。Build active Architecture Only 設(shè)置為YES,只會(huì)選擇編譯、鏈接對(duì)應(yīng)的指令集,設(shè)置為NO時(shí),會(huì)涵蓋所有指令集,在必要的時(shí)候選擇執(zhí)行對(duì)應(yīng)的指令集。所以一般在Debug時(shí)會(huì)選擇設(shè)置為YES(效率會(huì)高點(diǎn),雖然也沒(méi)什么卵用),Release時(shí)會(huì)選擇設(shè)置為NO,以支持所有可能的架構(gòu)。
???????? 4.3"Mach-O Type" 在iOS8之后,設(shè)置為靜態(tài)庫(kù)或者動(dòng)態(tài)庫(kù)都可以上架App Store,一般來(lái)說(shuō)動(dòng)態(tài)庫(kù)要比靜態(tài)庫(kù)好。因?yàn)殒溄訒r(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只會(huì)加載一次,多個(gè)程序公用,節(jié)省內(nèi)存。
注意:這是并不能動(dòng)態(tài)更新App Store上架的應(yīng)用,因?yàn)樯霞蹵pp Store的應(yīng)用是經(jīng)過(guò)開(kāi)發(fā)者證書(shū)簽名,并上傳App Store再次簽名,拿到App Store的私鑰是不可能的,所以動(dòng)態(tài)更新不可能實(shí)現(xiàn),蘋(píng)果也絕對(duì)不允許。
???????? 4.4"iOS Deployment Target" 設(shè)置為 "iOS 8.0" ,這是支持最低運(yùn)行iOS系統(tǒng)版本(可自行選擇,但是要注意的是,iOS SDK中,已經(jīng)廢棄的方法,這個(gè)需要配合 Base SDK 設(shè)置)。
在Xcode7及以上版本中 Dead Code Stripping、Link with Standard Libraries不再需要設(shè)置成NO!
5.下面我們將頭文件暴露在外,實(shí)現(xiàn)文件隱藏起來(lái),如下:
? ? ? 5.1 TARGETS - >Build Settings -> Build Phases中,將Headers中的Project內(nèi)的頭文件拖到Public中。如下:
6.制作Framework文件
????? 6.1來(lái)到工程目錄樹(shù),Products下的文件都是紅色的,現(xiàn)在我們選中.framework文件,分別真機(jī)和模擬器運(yùn)行一遍(成功運(yùn)行),然后Show in Finder 找到對(duì)應(yīng)的 .framework文件(上級(jí)目錄可以看出是真機(jī)還是模擬器文件夾),真機(jī)和模擬器運(yùn)行成功的文件是在這倆個(gè)文件夾內(nèi)的。如下圖:
????? 6.2我們需要將上圖內(nèi)的兩個(gè)文件(FrameworkTest)合并成一個(gè)新的文件,并放在上述.framework文件中(真機(jī)or模擬器),使之可以在模擬器和真機(jī)上均能運(yùn)行。這需要用到命令行工具:
注:為了避免權(quán)限問(wèn)題 請(qǐng)使用sudo(因?yàn)槲夜镜腗ac有兩個(gè)用戶(hù),當(dāng)初我就因此問(wèn)題無(wú)法合成。)
????? 命令行語(yǔ)句:sudo lipo -create (此處請(qǐng)?zhí)顚?xiě)真機(jī)FrameworkTest文件路徑 上述的FrameworkTest文件) (此處填寫(xiě)模擬器FrameworkTest文件路徑) -output? 自定義合成文件存儲(chǔ)路徑(合成文件的名字FrameworkTest)
?我存放在temp文件夾中,如圖:
將合成的FrameworkTest文件復(fù)制到上述真機(jī)or模擬機(jī)器編譯執(zhí)行的.framework文件夾內(nèi),將原來(lái)的FrameworkTest文件替換,至此我們就制作完成了Framework框架了,也就是當(dāng)前的.framework文件。如圖:
注:為什么要替換FrameworkTest文件?
????? 因?yàn)樵瓉?lái)的FrameworkTest文件要么只能在真機(jī)上運(yùn)行,要么只能在模擬器上運(yùn)行。合成文件為的就是讓.framework文件既能在真機(jī)上運(yùn)行也能在模擬器上運(yùn)行,畢竟不能讓使用者只能在某個(gè)特定的情況下才可以使用,那樣就背離我們的初衷啦!
????? 6.3將.framework文件添加到一個(gè)測(cè)試項(xiàng)目工程文件中(這個(gè)相信大家都知道,這里就不贅述啦),在實(shí)現(xiàn)文件內(nèi)調(diào)用.framework內(nèi)部頭文件聲明的方法,看是否會(huì)輸出我們NSLog的語(yǔ)句,如果輸出即為成功。如下圖: