將整個(gè)Xcode項(xiàng)目打包成靜態(tài)庫(kù)Framework

一卧惜、介紹

1、背景

考慮到上架App的安全性和后期代碼管理的一些內(nèi)容夹纫,以及現(xiàn)有馬甲和超級(jí)App的一些業(yè)務(wù)上咽瓷,越來越多的涉及到大模塊的內(nèi)容搬移和共享,所以權(quán)衡各種方式之后舰讹,考慮使用靜態(tài)庫(kù)的方式來把獨(dú)立業(yè)務(wù)部分用靜態(tài)庫(kù)的方式加載和共享茅姜。

2、靜態(tài)庫(kù)介紹

  • 什么是庫(kù)?

共享代碼便是庫(kù)钻洒,實(shí)現(xiàn)代碼的復(fù)用奋姿,一般分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。

  • 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別素标?

靜態(tài)庫(kù):鏈接時(shí)完整的拷貝到可執(zhí)行文件称诗,多次使用多次拷貝,造成冗余头遭,使包變的更大寓免。
動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)加在到內(nèi)存中计维,供系統(tǒng)調(diào)用袜香,系統(tǒng)加在一次,多次使用鲫惶,共用節(jié)省內(nèi)存蜈首。

  • iOS/Mac 中的靜態(tài)庫(kù)?

后綴為: .a和.framework 文件

  • iOS/Mac 中的動(dòng)態(tài)庫(kù)欠母?

后綴為: .dylib和.framework 文件

  • iOS/Mac Framework 為什么即是動(dòng)態(tài)又是靜態(tài)欢策?

系統(tǒng)的架構(gòu)是動(dòng)態(tài)的,我們自己創(chuàng)建的是靜態(tài)的艺蝴。

  • .a和.framework的區(qū)別是什么猬腰?

.a是單純的二進(jìn)制文件,.framework是二進(jìn)制問價(jià)+資源文件猜敢。
其中.a不能直接使用姑荷,需要.h文件配合,而.framework則可以直接使用
.framework = .a + .h + sorrceFile(資源文件)

  • 為什么要使用靜態(tài)庫(kù)缩擂?

共享代碼鼠冕,方便使用。
實(shí)現(xiàn)iOS 程序的模塊化胯盯,固定的業(yè)務(wù)模塊話懈费,減少開發(fā)的重復(fù)勞動(dòng)。
和別人分享代碼博脑,但又不想讓別人知道代碼的具體實(shí)現(xiàn)憎乙。
開發(fā)第三方SDK 的需要。
有時(shí)候集成其他項(xiàng)目的時(shí)候 也可以使用叉趣。

3泞边、注意點(diǎn)

  • AppDelegate

AppDelegate不能打包進(jìn)靜態(tài)庫(kù),所以AppDelegate.m文件在編譯的文件列表中要撤選,在AppDelegate中做的一些操作要全部封裝成接口暴露出去

  • 第三方庫(kù)

項(xiàng)目中的第三方庫(kù)優(yōu)先使用CocoaPods管理,可以不用打包進(jìn)自己的靜態(tài)庫(kù)疗杉。如果我們打包整個(gè)工程的時(shí)候沒有把用到的第三方框架一起打包阵谚,那么提供靜態(tài)庫(kù)的時(shí)候,要說明依賴哪些第三方的庫(kù)。

  • 資源文件

默認(rèn)情況下梢什,靜態(tài)庫(kù)只會(huì)打包代碼文件奠蹬,像圖片、xib嗡午、storyboard囤躁、plist文件等都不會(huì)被打包,就需要?jiǎng)?chuàng)建一個(gè)bundle文件夾翼馆,把所有的圖片割以、plist文件、Images.xcassets应媚、xib严沥、storyboard都打包進(jìn)去,而且項(xiàng)目中用到圖片的時(shí)候中姜,只能通過bundle/xxx.png文件名的方式來設(shè)置消玄。

