iOS-控制元件封裝為framework來使用

semperhhh發表於2018-12-07

通過將自己的控制元件封裝成framework靜態庫來使用,可以在不暴露程式碼的所有實現細節的前提下和他人分享控制元件.另外通過自己封裝的過程也可以對日常使用他人的庫有更多的瞭解, 或者在實現模組化的時候可以把固定的業務模組化成靜態庫.

framework靜態庫建立

在iOS中,靜態庫有兩種: .a:一個純二進位制檔案,需要有.h檔案配合使用 .framework:包含二進位制檔案和.h檔案,還有資原始檔

iOS-控制元件封裝為framework來使用 在xcode中,我們可以在已有控制元件專案中通過新增新的targets來建立靜態庫,第一個是建立.framework,第二個是建立.a

iOS-控制元件封裝為framework來使用 這裡我們需要把Mach-O type改為Static Library,因為製作的是一個靜態庫

iOS-控制元件封裝為framework來使用 把Build Settings -> Architectures -> Build Active Architecture Only -> Release 選擇NO,Yes表示只編譯選中模擬器裝置對應的架構,No則為編譯所有模擬器裝置支援的cup架構(Debug版本同理,提供給他人是使用時,建議Debug也選中NO)

iOS-控制元件封裝為framework來使用 建立後會生成一個專案,這裡的.h要放我們專案中需要暴露給他人呼叫的標頭檔案,主要需要使用<包名/標頭檔案名.h>,因為在實際使用framework的時候是需要從保重搜尋標頭檔案的.

iOS-控制元件封裝為framework來使用 在.h中import後,還需要在Build Phases - Headers中把對應的標頭檔案放到Public

我們在測試新增的檔案中寫一個log方法

iOS-控制元件封裝為framework來使用

選擇模擬器進行編譯,然後在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 iOS-控制元件封裝為framework來使用

設定

  • 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 iOS-控制元件封裝為framework來使用

新增依賴 iOS-控制元件封裝為framework來使用

這樣就可以在framework中引用這些圖片資源

framework包對於其他一些第三方庫的依賴

在實際應用中,我們的framework包往往會依賴一些第三方的庫,比如常見的AFNetworking,SDWebimage等,這些庫往往主工程是包含的,如果在framework中再新增,就會引起類重複的衝突.一般有兩種處理方法

  • 修改引用庫中所有類的類名,新增上我們自己的類頭

這種方法對於小一些或者說類少一些的庫來說比較合適

  • 新增這些庫的時候只引用

我們可以在新增庫的時候只引用,然後在framework中引用對應的標頭檔案,這樣可以保證build succeeded編譯成功,而且framework中不會打包進去對應的類檔案. 但是已經有了依賴,就需要在主工程中新增對應的庫,這裡要注意的是,如果作為SDK給第三方使用,要確定framework中依賴庫的版本,因為有些庫版本改變可能引起對應檔案的不同.比如AFNetworking的2.x版本和3.x版本之間

iOS-控制元件封裝為framework來使用

不要勾選Add To Terget

Demo

自己寫了一個關於alertView控制元件的demo,放到了github上,地址點這裡

希望大家可以指出在文章中的問題,共同學習

相關文章