iOS 中靜態庫的創建

本文主要說明.framework的創建與使用

iOS 中靜態庫簡單介紹

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

2、靜態庫和動態庫都包含framework是因為,系統的framework是動態的,我們自己建立的.framework是靜態的;

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

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

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

? ?所以一般建議用 .framework

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


開始創建 .framework

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

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

3、配置庫庫屬性

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

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

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

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

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

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

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

首先介紹一下屬性:

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

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

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

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

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

介紹完之后那我們把我建好的類拖入到對應的當中去

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

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

5、運行,生成.framework

我們先來看下我們創建的framework,依然還是紅色,是因為現在還找不到這個庫

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

看,黑了吧,說明已經有了,選中它,鼠標右鍵,Show in Finder

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

再解釋一下為什么command+B

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

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

framework導入新的項目進行測試

直接導入庫的.h文件,然后調用NSLog靜態方法。

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

引入xib文件到framework

1、創建一個叫 Resource.bundle的靜態庫資源文件

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 也增加了新的內容,所以要從新command+B,這樣把.MyFramework 和 Resource.bundle 同時導出放到之前的測試項目里面。讓我們看下效果:

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

加入圖片到靜態資源文件

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

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

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

看,現在是不是多了一個圖片~~

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


現在準備就緒,只需要 command+B 一下 Resource,然后導出替換測試項目里面的Resource.bundle,運行看下效果:


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

至此,靜態庫創建以及一些代碼思路已經全部搞定,庫以及資源文件根據你的需求可以加上任意東西,大家有沒有想要試一試的沖動啊!!!

如有不足,歡迎大家指出,共同進步。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容