二、封裝步驟

1丢胚、新建工程

  • 選擇File>New>Project>iOS>Cocoa Touch Framework
1.png

2翩瓜、導(dǎo)入文件

  • 先刪除系統(tǒng)自動(dòng)生成的工程同名的.h文件,創(chuàng)建相同名稱繼承自NSObject的類携龟,用于對(duì)外暴露接口的類,到時(shí)候只需把創(chuàng)建的.h暴露出去即可兔跌。
  • 拉取需要制作靜態(tài)庫(kù)的所有文件資源到新工程目錄下。

3峡蟋、導(dǎo)入第三方庫(kù)

  • 使用CocoaPods管理的第三方庫(kù)坟桅,在此工程下,同樣配置需要支持的第三方庫(kù)的Podfile后執(zhí)行pod install蕊蝗,并用.xcworkspace文件重新打開工程仅乓。
2.png
  • 非CocoaPods管理的第三方庫(kù),連同資源文件一起拉進(jìn)工程目錄下蓬戚,并部署對(duì)應(yīng)的依賴和系統(tǒng)庫(kù)夸楣,必要時(shí),把第三方的.h文件暴露成Public子漩。

4豫喧、創(chuàng)建bundle文件

  • 創(chuàng)建一個(gè)bundle文件,命名為:Resources幢泼,把項(xiàng)目中用到的圖片或者其他非代碼資源都拖拽進(jìn)去紧显。
4.png
  • 讀取的時(shí)候需要帶上讀取路徑,示例:
[_searchButton setImage:[UIImage imageNamed:@"Resources.bundle/search.png"] forState:UIControlStateNormal];

5旭绒、修改pch文件路徑

  • 若原來的文件中包含pch文件用來做全局引用,需要再此工程中修改pch文件路徑。
13.png

6挥吵、工程配置

  • 修改支持設(shè)備重父、版本和架構(gòu)
3.png

7.png

8.png

注意:.Build Setting搜索linking設(shè)置Dead Code Stripping為NO是編譯選項(xiàng)優(yōu)化,可以使包瘦身,可以根據(jù)具體要求選擇是否修改忽匈。

備注說明

不同的模擬器和真機(jī)所支持的CPU架構(gòu)是不一樣的房午,如果庫(kù)文件不支持某種CPU架構(gòu),那么就無法在對(duì)應(yīng)的設(shè)備上編譯丹允。

模擬器環(huán)境下支持的CPU架構(gòu):
4s — 5:支持i386架構(gòu)郭厌,CPU處理器是32位的
5s — 6Plus:支持x86_64架構(gòu),CPU處理器是64位的

真機(jī)環(huán)境下支持的CPU架構(gòu):
3gs — 4s:支持armv7架構(gòu)雕蔽,CPU處理器是32位的
5 — 5c:支持armv7s架構(gòu)折柠,CPU處理器是32位的
5s — 6Plus及以上:支持arm64架構(gòu),CPU處理器是64位的

Architectures屬性是系統(tǒng)根據(jù)你的Xcode版本自動(dòng)默認(rèn)配置的,如果你當(dāng)前的Xcode版本比較舊批狐,默認(rèn)的真機(jī)架構(gòu)有可能只是:armv7扇售,而我目前的版本是Xcode9.4,Architectures的默認(rèn)設(shè)置只有兩種架構(gòu):armv7和arm64嚣艇。

Valid Architectures選項(xiàng)里面卻有三種架構(gòu)承冰,包括arm64,armv7,armv7s,在打包成靜態(tài)庫(kù)的時(shí)候食零,Xcode會(huì)拿到這兩個(gè)選項(xiàng)里面的參數(shù)進(jìn)行比較困乒,只保留在兩個(gè)選項(xiàng)里都同時(shí)存在的架構(gòu)。

7贰谣、頭文件配置

