引言:? 在簡書混跡也有些時日了板惑,一直在關(guān)注IT界大牛們的分享裆熙,各位無私的分享端礼,對我裨益匪淺,也越來越喜歡這里入录,雖然我還是個iOS開發(fā)的“小白白”蛤奥,O(∩_∩)O~!不過呢我也會虛心學習并隨時記錄我的學習心得僚稿,點滴積累凡桥,不積跬步無以至千里,不積小流無以成江海蚀同,為了自己的夢唬血,起航吧!此過程中肯定會有瑕疵唤崭,不足拷恨,歡迎批評指正,我會虛心接受谢肾,如果也會給你帶來一點點的幫助腕侄,我非常榮幸!
?????? 1.創(chuàng)建一個新工程文件:
如圖所示選擇上述的箭頭所指的Cocoa Touch Framework文件芦疏,第二個是靜態(tài)庫文件冕杠,也就是我們常說的.a文件。今天我們做的是Framework(框架)文件酸茴。
? ? ? 2.將自動生成的.h文件刪掉分预,因為我們既需要頭文件也需要實現(xiàn)文件,所以我們自己新建個類文件薪捍,繼承自NSObject即可笼痹,名字為與項目名稱相同,因為Framework制作完成使用的時候簡單酪穿、方便凳干。如下圖所示:
?????? 3. 在頭文件內(nèi)自定義一個測試方法,在實現(xiàn)文件內(nèi)實現(xiàn)此方法被济。
????? 4.下面進行整個工程的配置:
??????????? 4.1救赐、TARGETS - >Build Settings -> Architectures:添加 armv7s;
上述3步驟完成后會出現(xiàn)other選項只磷,點擊后如下圖操作:
注:此處為什么添加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更新后灶壶,默認不支持armv7s肝断,也就是默認不會編譯armv7s架構(gòu),雖然其處理器架構(gòu)會向下兼容驰凛,但是無法進行相關(guān)優(yōu)化操作胸懈。如果你提供的Framework默認不支持armv7s架構(gòu),但是使用者要支持armv7s架構(gòu)恰响,這時就會有沖突趣钱,Xcode無法構(gòu)建代碼原因是丟失某架構(gòu)(armv7s架構(gòu))鏈接庫的錯誤,所以為了避免沖突胚宦,F(xiàn)ramework默認支持armv7s架構(gòu)首有,使用過程中由使用者自行決定是否支持。
???????? 4.2"Build Active Architecture Only" 設(shè)置為 "NO"
注:Build active Architecture Only為什么設(shè)置為NO枢劝?
????? 在目標設(shè)備上绞灼,執(zhí)行設(shè)備對應(yīng)的指令集。Build active Architecture Only 設(shè)置為YES呈野,只會選擇編譯低矮、鏈接對應(yīng)的指令集,設(shè)置為NO時被冒,會涵蓋所有指令集军掂,在必要的時候選擇執(zhí)行對應(yīng)的指令集轮蜕。所以一般在Debug時會選擇設(shè)置為YES(效率會高點,雖然也沒什么卵用)蝗锥,Release時會選擇設(shè)置為NO跃洛,以支持所有可能的架構(gòu)。
???????? 4.3"Mach-O Type" 在iOS8之后终议,設(shè)置為靜態(tài)庫或者動態(tài)庫都可以上架App Store汇竭,一般來說動態(tài)庫要比靜態(tài)庫好。因為鏈接時不復制穴张,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存细燎,供程序調(diào)用,系統(tǒng)只會加載一次皂甘,多個程序公用玻驻,節(jié)省內(nèi)存。
注意:這是并不能動態(tài)更新App Store上架的應(yīng)用偿枕,因為上架App Store的應(yīng)用是經(jīng)過開發(fā)者證書簽名璧瞬,并上傳App Store再次簽名,拿到App Store的私鑰是不可能的渐夸,所以動態(tài)更新不可能實現(xiàn)嗤锉,蘋果也絕對不允許。
???????? 4.4"iOS Deployment Target" 設(shè)置為 "iOS 8.0" 墓塌,這是支持最低運行iOS系統(tǒng)版本(可自行選擇档冬,但是要注意的是,iOS SDK中桃纯,已經(jīng)廢棄的方法酷誓,這個需要配合 Base SDK 設(shè)置)。
在Xcode7及以上版本中 Dead Code Stripping态坦、Link with Standard Libraries不再需要設(shè)置成NO盐数!
5.下面我們將頭文件暴露在外,實現(xiàn)文件隱藏起來伞梯,如下:
? ? ? 5.1 TARGETS - >Build Settings -> Build Phases中玫氢,將Headers中的Project內(nèi)的頭文件拖到Public中。如下:
6.制作Framework文件
????? 6.1來到工程目錄樹谜诫,Products下的文件都是紅色的漾峡,現(xiàn)在我們選中.framework文件,分別真機和模擬器運行一遍(成功運行)喻旷,然后Show in Finder 找到對應(yīng)的 .framework文件(上級目錄可以看出是真機還是模擬器文件夾)生逸,真機和模擬器運行成功的文件是在這倆個文件夾內(nèi)的。如下圖:
????? 6.2我們需要將上圖內(nèi)的兩個文件(FrameworkTest)合并成一個新的文件,并放在上述.framework文件中(真機or模擬器)槽袄,使之可以在模擬器和真機上均能運行烙无。這需要用到命令行工具:
注:為了避免權(quán)限問題 請使用sudo(因為我公司的Mac有兩個用戶,當初我就因此問題無法合成遍尺。)
????? 命令行語句:sudo lipo -create (此處請?zhí)顚懻鏅CFrameworkTest文件路徑 上述的FrameworkTest文件) (此處填寫模擬器FrameworkTest文件路徑) -output? 自定義合成文件存儲路徑(合成文件的名字FrameworkTest)
?我存放在temp文件夾中截酷,如圖:
將合成的FrameworkTest文件復制到上述真機or模擬機器編譯執(zhí)行的.framework文件夾內(nèi),將原來的FrameworkTest文件替換乾戏,至此我們就制作完成了Framework框架了迂苛,也就是當前的.framework文件。如圖:
注:為什么要替換FrameworkTest文件鼓择?
????? 因為原來的FrameworkTest文件要么只能在真機上運行三幻,要么只能在模擬器上運行。合成文件為的就是讓.framework文件既能在真機上運行也能在模擬器上運行惯退,畢竟不能讓使用者只能在某個特定的情況下才可以使用赌髓,那樣就背離我們的初衷啦从藤!
????? 6.3將.framework文件添加到一個測試項目工程文件中(這個相信大家都知道催跪,這里就不贅述啦),在實現(xiàn)文件內(nèi)調(diào)用.framework內(nèi)部頭文件聲明的方法夷野,看是否會輸出我們NSLog的語句懊蒸,如果輸出即為成功。如下圖: