從上面我們可以看出.a 和.framework的區(qū)別就是.a+.h+soureFile=.framework闻丑,這樣的話,我們還是直接封裝個.framework比較好勋锤。
封裝framework步驟
1叁执、打開xcode矮冬,新建工程
這里我使用的是Xcode9验夯,選擇Cocoa Touch Framework熊户,然后點(diǎn)next该肴。
2滋恬、創(chuàng)建功能類或者拖入已有的功能類
這里我創(chuàng)建的是ShowResult類恢氯。
3勋拟、實(shí)現(xiàn)功能類的功能
.h文件中
.m文件中
4、更改Xcode項(xiàng)目配置
在TARGETS下選中工程>Build Setting>搜索linking苦银,然后幾個需要設(shè)置的選項(xiàng)都顯現(xiàn)出來幔虏。
1想括、首先是Dead Code Stripping設(shè)置為NO瑟蜈,網(wǎng)上對此項(xiàng)的解釋如下,大致意思是如果開啟此項(xiàng)就會對代碼中的”dead”焙格、”unreachable”的代碼過濾眷唉,不過這個開關(guān)是否關(guān)閉冬阳,似乎沒有多大影響肝陪,不過為了完整還原framework中的代碼氯窍,將此項(xiàng)關(guān)閉也未曾不可。
2狼讨、然后將Link With Standard Libraries關(guān)閉播聪,我想可能是為了避免重復(fù)鏈接
3离陶、最后將Mach-O Type設(shè)為Static Library招刨,framework可以是動態(tài)庫也可以是靜態(tài)庫术吝,對于系統(tǒng)的framework是動態(tài)庫沦寂,而用戶制作的framework只能是靜態(tài)庫淘衙。
5毯侦、增加armv7s
更改后:
設(shè)置Headers
將你要公開的頭文件拖至Public下侈离,要隱藏的放在Private或者Project下卦碾,當(dāng)然起宽,隱藏的頭文件就無法再被引用坯沪。
然后需要在FrameworkTest.h(必須是公開的叉弦,否則無法引用)中將你所有要公開的.h引入。
打包
打包有兩種方式 一種是手動打包,另一種是用腳本,這里我用手動打包的方式潘拱。
1芦岂、選中模擬器禽最,編譯程序command+B
2川无、選中測試機(jī)懦趋,編譯程序command+B
3仅叫、在finder中找到framework文件
找到下圖中的FrameworkTest文件诫咱,這里有兩個同名文件竟痰,一個是Debug-iphoneos(真機(jī))下的幻锁,一個是Debug-iphonesimulator(模擬器)下的假消。
4、通過終端命令將兩個framework合為一個模擬器和真機(jī)都可使用的framework岭接。
打開終端富拗,輸入lipo -create命令臼予,將
Debug-iphoneos下FrameworkTest.framework目錄下的FrameworkTest文件
拖拽到終端中,會自動有空格啃沪。然后將Debug-iphonesimulator下FrameworkTest.framework目錄下的FrameworkTest文件
拖拽進(jìn)來粘拾,也會自動有空格,然后輸入 -output创千,敲空格缰雇,在引入一個新的路徑。最后敲回車追驴,這樣就合并了暇咆。
上面這段命令就是把真機(jī)和模擬器中的FrameworkTest合并成一個新的文件放在和newTest同級的文件夾new下扯旷,這個新文件后綴是.lipo,并不是我們要的FrameworkTest文件惰瓜,怎么辦呢洲拇?我們的操作是按照人家說的把合成后的文件名字改成FrameworkTest替換原來的。而且蛾绎,把后綴.lipo去掉顽爹!然后將新生成的這個FrameworkTest替換原來的FrameworkTest。進(jìn)行下一步涉馅。
這里終端會有一個error
error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't move temporary file: /Users/lgj/Desktop/new/newTest to file: /Users/lgj/Desktop/new/newTest.lipo (Is a directory)
5朱灿、將修改后的framework拷貝出來就是我們最終制作的framework了。
使用
將我們封裝的framework拖拽到新的工程里面。
我們打開這個framework看看咏雌,發(fā)現(xiàn)只有Headers,里面有兩個.h房匆,其中一個是FrameworkTest.h另一個就是ShowResult.h文件。
引入頭文件:
運(yùn)行得到[ShowResult show];的結(jié)果
至此举户,完成framework的封裝和使用。
總結(jié)
1、在制作framework或者lib的時(shí)候,如果使用了category,則使用改FMWK的程序運(yùn)行時(shí)會crash泳桦,此時(shí)需要在該工程中 other linker flags添加兩個參數(shù) -ObjC -all_load梧奢。(這點(diǎn)沒有親測)
2鸟顺、帶有圖片資源的需要把圖片打包成Bundle文件,和framework一起拷貝到相應(yīng)的項(xiàng)目中。
3、公開的類中如果引用的private的類,打包以后對外會報(bào)錯,找不到那個private的類魂迄,可以把那個private的.h放到(也沒親測)
4湿酸、namespace 沖突铁坎。靜態(tài)庫用了某第三方庫犁苏,項(xiàng)目也用了同樣的第三方庫,在編譯的時(shí)候就會有 duplicate symbol 錯誤围详,因?yàn)橛袃煞萃瑯拥牡谌綆熳嫫痢=鉀Q辦法就是把用到的第三方庫加上自定義前綴袁勺,包括類名咐汞、delegate 協(xié)議、常量名掠手,尤其需要注意 Category 的方法名要修改混槐。
5揣苏、圖片等資源文件用 bundle 方式打包茫经。一個簡單制作 bundle 的方法:新建文件夾卸伞,重命名為 YourSDK.bundle,然后 Show Package Contents 打開锉屈,加入圖片荤傲。使用圖片的時(shí)候需要指明 bundle: [UIImage imageNamed:@"YourSDK.bundle/img.png"]。也可以用 Target 方式制作 bundle颈渊,比如 iOS Library With Resources