iOS 中靜態(tài)庫的創(chuàng)建

本文主要說明.framework的創(chuàng)建與使用

iOS 中靜態(tài)庫簡單介紹

1、iOS 中靜態(tài)庫的形式可以分為.a 和.framework,動態(tài)庫形式分為.dylib和.framework;

2、靜態(tài)庫和動態(tài)庫都包含framework是因為,系統(tǒng)的framework是動態(tài)的,我們自己建立的.framework是靜態(tài)的;

3、.a是一個純二進(jìn)制文件,.framework中除了有二進(jìn)制文件之外還有資源文件;

? ? .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用;

? ? .a + .h + sourceFile = .framework

? ?所以一般建議用 .framework

4、 使用靜態(tài)庫可以方便共享代碼,便于合理使用;實現(xiàn)iOS程序的模塊化,可以把固定的業(yè)務(wù)模塊化成靜態(tài)庫;和別人分享你的代碼庫,但不想讓別人看到你代碼的實現(xiàn)。


開始創(chuàng)建 .framework

1、首先創(chuàng)建一個項目用于制作 .framework,點擊圖中加號按鈕

2、選擇framework(這個默認(rèn)是動態(tài)庫,我們需要在后邊配置改成靜態(tài))

3、配置庫庫屬性

Target: -> Build Settings ->? Architectures -> Build Active Architecture Only 全改成NO;

這個屬性是兼容全部設(shè)備,這個屬性設(shè)置為yes,是為了debug的時候編譯速度更快,它只編譯當(dāng)前的architecture版本,所以會報錯編譯不到文件,出錯("_OBJC_CLASS_$_xxxxxx", referenced from:)而設(shè)置為no時,會編譯所有的版本,這樣就解決編譯出錯的問題了。

設(shè)置這個兼容屬性的原因是:如果生成靜態(tài)庫的時候是選擇的ipad retain生成的,那么這個庫導(dǎo)出的時候只能在ipad retain的設(shè)備上運行,在別的設(shè)備上就會報錯,感興趣的可以試試哦!所以一定要設(shè)置設(shè)備兼容。

Target:在 Deployment 下,將 Targeted Device Family 改成? 1/2 ,根據(jù)自己的需要改。1代表iPhone,2代表iPad,1/2代表兼容iPhone和ipad,將 ?iOS Deployment Target ,改成 iOS 7.0,也就是說這個靜態(tài)庫支持7.0以上版本。

Target:在 Linking 下,將 Mac-O Type? 改為 Static Library(靜態(tài)庫)

4、給靜態(tài)庫添加文件 (.h .m 文件等)

我創(chuàng)建了一個MyViewController的類(帶xib文件,后期使用)

首先介紹一下屬性:

1:暫時沒用過,希望大神補充下。

2:程序文件放的地方:(*.m 、*.mm等),需要壓縮保護(hù)的代碼,只要放在這里的文件,都將被靜態(tài)庫壓縮。使用靜態(tài)庫的一方是無法看到源代碼的。

3:庫文件放的地方,比如把其他的靜態(tài)庫、動態(tài)庫壓縮到這里。

4:對外接口。主要就是這里,展開后,會看到第一行(Public),不用介紹了吧,看英文應(yīng)該就能猜到,何況這個單詞是程序中常用的單詞,公用嗎!,只要是放到這里的文件,都將會暴露給使用方,建議把所有的*.h文件放到這里。

5:資源文件放的地方,圖片、音視頻、xib、Images.xcassets、甚至是Main.storyboard(故事板);只要放到這里,都將被壓縮,使用方是無法編譯或者看到源代的。

介紹完之后那我們把我建好的類拖入到對應(yīng)的當(dāng)中去

這里面其中 MyFramework.h是創(chuàng)建庫的時候自動生成的,MyViewController.h是我自己創(chuàng)建的,我們可以把自己創(chuàng)建的MyViewController類import到自動生成的MyFramework.h文件,這樣的話如果在別的項目用到的,我們只需要導(dǎo)入MyFramework.h就可以了。

MyViewController類寫了一個簡單的輸出方法,當(dāng)然如果要外部調(diào)用,不管是靜態(tài)方法還是動態(tài)方法都需要在.h文件聲明哦,最好加上一些注釋,這樣用的人直接看.h文件就知道什么用處了。

5、運行,生成.framework

