通過將自己的控制元件封裝成framework靜態庫來使用,可以在不暴露程式碼的所有實現細節的前提下和他人分享控制元件.另外通過自己封裝的過程也可以對日常使用他人的庫有更多的瞭解, 或者在實現模組化的時候可以把固定的業務模組化成靜態庫.
framework靜態庫建立
在iOS中,靜態庫有兩種:
.a
:一個純二進位制檔案,需要有.h檔案配合使用
.framework
:包含二進位制檔案和.h檔案,還有資原始檔
在xcode中,我們可以在已有控制元件專案中通過新增新的targets來建立靜態庫,第一個是建立.framework,第二個是建立.a
這裡我們需要把Mach-O type改為Static Library
,因為製作的是一個靜態庫
把Build Settings -> Architectures -> Build Active Architecture Only -> Release 選擇NO,Yes表示只編譯選中模擬器裝置對應的架構,No則為編譯所有模擬器裝置支援的cup架構(Debug版本同理,提供給他人是使用時,建議Debug也選中NO)
建立後會生成一個專案,這裡的.h要放我們專案中需要暴露給他人呼叫的標頭檔案,主要需要使用<包名/標頭檔案名.h>,因為在實際使用framework的時候是需要從保重搜尋標頭檔案的.
在.h中import後,還需要在Build Phases - Headers
中把對應的標頭檔案放到Public
中
我們在測試新增的檔案中寫一個log方法
選擇模擬器進行編譯,然後在Products
中找到framework右擊檢視Show In Finder
其中Debug-ophonesimulator中的包就是在debug模式下模擬器可以執行的.framework包,對應的還有relese模式的模擬器包和真機包,我們要做的就是講relese下的模擬器和真機進行合併,因為我們通常使用的framework包都是一個.
合併兩種型別的framework
這裡有兩種方法,一種是通過指令碼操作,另一種是通過
lipo
命令列操作,這裡介紹第二種
lipo源於mac系統要製作相容powerpc平臺和intel平臺的程式.是一個在MacOSX中處理通用程式的工具.常用方法有下面3種:
- 檢視靜態庫支援的CPU架構
lipo -info libname.a(或者libname.framework/libname)
複製程式碼
- 合併靜態庫
lipo -create 靜態庫存放路徑1 靜態庫存放路徑2 ... -output 整合後存放的路徑
複製程式碼
對framework只需要合併.a檔案就可以
- 靜態庫拆分
lipo 靜態庫原始檔路徑 -thin CPU架構名稱 -output 拆分後檔案存放路徑
複製程式碼
將合併後的.a檔案替換原本包中的.a,至此,一個簡單的framework包就完成了
framework靜態庫新增.bundle檔案資源
當framework中需要依賴一些圖片資源等,可以做一個bundle存放圖片資源,然後在Copy Bundle Resources
中新增依賴
新建一個bundle的targets
設定
-
Build Settings修改Base SDK->Latest iOS
-
Build Phases將需要的xib,圖片資源新增到Copy Bundle Resources
-
Combine High Resolution Artwork 或 COMBINE_HIDPI_IMAGES 這兩項一個是OSX下的名字,一個是iOS下的名字,改為NO才可以存圖片,不然存進去是tiff 然後build就會生成需要bundle檔案
新增圖片到bundle
新增依賴
這樣就可以在framework中引用這些圖片資源
framework包對於其他一些第三方庫的依賴
在實際應用中,我們的framework包往往會依賴一些第三方的庫,比如常見的AFNetworking,SDWebimage等,這些庫往往主工程是包含的,如果在framework中再新增,就會引起類重複的衝突.一般有兩種處理方法
- 修改引用庫中所有類的類名,新增上我們自己的類頭
這種方法對於小一些或者說類少一些的庫來說比較合適
- 新增這些庫的時候只引用
我們可以在新增庫的時候只引用,然後在framework中引用對應的標頭檔案,這樣可以保證build succeeded
編譯成功,而且framework中不會打包進去對應的類檔案.
但是已經有了依賴,就需要在主工程中新增對應的庫,這裡要注意的是,如果作為SDK給第三方使用,要確定framework中依賴庫的版本,因為有些庫版本改變可能引起對應檔案的不同.比如AFNetworking的2.x
版本和3.x
版本之間
不要勾選Add To Terget
Demo
自己寫了一個關於alertView控制元件的demo,放到了github上,地址點這裡
希望大家可以指出在文章中的問題,共同學習