為什麼iOS專案應該用CocoaPods

weixin_33976072發表於2015-11-28

為什麼iOS專案中應該使用CocoaPods作為第三方依賴管理工具?

332029-76f5038a773b7863.png

目錄:

  • 從一個bug說起
  • 分析需求及解決方案
  • 確定方案
  • CocoaPods學習資料

</br>

一、從一個bug說起:

1、公司的專案裡統一使用SVG格式的圖片;
2、GitHub上只有一個star數超過一千的SVG解析庫,叫SVGKit。(對,就是這個坑爹的庫)
    坑1: 這個庫一直使用非ARC,有100多個類;</a>
    坑2: 這個庫還依賴另外一個庫CocoaLumberjack;
    坑3: 把這個庫配置到專案中就會報一種錯誤:

332029-41102bc3ee4544b1.png

3、公司的專案是直接以原始碼的形式使用的該庫。
  結果就是 Build Phase 中成了這樣:
  (我不知道當初加這些 -fno-objc-arc 標記的人是否崩潰,我光看著就覺得淡淡的憂桑:這麼多得加多久?加漏了或者多加了,都是坑。)

332029-e085b55b305df854.png

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 標記。否則在使用的時會崩潰:

332029-83821f8d987a4e16.png

  2、當時花了好久沒解決這個問題的原因是,我記得自己設定了呀。
     後來才想起來為毛還是崩,這是我們的專案target,你們感受下:

332029-a4084793b6c2f4ef.png

有任何一個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 時,可以不加版本號(預設下載對應庫的最新版本

332029-9293ed3a288b838e.png

  但是,下載完依賴後,最好加上版本號,避免在新增了新的庫,或者pod update時,由於某些第三方庫頻繁升級而帶來的不穩定。
332029-22cd97e2d756cb04.png

  2> 多人合作的較大專案,Podfile檔案可以設定許可權,只由一個人來修改、新增依賴的庫。
  3 > SVN或者Git做版本管理時,不要上傳 Pods 、workspace 目錄:
(可以設定ignore)
332029-4e55d2d3a6b9d29f.png

</br>

CocoaPods高階用法:

1、即使你不使用第三方庫,CocoaPods仍然是一個管理程式碼相關性的絕佳工具
2、藉助GitHub託管Category,利用CocoaPods整合到專案中
3、Cocoapods建立私有podspec
4、寫一個Pod釋出到CocoaPods
5、CocoaPods的一些略為高階一丁點的使用

</br>

//TODO:1、利用多個 project 做本地依賴管理
       2、私有倉庫的使用嘗試

</br></br>

相關文章