本文包含 :
Framework 介紹鸠窗;
封裝一個(gè)Framework 步驟;
封裝 Framework 時(shí) 胯究,項(xiàng)目 配置 說(shuō)明稍计;
Framework 內(nèi)部 引用 圖片資源 ;
Framework 內(nèi)部 引用 Xib裕循;
Framework 外部 引用 Framework 中 的圖片資源臣嚣;
Framework 外部 引用 Framework 中 的Xib資源净刮;
Framework 里面包含 UI控件,如一個(gè)小App 硅则,小插件淹父;
Framework 介紹:
iOS/Mac 開(kāi)發(fā) Framework 是一種庫(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)制文件+資源文件逊躁。
其中.a不能直接使用,需要.h文件配合隅熙,而.framework則可以直接使用
.framework = .a + .h + sorrceFile(資源文件)
為什么要使用靜態(tài)庫(kù)稽煤?
共享代碼,方便使用囚戚。
實(shí)現(xiàn)iOS 程序的模塊化酵熙,固定的業(yè)務(wù)模塊話,減少開(kāi)發(fā)的重復(fù)勞動(dòng)弯淘。
和別人分享代碼绿店,但又不想讓別人知道代碼的具體實(shí)現(xiàn)。
開(kāi)發(fā)第三方SDK 的需要庐橙。
有時(shí)候集成其他項(xiàng)目的時(shí)候 也可以使用假勿。
封裝一個(gè)Framework 步驟:
1.新建工程選擇iOS —> Cocoa Touch Framework
2.Framwork庫(kù)文件工程創(chuàng)建完成以后,會(huì)自動(dòng)生成一個(gè).h文件作為頭文件使用态鳖。
我這里這個(gè)叫 testNewFramwork.h
當(dāng)我們寫(xiě)好的源文件很多的時(shí)候转培,為了使用方便,往往我們會(huì)自己創(chuàng)建一個(gè).h文件浆竭。當(dāng)源文件中已經(jīng)有了.h文件的時(shí)候浸须,我們就不需要Framwork庫(kù)文件自動(dòng)生成.h文件。刪除即可邦泄。
刪除 系統(tǒng)自動(dòng)生成的 testNewFramwork.h 文件删窒。
注意: 刪除 系統(tǒng)自動(dòng)生成的 testNewFramwork.h 文件 會(huì)有一個(gè)警告
原因是項(xiàng)目需要一個(gè)和工程名同名的頭文件。
添加一個(gè)同名文件即可
3.引入 需要封裝到 Framwork 工程文件
因?yàn)?Framwork 工程是沒(méi)有自動(dòng)導(dǎo)入 系統(tǒng)的 UIKit.framwork 顺囊,我們Framwork里面是用到了UI控件的肌索,所以需要手動(dòng)導(dǎo)入 系統(tǒng)UI庫(kù)。否則 封裝完畢特碳,調(diào)用該庫(kù)的時(shí)候诚亚,里面的 UI控件是不可見(jiàn)的。
最后 工程目錄 如下:
4.配置 Framwork
(1).Build Active Architecture Only 設(shè)置為NO的意思是當(dāng)前打包的.framework支持所有的設(shè)備.否則打包時(shí)只能用當(dāng)前版本的模擬器或真機(jī)運(yùn)行.
(2).Build Setting 搜索linking 設(shè)置Dead Code Stripping 為NO是編譯選項(xiàng)優(yōu)化,包瘦身,(可不改) Mach-O Type 選中StaticLibrary (靜態(tài)庫(kù)) Xcode默認(rèn)是動(dòng)態(tài)庫(kù).
(3). 設(shè)置framework最低支持的版本.
(4). 將需要呈現(xiàn)給來(lái)的頭文件,直接從Project拖到Public中. 不想呈現(xiàn)出來(lái)的.h文件不建議拖到Private中. 放在project中即可
5.編譯 Framwork
進(jìn)行編譯之前應(yīng)該設(shè)置為release模式
6.真機(jī)版本和模擬器版本framework 合并
XCode12之前:
編譯模擬器靜態(tài)庫(kù)支持i386 x86_64兩架構(gòu)
編譯真機(jī)靜態(tài)庫(kù)支持armv7 arm64兩架構(gòu)
使用lipo -create -output命令可以將兩個(gè)庫(kù)合并成一個(gè)支持模擬器和真機(jī)i386 x86_64 armv7 arm64四種架構(gòu)的胖子庫(kù)午乓。
XCode12編譯的模擬器靜態(tài)庫(kù)也支持了arm64站宗,導(dǎo)致出現(xiàn)真機(jī)庫(kù)和模擬器庫(kù)不能合并的問(wèn)題。
have the same architectures (arm64) and can't be in the same fat output file
模擬器編譯時(shí)候:
設(shè)置Build Setting --> Excluded Architectures --> Release --> 添加上 arm64
來(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)的缤底。
內(nèi)部分為Debug版本和Release版本,同時(shí)兩者有分為真機(jī)版本和模擬器版本framework(iphoneos后綴代表真機(jī)版本橙依,iphonesimulator后綴代表模擬器)
(1).查看架構(gòu)信息
打開(kāi)終端使用命令行 lipo -info 查看framework架構(gòu)信息
終端 命令行 lipo -info 空格 framework 地址
真機(jī)版本
模擬器版本
(2).合并真機(jī)模擬器版本
因?yàn)橐陨汐@取的framework只能在對(duì)應(yīng)的版本上運(yùn)行(即真機(jī)只能在設(shè)備上運(yùn)行模擬器版本只能在模擬器上面運(yùn)行使用)所以需要合并為通用版本
命令行語(yǔ)句:sudo lipo -create 空格 (此處請(qǐng)?zhí)顚?xiě)真機(jī)testNewFramework文件路徑) 空格 (此處填寫(xiě)模擬器testNewFramework文件路徑) 空格 -output 空格 自定義合成文件存儲(chǔ)路徑(合成文件的名字testNewFramework)
查看合成的testNewFramework架構(gòu)信息
替換
小知識(shí)點(diǎn) :
為啥要合并 枣接,架構(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 完成。
Framework接入主程序
1.拖入主程序
2.引入Framework修壕,否則取不到Framework的圖片等資源
TARGETS —> Build Phases
主程序 創(chuàng)建個(gè)導(dǎo)航控制器 然后點(diǎn)擊ViewController 跳轉(zhuǎn)到 Framework 中的 View1Controller 視圖控制器
外部--主程序 --調(diào)用Framework中的資源
至此 使用 Framework 完成愈捅。
END.