簡述iOS開發framework製作與使用
前言
- 我的第一次,請多多指教!目的是給予有需要的朋友以及方便自己日後的查閱。
iOS開發庫檔案的分類
靜態庫:
- 靜態庫有 .a 和 .framework 兩種形式;
- 在程式編譯時會被連結到目的碼中,程式執行時將不再需要改靜態庫。
動態庫:
- .dylib 和 .framework 形式,後來.dylib動態庫又被蘋果替換成.tbd的形式;
- 在程式編譯時並不會被連結到目的碼中,只是在程式執行時才被載入,因為在程式執行期間還需要動態庫的存在。
結論
- 同一個靜態庫在不同程式中使用時,每一個程式中都得匯入一次,打包時也被打包進去,形成一個程式;
- 而動態庫在不同程式中,打包時並沒有被打包進去,只在程式執行使用時,才連結載入(如系統的框架如 UIKit、Foundation 等),所以程式體積會小很多,但是蘋果不讓使用自己的動態庫,否則稽核就無法通過(為什麼不讓使用本人不是很清楚,還請大神普及)。
framework 製作過程
1. 首先新建一個專案,選擇 Cocoa touch Framework :

2. 然後隨便取一個名字 MyFramework_Create:

3. 然後根據不能的業務需求寫好自己的程式碼,這裡因為是測試,我隨便寫點,新建一個 Dog 類,然後公開一個方法並隨便 log 一點東西:

4. 工程配置:
-
4.1 選擇工程檔案 > target 第一項 > Build Setting > 搜尋 linking,然後幾個需要設定的選項都顯現出來,首先是 Dead Code Stripping 設定為 NO,網上對此項的解釋如下,意思是如果開啟此項就會對程式碼中的 " dead ”、" unreachable ” 的程式碼過濾,不過這個開關是否關閉,似乎沒有多大影響,不過為了完整還原 framework 中的程式碼,將此項關閉也未曾不可。
- The resulting executable will not include any “dead” or unreachable code.
4.2 然後將Link With Standard Libraries關閉,我想可能是為了避免重複連結:
-
4.3 最後將 Mach-O Type 設為 Static Library,framework 可以是動態庫也可以是靜態庫,對於系統的framework 是動態庫,而使用者製作的 framework 只能是靜態庫.
工程配置
5. 標頭檔案的設定:將需要公開的標頭檔案從 Project 中拖入 Public,至於是否需要將私有的標頭檔案拖入Private,我覺得直接放在 Project 中即可,若是 Private 中有標頭檔案,打包以後的 framework 中會多出一個Private 的資料夾包含著放入 Private 的標頭檔案,不過我覺得如果是私有最好還是不要讓別人看到。以下有三種設定方法,設定前需要在 .h 檔案匯入:

-
5.1 在 target 下找到 Build Phases, 點開 Headers 看到 Project 下面的檔案直接右鍵就可以看到一些選項,選擇你所需 Public 的即可。
標頭檔案的設定1 -
5.2 在上面的 Headers 介面的時候直接將 Project 下面的檔案拖到 Public 下面即可。
標頭檔案的設定2 -
5.3 選中 Dog.h 檔案,在 Xcode 右邊找到 Target Memership 右下角的(注意不是 Xcode 整個介面右下角)上下箭頭,那裡就有你想要的:
標頭檔案的設定3
6. iPhone 5 和 iPhone 5c 特殊機型架構的支援配置
-
選中 Build Settings > Architectures > 單擊該選項的右邊 > other > armv7s ,即可
特殊機型架構的支援配置1特殊機型架構的支援配置2
7. 編譯生成 .framework 檔案
- 7.1 先選擇Generic iOS Device,按下 Command+B:Build 一下:

- 7.2 然後隨意選擇一個模擬器再次 Build 一下:

8. 合併真機與模擬器生成 .framework 檔案:
- 8.1 Show in Finder 找到 Build 後的 framework

- 8.2 我們看到總共有兩個資料夾,上面是真機編譯生成的檔案,下面是模擬器編譯生成的檔案。

- 8.3 我們在 Products 同級目錄下(路徑可以任意選)新建一個 名為 MyFramework_Create 的資料夾作為輸出路徑,這裡取名要與專案名一致,至於為什麼到後面自己會明白的。

-
8.4 使用命令列合併:lipo -create + 上面兩個檔案的路徑(是指真機與模擬器MyFramework_Create.framework 目錄下的 MyFramework_Create檔案) + -output + 合成後檔案的輸出路徑。 最後回車即可。
命令列合併 -
8.5 將生成的 MyFramework_Test.lipo 檔案刪除字尾名並代替真機下的 MyFramework_Test 檔案就完成了。
代替MyFramework_Create
framework的測試
1. 新建名為 MyFramework_Test 的工程,注意選擇的是 Single View Application :




