1.首先新建一個(gè)項(xiàng)目携添,選擇Cocoa touch Framework
2.然后隨便取一個(gè)名字
3.然后將要封裝成framework的代碼拖入工程
4.選擇工程文件>target第一項(xiàng)>Build Setting>搜索linking誊册,然后幾個(gè)需要設(shè)置的選項(xiàng)都顯現(xiàn)出來(lái)剩愧,首先是Dead Code Stripping設(shè)置為NO图柏,網(wǎng)上對(duì)此項(xiàng)的解釋如下刻蟹,大致意思是如果開(kāi)啟此項(xiàng)就會(huì)對(duì)代碼中的”dead”午衰、”unreachable”的代碼過(guò)濾割择,不過(guò)這個(gè)開(kāi)關(guān)是否關(guān)閉眷篇,似乎沒(méi)有多大影響,不過(guò)為了完整還原framework中的代碼荔泳,將此項(xiàng)關(guān)閉也未曾不可蕉饼。
The resulting executable will not include any “dead” or unreachable code
然后將Link With Standard Libraries關(guān)閉,我想可能是為了避免重復(fù)鏈接
最后將Mach-O Type設(shè)為Static Library玛歌,framework可以是動(dòng)態(tài)庫(kù)也可以是靜態(tài)庫(kù)椎椰,對(duì)于系統(tǒng)的framework是動(dòng)態(tài)庫(kù),而用戶制作的framework只能是靜態(tài)庫(kù)沾鳄。
5.然后將需要公開(kāi)的頭文件從Project中拖入Public慨飘,至于是否需要將私有的頭文件拖入Private,我覺(jué)得直接放在Project中即可,若是Private中有頭文件瓤的,打包以后的framework中會(huì)多出一個(gè)Private的文件夾包含著放入Private的頭文件休弃,不過(guò)我覺(jué)得如果是私有最好還是不要讓別人看到。
6.Build Settings ->Build Active Architecture Only設(shè)置為NO.?(圖中的選項(xiàng)如果設(shè)為YES圈膏,會(huì)導(dǎo)致其編譯時(shí)只生成當(dāng)前機(jī)器的框架塔猾;將其設(shè)置為NO后,發(fā)現(xiàn)用模擬器編譯后生成的framework同時(shí)包含x86_64和i386架構(gòu)稽坤。)
7.下面就開(kāi)始編譯了丈甸,先選擇Generic iOS Device,按下Command+B:Build一下的到的是支持真機(jī)的framework,然后隨意選擇一個(gè)模擬器再次Build一下得到支持模擬器的framework,找到Build后的framework
8.我們看到總共有兩個(gè)文件夾尿褪,上面是真機(jī)編譯生成的文件睦擂,下面是模擬器編譯生成的文件。
9.然后用命令行將下面兩個(gè)文件進(jìn)行合成(也可以單獨(dú)提供杖玲,不合并顿仇,合并了會(huì)導(dǎo)致包很大,各有優(yōu)缺點(diǎn)吧摆马,如果framework包不太大建議合并臼闻,否則還是提供兩個(gè))
將合成后的文件輸出,這里解釋一下這看似很復(fù)雜的命令:lipo -create+上面兩個(gè)文件的路徑 +-output+ 合成后文件的輸出路徑(直接使用模擬器或者真機(jī)的SDK的路徑即可囤采,不用再創(chuàng)建新的文件夾)
在開(kāi)發(fā)中述呐,導(dǎo)入一些靜態(tài)庫(kù)的時(shí)候經(jīng)常會(huì)要求我們?cè)贐uild Settings->Other Linker Flags設(shè)置-ObjC。
主要是因?yàn)镺C語(yǔ)言中類別(分類)蕉毯,Unix的標(biāo)準(zhǔn)靜態(tài)庫(kù)實(shí)現(xiàn)和Objective-C的動(dòng)態(tài)特性之間有一些沖突:OC沒(méi)有為每個(gè)函數(shù)(或者方法)定義鏈接符號(hào)市埋,它只為每個(gè)類創(chuàng)建鏈接符號(hào)。這樣當(dāng)在一個(gè)靜態(tài)庫(kù)中使用類別來(lái)擴(kuò)展已有類的時(shí)候恕刘,鏈接器不知道如何把類原有的方法和類別中的方法整合起來(lái)缤谎,就會(huì)導(dǎo)致你調(diào)用類別中的方法時(shí),出現(xiàn)錯(cuò)誤褐着。為了解決這個(gè)問(wèn)題坷澡,引入了-ObjC標(biāo)志,它的作用就是將靜態(tài)庫(kù)中所有的和對(duì)象相關(guān)的文件都加載進(jìn)來(lái)含蓉。
另外還有兩個(gè)方法频敛,分別是用來(lái)全部導(dǎo)入和部分導(dǎo)入。使用-all_load 或者-force_load標(biāo)志馅扣,它們的作用都是加載靜態(tài)庫(kù)中所有文件斟赚,不過(guò)all_load作用于所有的庫(kù),而-force_load后面必須要指定具體的文件差油。
11.如果framework內(nèi)部使用了圖片拗军,則需要建一個(gè)資源包文件夾任洞,并將改文件夾后綴名改為.bundle,然后將圖片放到這個(gè)文件夾中同framework一同提供給APP使用。
當(dāng)然在我們的framework里面加載本地圖片方法也有所變化发侵,示例代碼:
NSString *allPath = [[NSBundle mainBundle]pathForResource:name ofType:@"png"??? inDirectory:@"DFBankSDKResource.bundle"];
UIImage *image =? [UIImage imageWithContentsOfFile:allPath];
基礎(chǔ)概念和常用操作命令
靜態(tài)庫(kù): 鏈接時(shí)完整地拷貝至可執(zhí)行文件中交掏,被多次使用就有多份冗余拷貝。
動(dòng)態(tài)庫(kù):鏈接時(shí)不會(huì)拷貝至可執(zhí)行文件中刃鳄,運(yùn)行時(shí)動(dòng)態(tài)加載進(jìn)內(nèi)存盅弛,供程序調(diào)用,只加載一次叔锐,多個(gè)程序可以共用挪鹏。
1.設(shè)備的CPU架構(gòu)(指令集)
模擬器:
4s-5: i386
5s-6s Plus: x86_64
真機(jī)(iOS設(shè)備):
armv6: iPhone、iPhone 2愉烙、iPhone 3G讨盒、iPod Touch(第一代)、iPod Touch(第二代)
armv7: iPhone 3Gs齿梁、iPhone 4催植、iPhone 4s肮蛹、iPad勺择、iPad 2
armv7s: iPhone 5、iPhone 5c?
arm64: iPhone 5s伦忠、iPhone 6省核、iPhone 6 Plus、iPhone 6s昆码、iPhone 6s Plus气忠、iPad Air、iPad Air2赋咽、iPad mini2旧噪、iPad mini3...到現(xiàn)在
2.判斷framework或.a文件支持框架的命令:
查看framework
cd? /Users/.../xxxSDK.framework
lipo -info xxxSDK (不要加后綴)
---------------------------------------------------------------
查看.a
lipo -info? /Users/.../libXYPlatform.a
3.合并framework的命令:
lipo -create /Users/.../RKPlatform.framework/RKPlatform /Users/.../RKPlatform.framework/RKPlatform -output /Users/.../RKPlatform.framework/RKPlatform
前兩個(gè)是分別支持真機(jī)和模擬器的framework的路徑 -output后是合并后輸出可執(zhí)行文件的路徑
常見(jiàn)報(bào)錯(cuò)(待完善)
1.不支持當(dāng)前運(yùn)行設(shè)備的架構(gòu)類型
不支持當(dāng)前運(yùn)行設(shè)備的架構(gòu)類型報(bào)錯(cuò)圖示
2.APP項(xiàng)目和SDK項(xiàng)目中使用了同名文件
APP項(xiàng)目和SDK項(xiàng)目中使用了同名文件報(bào)錯(cuò)圖示
如何處理:詳細(xì)請(qǐng)查看 SDK開(kāi)發(fā)中如何解決sdk和app中都想使用某個(gè)第三發(fā)庫(kù)引發(fā)的沖突
3.通過(guò)lipo命令會(huì)發(fā)現(xiàn)真機(jī)版本值支持armv7 arm64這兩種架構(gòu),這意味著不支持armv7s架構(gòu)脓匿,即不支持iPhone 5 和5c(這兩個(gè)型號(hào)手機(jī)市場(chǎng)占有率應(yīng)該很低),如何解決這個(gè)問(wèn)題來(lái)支持armv7s架構(gòu)淘钟。
答:默認(rèn)的Architectures竟然不包含armv7s.
想要生成的庫(kù)支持armv7s,把a(bǔ)rmv7s添加到Architectures中,重新生成Framework即可