根據(jù)需要開放的.h拖動(dòng)Project的文件到Public列娜搂,需要隱藏的拖動(dòng)到Private。
注意:因?yàn)?Framwork 工程是沒有自動(dòng)導(dǎo)入系統(tǒng)的 UIKit.framwork冈爹,我們Framwork里面是用到了UI控件的涌攻,所以需要手動(dòng)導(dǎo)入系統(tǒng)UI庫(kù)。否則封裝完畢频伤,調(diào)用該庫(kù)的時(shí)候恳谎,里面的UI控件是不可見的。


12.png

8憋肖、工程編譯

  • 編譯之前需要進(jìn)行Edit Scheme因痛,把Debug修改成Release。
10.png
  • 選擇真機(jī)(或者Generic iOS Device)和模擬器都編譯一次岸更,編譯通過后鸵膏,選擇Products文件夾,對(duì)應(yīng)生成的framework文件Show in Finder怎炊,會(huì)發(fā)現(xiàn)有對(duì)應(yīng)生成的真機(jī)和模擬器的framework谭企。
14.png
15.png

9廓译、合并Framework

  • 先檢查一下對(duì)應(yīng)的framework架構(gòu)信息是否正確,打開終端使用命令行:
lipo -info 空格 framework地址
  • 合并真機(jī)和模擬器的framework债查,使用命令行處理:
sudo lipo -create 空格 (此處請(qǐng)?zhí)顚懻鏅C(jī)testNewFramework文件路徑) 空格 (此處填寫模擬器testNewFramework文件路徑) 空格 -output 空格 自定義合成文件存儲(chǔ)路徑(合成文件的名字testNewFramework)
  • 最后查看合并后的framework架構(gòu)信息是否包含真機(jī)和模擬器的所有的架構(gòu)信息非区。
17.png

備注說明

架構(gòu)信息:首先了解一下什么是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及以上版本等腊瑟。

三聚假、使用Framework

1、拖入主程序

  • 直接將生成的framework拖入要使用的工程中去闰非,使用文件復(fù)制類型加載膘格。
  • 引入framework,否則會(huì)娶不到framework的圖片等資源财松。
18.png

2瘪贱、使用功能

  • 對(duì)應(yīng)暴露的.h文件,可以直接使用#improt <framework名稱/指定.h>來引用頭文件辆毡。
  • 對(duì)于framework的其他資源文件菜秦,可以使用讀取bundle資源包的路徑來獲取,示例:
[_searchButton setImage:[UIImage imageNamed:@"Resources.bundle/search.png"] forState:UIControlStateNormal];

至此舶掖,教程完畢球昨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眨攘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖归粉,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異避诽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)璃谨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲤妥,“玉大人佳吞,你說我怎么就攤上這事∶薨玻” “怎么了底扳?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贡耽。 經(jīng)常有香客問我衷模,道長(zhǎng),這世上最難降的妖魔是什么蒲赂? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任阱冶,我火速辦了婚禮,結(jié)果婚禮上滥嘴,老公的妹妹穿的比我還像新娘木蹬。我一直安慰自己,他們只是感情好若皱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布镊叁。 她就那樣靜靜地躺著,像睡著了一般走触。 火紅的嫁衣襯著肌膚如雪晦譬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天互广,我揣著相機(jī)與錄音敛腌,去河邊找鬼。 笑死兜辞,一個(gè)胖子當(dāng)著我的面吹牛迎瞧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逸吵,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凶硅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了扫皱?” 一聲冷哼從身側(cè)響起足绅,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捷绑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氢妈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粹污,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年首量,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壮吩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡加缘,死狀恐怖鸭叙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拣宏,我是刑警寧澤沈贝,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站勋乾,受9級(jí)特大地震影響宋下,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辑莫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一学歧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧各吨,春花似錦撩满、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至忌锯,卻和暖如春伪嫁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偶垮。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工张咳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人似舵。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓脚猾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砚哗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子龙助,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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