2. 將所需要的標頭檔案匯入工程,新建一個 dog 物件,並呼叫 doSmothing 方法,檢視控制檯的輸出,現在已經成功匯入測試完成:

經典報錯
1. 缺少相關標頭檔案的路徑,在有些部落格上看到說在測試之前就要匯入 framework 的 Headers 的路徑,發現這不完全正確,在我的經驗中如果 framework 中引入了第三方不匯入會報錯,沒有引用的就沒有報錯,所以個人認為還是看情況,如果執行起來報錯說找不到標頭檔案的話,那再做相關配置也無妨,配置方法如下:


2. 缺少相關裝置架構,報錯如下:

- 2.1 庫中缺少了i386架構的檔案,這時我就比較困惑了,明明將模擬器生成的庫檔案合併進來了,怎麼在模擬器上編不通呢!用 lipo -info 命令檢視一下,果然沒有i386架構的檔案


-
2.2 重新選擇 iPhone 5 模擬器與 iPhone 7 模擬器兩者執行生成的 .framework 檔案合併後與真機生成的 .framework 檔案再次合併檢視資訊,果然有了
架構後 -
2.3 架構總結:
- 對於模擬器來說 4s 和5的模架構是 i386 的32位架構,5s 至今是 x86_64 的64位架構。對於真機來說 3GS~4s 是 armv7 架構,5 和 5c 是 armv7s 架構,5s 至今是 arm64 架構。
3. 將下圖中的選項設為 YES,導致其編譯時只生成當前機器的框架,將其設定為 NO 後,發現用模擬器編譯後生成的 framework 同時包含 x86_64 和 i386 架構。

4. 在專案中引入靜態庫後,archive 的時候會出現錯誤

-
解決辦法:
MacDown logo - Bitcode 是蘋果在 Xcode7 及以後推出的新功能。用於程式碼的二次編譯,針對 CPU 進行優化,編譯工作由蘋果 AppStore 後臺來完成。針對 iOS 是可選項,預設開啟。watchOS 和 tvOS 是必選項,所以需要開啟庫工程的此選項並加上 -fembed-bitcode 引數,重新編譯。
相關文章
- IOS開發 製作簡單的計算器iOS
- Web 開發中 Blob 與 FileAPI 使用簡述WebAPI
- API介面開發簡述示例API
- iOS 封裝.framework 以及使用iOS封裝Framework
- 簡述grub啟動載入程式和製作kickstart檔案
- 使用 VuePress 製作線上簡歷Vue
- iOS開發-UITabbarController的介紹與使用iOSUItabBarController
- Flutter的繪製流程簡述Flutter
- 《跳跳小子》開發日誌:製作思路與想法
- docker 製作與使用 arcgisserver 映象DockerServer
- ios開發分析:CocoaPods私有庫建立與使用iOS
- iOS開發-WKWebView的介紹與基本使用iOSWebView
- iOS開發- UILabel的基本介紹與使用iOSUI
- 排程器Quartz的簡述與使用總結quartz
- java併發簡述Java
- Lottie Android 動畫製作與使用Android動畫
- 28_庫的製作與使用
- 《聖女戰旗》發售一週年,製作組講述遊戲開發的幕後故事遊戲開發
- iOS面試題:簡述效能最佳化iOS面試題
- 在Linux下製作一個簡單的給ARM開發板使用的檔案系統Linux
- IOS使用Launch Screen.storyboard製作廣告啟動介面iOS
- RNN與LSTM網路簡述RNN
- iOS開發-列表檢視的基本介紹與使用iOS
- iOS開發筆記之Xcode9.2下SDK開發-生成Framework的圖解流程iOS筆記XCodeFramework圖解
- 每日一問:簡述 View 的繪製流程View
- 簡述 Laravel Model Events 的使用Laravel
- 如何開發APP:使用免費無程式碼製作APP工具APP
- 玩轉 iOS 開發:Aggregate 指令碼版本《模擬器與真機靜態 Framework 合成教程》iOS指令碼Framework
- js與ios橋接使用WebViewJavascriptBridge簡單理解JSiOS橋接WebViewJavaScript
- IOS的Bundle資源束製作iOS
- Flutter動畫之Flare的製作與使用Flutter動畫
- 小程式開發製作公司哪家好
- 以太橙系統模式開發製作模式
- Creating your first iOS FrameworkiOSFramework
- iOS開發之XLForm的使用iOSORM
- iOS8 Framework使用載入xib及圖片iOSFramework
- iOS-控制元件封裝為framework來使用iOS控制元件封裝Framework
- 簡述Kubernetes Secret有哪些使用方式
- Docker的容器使用方式簡述Docker