一卧惜、介紹
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
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文件重新打開工程仅乓。
- 非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)去紧显。
- 讀取的時(shí)候需要帶上讀取路徑,示例:
[_searchButton setImage:[UIImage imageNamed:@"Resources.bundle/search.png"] forState:UIControlStateNormal];
5旭绒、修改pch文件路徑
- 若原來的文件中包含pch文件用來做全局引用,需要再此工程中修改pch文件路徑。
6挥吵、工程配置
- 修改支持設(shè)備重父、版本和架構(gòu)
注意:.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控件是不可見的。
8憋肖、工程編譯
- 編譯之前需要進(jìn)行Edit Scheme因痛,把Debug修改成Release。
- 選擇真機(jī)(或者Generic iOS Device)和模擬器都編譯一次岸更,編譯通過后鸵膏,選擇Products文件夾,對(duì)應(yīng)生成的framework文件Show in Finder怎炊,會(huì)發(fā)現(xiàn)有對(duì)應(yīng)生成的真機(jī)和模擬器的framework谭企。
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)信息非区。
備注說明
架構(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的圖片等資源财松。
2瘪贱、使用功能
- 對(duì)應(yīng)暴露的.h文件,可以直接使用#improt <framework名稱/指定.h>來引用頭文件辆毡。
- 對(duì)于framework的其他資源文件菜秦,可以使用讀取bundle資源包的路徑來獲取,示例:
[_searchButton setImage:[UIImage imageNamed:@"Resources.bundle/search.png"] forState:UIControlStateNormal];
至此舶掖,教程完畢球昨。