最近公司需要寫(xiě)自己的framework,從未接觸過(guò)的我頓時(shí)頭腦一片空白,想想還不是要做。那就開(kāi)工吧。到處查資料,跳過(guò)了度娘,直沖google,找到的都是一篇篇的長(zhǎng)篇大論,突然覺(jué)得我餓了。還是先不說(shuō)這些打擊士氣了。早早寫(xiě)完吃飯飯去。
1.新建一個(gè)framework-->Next-->命名為XMSDK-->保存

2.添加一個(gè)類(lèi),用于測(cè)試


3.將你要暴露到外面的文件,也就是讓調(diào)用的文件放倒public里面,右鍵Move to public Group即可。

4.在framework創(chuàng)建時(shí)默認(rèn)建立的頭文件里導(dǎo)入外部需要用的文件

5.在模擬器和真機(jī)下分別build。XMSDK.framework會(huì)由紅變黑。

6.由于真機(jī)和模擬器分別會(huì)生成不同的framework,so,在開(kāi)發(fā)工程中最好是將其合并。先穿插講一下合并方法:
對(duì)XMSDK.framework文件 ?show in Finder,找到其路徑

然后打開(kāi)終端,運(yùn)行如下命令行。
7、lipo -create真機(jī)framework路徑/XMSDK 模擬器framework路徑/XMSDK -output XMSDK

然后可以用 lipo -info Test2SDK 查看指令集
8、前往~/(home文件、根目錄)找到XMSDK,然后替換掉真機(jī)和模擬器里面的這個(gè)文件


9.最后將framework拖入到工程中使用

10.導(dǎo)入framework后,使用里面的類(lèi)及其方法,按道理來(lái)說(shuō)已經(jīng)ok了,但各位到這里終于快好了,準(zhǔn)備run時(shí)發(fā)現(xiàn)問(wèn)題一大堆。但我是很負(fù)責(zé)的啦。咱接著往下看!

11.可能出現(xiàn)的錯(cuò)誤有這兩種:
(1).真機(jī)運(yùn)行錯(cuò)誤

解決方案:在XMTest-->General-->Embedded Binaries-->添加我們的XMSDK.framework庫(kù)

再次運(yùn)行看看,ok,真機(jī)問(wèn)題解決。

(2).模擬器錯(cuò)誤(注意:模擬器運(yùn)行時(shí)也需要先走(1)這一步)
模擬器錯(cuò)誤分兩種情況:(個(gè)人目前只遇到了這兩種情況,有不同的望分享哈)
第一種是iphone5c及其以前的版本,報(bào)Undefined symbols for architecture i386錯(cuò)誤

第二種是iphone5s及其以后的版本,報(bào)Undefined symbols for architecture x86_64錯(cuò)誤

以上兩種錯(cuò)誤,不難看出都是處理器指令集的問(wèn)題,所以解決辦法都是一樣的。還記得前面的7/8/9這三個(gè)步驟嗎,不記得就鼠標(biāo)滾動(dòng)起來(lái)。沒(méi)錯(cuò),同樣的步驟,再走兩遍。分別把模擬器選擇iphone5/iphone5s,build生成相對(duì)應(yīng)的framework,同樣合并真機(jī)的framework。把最后一次的framework添加到項(xiàng)目中。(其實(shí)這里我在想咱們第一次合并的時(shí)候就直接把這兩種情況考慮了,然后直接生成同時(shí)支持i386 x86_64 armv7 arm64的。這樣是不是會(huì)方便點(diǎn),有待各位去嘗試。嘿嘿)
ok,我已完成這一步,所以效果也出來(lái)了。模擬器也不報(bào)錯(cuò)啦。

12.基本的framework這就完成了,以后就可以直接在XMSDK.framework里面添加?xùn)|西了。在此也在提醒一下,如果framework里面有分類(lèi),那么使用的時(shí)候還會(huì)報(bào)錯(cuò),報(bào)其找不到相應(yīng)的方法。沒(méi)事,我已經(jīng)找到解決辦法啦。如下操作:
Build Settings --> Linking->Other Linker Flags 中加上 -ObjC 或者-all_load 。
它的作用就是將靜態(tài)庫(kù)中所有的和對(duì)象相關(guān)的文件都加載進(jìn)來(lái),不過(guò)在64位的Mac系統(tǒng)或者iOS系統(tǒng)下,鏈接器有一個(gè)bug,會(huì)導(dǎo)致只包含有類(lèi)別的靜態(tài)庫(kù)無(wú)法使用-ObjC標(biāo)志來(lái)加載文件。變通方法是使用-all_load 或者-force_load標(biāo)志,它們的作用都是加載靜態(tài)庫(kù)中所有文件,不過(guò)-all_load作用于所有的庫(kù),而-force_load后面必須要指定具體的文件。
好了。大家應(yīng)該都能看懂吧,如果能幫到你那就給我來(lái)個(gè)贊吧,??。已經(jīng)餓得沒(méi)力氣了。好吃好喝的各位帥哥美女砸過(guò)來(lái)吧。我接著。