一、創建framework項目
- 創建framework工程要選擇iOS --> Cocoa Touch Framework
- 輸入項目名稱HawkeyeSDK也是編譯生成的framework的名稱。
- framework的名稱也可以以后在項目中更改
二、編輯framework代碼
創建完framework工程之后,就可開始在framework項目中添加要封裝進framework中的代碼實現。將已經寫好的代碼拖到framework項目的代碼根目錄HawkeyeSDK
下。
三、配置framework
1. Build Settings 配置
Product Name
: 最終編譯出來的Framework文件的名稱Mach_O Type
: 選中static Library(靜態庫)Architectures
:支持的CPU指令集,新增armv7s指令集來支持iPhone 5CBuild Active Architecture Only
: 設置為NOBase SDK
: 設置成當前Xcode最新版本iOS Deployment target
:framework支持的最低iOS版本
2. Build Phases 配置
- 在
Link Binary With Libraries
中添加項目的依賴庫Compile Sources
:framework 中包含的實現代碼Copy Bundle Resources
:項目中使用到的資源文件,圖片,XIB文件,plist文件等 (建議將資源文件放到新建的Bundle中,下面會介紹Bundle的創建和使用)headers
:將需要暴露出來的頭文件添加到public分組下,需要隱藏的頭文件添加到project分組下
四、創建Bundle
在封裝framework時,如果使用到了圖片,XIB,Html等不需要編譯的資源文件的時候,將資源文件打包到Bundle中是最好的選擇。下面介紹一下將資源文件打包成Bundle的兩個方法
方法一
- 選中項目 -> 在Targets 中點擊左下角的“+”按鈕 -> macOS -> Bundle
- 輸入Bundle的名稱,不要與framework的名稱重名(Bundle名稱可以在Build settings中更改),否則會創建失敗。
- 將Framework中用到的資源文件拖入到Bundle的
Copy Bundle Resources
中
將資源文件拖入Bundle的Copy Bundle Resources
之后,就算完成一個Bundle的基本創建。下面還要做一些別的設置
更改Bundle的名稱:一般我們打包出來的Bundle都與framework名稱相同,在剛開始創建Bundle的時候為了不與framework的名稱沖突,Bundle的名字并不與Framework的名稱相同,那么接下來可以在Bundle的Build Settings中更改Bundle名
- 在Targets中選中
HawkeyeSDKResources
->Build Settings
- 在搜索框中搜索
Product Name
。更改Product Name
后面的內容為你想要的名稱- 搜索
hidpi
將,COMBINE_HIDPI_IMAGES
或Combine High Resolution Artwork
改為NO
。如果為YES,那么在最終打包的Bundle中,@2x和@3x不同分辨率的圖片會被合成成tiff格式 。導致使用圖片名稱無法訪問- 搜索
Enable Bitcode
如果能搜索到這一項那么就把其值設置為NO。Bundle是不能使用Bitcode的
將HawkeyeSDKResources
target添為到HawkeyeSDK
的依賴,這樣在每次編譯HawkeyeSDK
的時候也會同時打包HawkeyeSDKResources
。而不用每次添加添加資源文件的時候單獨處理HawkeyeSDKResources
。
- 在targets中選中
HawkeyeSDK
- 選擇
Build Phases
- 展開
Target Dependencies
- 點擊 " + "
- 選中
HawkeyeSDKResources
- 點擊 add按鈕
Bundle中的圖片
方法二
bundle其實就是相當于一個后綴為.bundle的文件夾。所以,可以創建一個文件夾,然后將后綴修改為.bundle ,然后再將我們使用到的圖片復制到文件夾中。
注意:包含xib文件的bundle是不能使用這種方法的。因為xib文件需要處理成nib文件才能被程序使用。有xib文件的bundle要使用第一種方法創建。
五、使用Bundle
在framework中使用bundle中的資源不能直接通過資源的名稱來獲取。
[UIImage imageNamed:@"logo.png"];
這種方法獲取不到logo.png圖片。
正確的方式是:先獲取到bundle的路徑,然后再將資源文件的路徑拼接到bundle路徑后面才能獲取到資源。如下
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"HawkeyeSDK.bundle" ofType:@"bundle"];
NSString *imagePath = [bundlePath stringByAppendingString:@"/logo.png"];
UIImage *image = [UIImage imageNamed:imagePath];
六、編譯項目
編譯生成framework靜態庫之前先將framework對應的scheme中的run 的值改成 Release
編譯真機項目
- 在設備列表中選中Generic Device
- 使用快捷鍵 CMD + B 編譯項目
編譯模擬器項目
- 在設備列表中選擇一個模擬器
- 使用快捷鍵 CMD + B 編譯項目
之后會看到在products 分組下的HawkeyeSDK.framework變成黑色。
選中HawkeyeSDK.framework右鍵,選擇Open In Finder 可以看到編譯好的兩個bundle文件。
七、合成模擬器和真機通用的framework靜態庫
之前編譯生成的兩個靜態庫分別支持模擬器和真機的使用。但是在實際開發中需要即支持模擬器又支持真機使用的靜態庫怎么辦?這個問題當然可以解決,那就是將兩個靜態庫合并生成一個通用的靜態庫。可以在mac終端中使用下面的命令合成
lipo -create path1/HawkeyeSDK.bundle/HawkeyeSDK path2/HawkeyeSDK.bundle/HawkeyeSDK -output path3/HawkeyeSDK
path1和path2分別是模擬器和真機的靜態庫的路徑。path3是合成之后的文件的存放路徑。
八、framework 的使用
將framework拖入到要使用framework的工程,并在項目的
Build Phases
的Link Binary Resources
中添加framework。framework使用到的Bundle要添加到工程的
Copy Bundle Resources
中。不然項目是找不到Bundle中的資源文件的,那么Bundle也就無法正常使用資源文件。如果framework中使用到了Category 那么在使用framework的工程中要設置
Build Settings
中的Other Link Flag
為-ObjC
或者-all_load
如果framework有使用系統庫,那么也要在使用framework的工程中將這些系統庫添加到工程中。不然會報編譯錯誤