為什麼iOS專案應該用CocoaPods
為什麼iOS專案中應該使用CocoaPods作為第三方依賴管理工具?
目錄:
- 從一個bug說起
- 分析需求及解決方案
- 確定方案
- CocoaPods學習資料
</br>
一、從一個bug說起:
1、公司的專案裡統一使用SVG格式的圖片;
2、GitHub上只有一個star數超過一千的SVG解析庫,叫SVGKit。(對,就是這個坑爹的庫)
坑1: 這個庫一直使用非ARC,有100多個類;</a>
坑2: 這個庫還依賴另外一個庫CocoaLumberjack;
坑3: 把這個庫配置到專案中就會報一種錯誤:
3、公司的專案是直接以原始碼的形式使用的該庫。
結果就是 Build Phase 中成了這樣:
(我不知道當初加這些 -fno-objc-arc 標記的人是否崩潰,我光看著就覺得淡淡的憂桑:這麼多得加多久?加漏了或者多加了,都是坑。)
4、因為用的原始碼,專案裡的SVGKit版本很久都不會更新。導致在iPhone6S以上裝置時,由於舊版本的庫沒有適配6S,必崩。現在必須要更新到這個庫的最新版本。
二、解決方案的探索:
</br>
方案一:
用最新原始碼替換掉舊版原始碼檔案
問題:1、類檔案太多,麻煩,容易出錯;
2、還是會有大量的 -fno-objc-arc 標記,很煩;
結論:否決
</br>
方案二:
SVGKit作者推薦——靜態庫(該庫的GitHub頁面也只介紹了這一種用法)
問題:1、只有.h 標頭檔案,出錯沒法定位和修改。
2、靜態庫裡使用了category必須要加 -ObjC 標記。
3、靜態庫.a檔案需要區分device版本和simulator版本,或者合併後使用。
結論:否決
</br>
關於問題2這裡要解釋下,本來是沒什麼問題的,但我不幸遇到了這個坑:
1、靜態庫裡如果使用了 category,需要加 -ObjC 標記。否則在使用的時會崩潰:
2、當時花了好久沒解決這個問題的原因是,我記得自己設定了呀。
後來才想起來為毛還是崩,這是我們的專案target,你們感受下:
有任何一個target忘了設定,就又埋了個坑。
3、關於 為什麼要加 -ObjC 標記 的問題,以前是有查過資料的,這裡完全是因為target太多遺漏導致的。
筆記如下:
-ObjC 標記的作用:
> - 用到一個第三方庫,這個庫的使用嚮導裡面特別說明,在新增完該庫後,需要在Xcode的Build Settings下Other Linker Flags裡面加入-ObjC標誌。之所以使用該標誌,和Objective-C的一個重要特性:類別(category)有關。根據這裡的解釋,Unix的標準靜態庫實現和Objective-C的動態特性之間有一些衝突:Objective-C沒有為每個函式(或者方法)定義連結符號,它只為每個類建立連結符號。
- 這樣當在一個靜態庫中使用類別來擴充套件已有類的時候,連結器不知道如何把類原有的方法和類別中的方法整合起來,就會導致你呼叫類別中的方法時,出現"selector not recognized",也就是找不到方法定義的錯誤。
- 為了解決這個問題,引入了-ObjC標誌,它的作用就是將靜態庫中所有的和物件相關的檔案都載入進來。
- 本來這樣就可以解決問題了,不過在64位的Mac系統或者iOS系統下,連結器有一個bug,會導致只包含有類別的靜態庫無法使用-ObjC標誌來載入檔案。變通方法是使用-all_load 或者-force_load標誌,它們的作用都是載入靜態庫中所有檔案,不過all_load作用於所有的庫,而-force_load後面必須要指定具體的檔案。
</br>
方案三:
使用 CocoaPods **
問題:作者沒有說明這個庫是否支援CocoaPods**
這也是我最開始沒有考慮改用 CocoaPods 的原因)
-
這裡提示大家,可以使用以下命令,測試某個庫是否支援CocoaPods
$ pod try XXX
鑑於這裡不是介紹如何使用 CocoaPods,這裡只討論下使用 CocoaPods 的好處,以及一些使用經驗(我會在後文列一些 CocoaPods 的資料)。
優點:
1、解決了方案一中,需要在專案裡 大量標記 -fno-objc-arc 的問題:
—— CocoaPods自動生成的關聯庫會在關聯工程中自動標記好,原始專案中只管用就行
2、解決了方案二中,只有.h 標頭檔案,沒有原始碼、出錯沒法定位和修改的問題:
—— CocoaPods也是使用靜態庫依賴,但是保留全部.m檔案
3、解決了方案二中,靜態庫使用時的一些坑,和需要打包.a檔案的麻煩操作。
—— CocoaPods自動完成
4、極大的簡化了操作:
1> cd進入.xcodeproj檔案所在的目錄
$ pod init
2> 在自動生成的Podfile檔案中,加入要pod的庫名
$ pod install
3> 搞定。
5、最重要的一點:以後再遇到這次的升級第三方庫版本的需求時,只需一行命令即可:
$ pod update
結論:就是這個了!
確定方案
CocoaPods 一勞永逸的解決了第三方庫版本升級的問題。
就醬~
</br></br></br></br>
乾貨部分
CocoaPods學習資料
CocoaPods入門:
1、CocoaPods安裝和使用教程
(入門看這一篇就夠了)
2、CocoaPods pod install/pod update更新慢的問題
最近使用CocoaPods來新增第三方類庫,無論是執行pod install還是pod update都卡在了Analyzing dependencies不動
原因在於當執行以上兩個命令的時候會升級CocoaPods的spec倉庫,加一個引數可以省略這一步,然後速度就會提升不少。命令如下:
pod install --verbose --no-repo-update
pod update --verbose --no-repo-update
3、mac升級到10.11,cocoapods沒了
使用命令列sudo gem install cocoa pods出錯,換成sudo gem install -n /usr/local/bin cocoa pods即可,詳見: http://t.cn/Ry8tZAs
4、使用經驗:
1> pods install 時,可以不加版本號(預設下載對應庫的最新版本)
但是,下載完依賴後,最好加上版本號,避免在新增了新的庫,或者pod update時,由於某些第三方庫頻繁升級而帶來的不穩定。
2> 多人合作的較大專案,Podfile檔案可以設定許可權,只由一個人來修改、新增依賴的庫。
3 > SVN或者Git做版本管理時,不要上傳 Pods 、workspace 目錄:
(可以設定ignore)
</br>
CocoaPods高階用法:
1、即使你不使用第三方庫,CocoaPods仍然是一個管理程式碼相關性的絕佳工具
2、藉助GitHub託管Category,利用CocoaPods整合到專案中
3、Cocoapods建立私有podspec
4、寫一個Pod釋出到CocoaPods
5、CocoaPods的一些略為高階一丁點的使用
</br>
//TODO:1、利用多個 project 做本地依賴管理
2、私有倉庫的使用嘗試
</br></br>
相關文章
- iOS應用加固為什麼也那麼重要?iOS
- Flutter 與 Swift - 在建立 iOS 應用程式時應該押注什麼技術?FlutterSwiftiOS
- 一個優質的專案應該具有什麼特點
- 什麼場景應該用MongoDB ?MongoDB
- xcode專案整合CocoaPodsXCode
- 新專案為什麼決定用 JDK 17了JDK
- iOS CocoaPods使用iOS
- 為什麼你應該嘗試@reach/router
- 為什麼你應該在專案中使用pyenv+Pipenv:為專案設定超棒的本地開發工作流之祕籍
- Objc Runtime在專案中該怎麼用OBJ
- 寫簡歷應該怎麼準備專案
- Python 集合是什麼,為什麼應該使用以及如何使用?Python
- 為什麼你應該停止閱讀新聞?
- 為什麼Python停止執行?該如何應對?Python
- 為什麼 AI 時代更應該 Learn in PublicAI
- 為什麼開發者應該摒棄敏捷?敏捷
- [譯] 為什麼你應該開始使用 KotlinKotlin
- 為什麼應該切換到實時渲染
- Grafana 系列文章(十):為什麼應該使用 LokiGrafanaLoki
- iOS CocoaPods私有庫iOS
- iOS CocoaPods公有庫iOS
- 為專案應用設定No-PIE
- 新手入門應該用什麼剪輯工具?
- 為什麼看不見AHAS應用?
- 為什麼程式猿都應該學點linux命令?Linux
- 為什麼 Python 開發人員應該使用 PipenvPython
- 駁《再論為什麼你不應該招DBA》
- 為什麼應用安全應該成為金融服務提供商的重點關注問題?
- iOS Cocoapods版本號概念iOS
- 簡歷應該用什麼字型?多大號字呢?
- 為什麼你應該放棄React老的Context API用新的Context APIReactContextAPI
- 用資料告訴你:SDK加固為什麼應該選擇網易易盾
- 自下而上的專案用什麼專案管理工具好?專案管理
- 運維專案管理用什麼專案管理軟體好?運維專案管理
- 今天,我們為什麼應該讀懂華為人工智慧?人工智慧
- 為什麼RPA專案失敗了呢?
- 為什麼專案老夭折?這份專案管理指南請收好專案管理
- 為什麼軟體工程師應該學習哲學?軟體工程工程師
- 2020年,為什麼我們應該使用abapGit代替SAPLinkGit