我們先來看下我們創(chuàng)建的framework,依然還是紅色,是因為現(xiàn)在還找不到這個庫

別急,讓我們command+B,當(dāng)然一定要選中當(dāng)前的庫哦,不要選項目名字

看,黑了吧,說明已經(jīng)有了,選中它,鼠標(biāo)右鍵,Show in Finder

看到了沒,首先這個是模擬器才能用的一個庫,是因為我們是選中的模擬器command+B的。

再解釋一下為什么command+B

framework(App圖標(biāo)樣式)是App 工程文件,選中這個運行(command+R 或command+B)意思是讓工程導(dǎo)出或者測試運行可發(fā)布的應(yīng)用程序(就是上線文件)。對應(yīng)功能就不一一介紹了。

MyFramework(Bundle圖標(biāo)樣式)是靜態(tài)庫。選中這個運行(只能運行command+B,不能運行command+R)意思是導(dǎo)出靜態(tài)庫,也就是自己的封裝代碼,用于共享給其他人。如果選中iOS Device運行(command+R),將會導(dǎo)出真機版本的靜態(tài)庫,如果選中iOS Simulator以下其他任何版本運行(command+R),將會導(dǎo)出模擬器的靜態(tài)庫版本。至于為什么這樣,是因為真機的iOS和Mac系統(tǒng)中的虛擬iOS目錄結(jié)構(gòu)是不一樣的,如果導(dǎo)錯了,編譯器會報錯,“找不到指定文件”;當(dāng)然這倆庫也可以合并為一個,既能真機用也能模擬器用,那就需要在終端用命令合并一下,不知道的百度一下就好了,這里不在贅述。

framework導(dǎo)入新的項目進(jìn)行測試

直接導(dǎo)入庫的.h文件,然后調(diào)用NSLog靜態(tài)方法。

看,成功了吧,有點小小的歡喜哈,咱們接著來~~

引入xib文件到framework

1、創(chuàng)建一個叫 Resource.bundle的靜態(tài)庫資源文件

2、配置屬性

Target:并選擇 Build Settings ->? Architectures -> Base SDK? 改為Latest iOS(iOS 9.3)

Target:在 Deployment 下,Target:將 iOS Deployment Target,改為 iOS 7.0

3、完善MyViewController類,加載xib文件

4、然后把xib文件拖入Bundle Resources

5、選中Resources,command+B

編譯成功之后,因為MyFramework 也增加了新的內(nèi)容,所以要從新command+B,這樣把.MyFramework 和 Resource.bundle 同時導(dǎo)出放到之前的測試項目里面。讓我們看下效果:

這樣就把我之前的xib文件顯示出來了,大家可以看下Resource.bundle 里面的東西

加入圖片到靜態(tài)資源文件

1、首先我要先改動一下xib文件,讓他加載一個imageview,怎么改變就不必上圖了,大家看效果就行啦

加入圖片之后,也需要把圖片像拖xib那樣拖入到 Bundle Resources?

拖入成功之后,選中Resource? 進(jìn)行command+B,然后同樣導(dǎo)出到之前的測試 項目,替換原來的即可。(因為現(xiàn)在只是改變的xib的東西,然后xib又包含在資源文件里面,所以只需要對Resource Resource)讓我們看下效果:

看,現(xiàn)在是不是多了一個圖片~~

如果你不想讓用你framework的人看到你的圖片怎么辦?好,那讓我們把圖片加入到工程里面的圖片管理器,直接把圖片管理器拖入到 Bundle Resources。


現(xiàn)在準(zhǔn)備就緒,只需要 command+B 一下 Resource,然后導(dǎo)出替換測試項目里面的Resource.bundle,運行看下效果:


現(xiàn)在大家可以看到之前放到資源管理里面的圖片已經(jīng)看不到啦,只是多了一個不明的文件:Assets.car。這個就是Images.xcassets管理,里邊所有的圖片都被封裝了,也就是說被Images.xcassets管理的圖片竟然也被加密保護(hù)了起來,別人也不會看到你的照片了!

至此,靜態(tài)庫創(chuàng)建以及一些代碼思路已經(jīng)全部搞定,庫以及資源文件根據(jù)你的需求可以加上任意東西,大家有沒有想要試一試的沖動?。。。?/p>

如有不足,歡迎大家指出,共同進(jìn)步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容