好看的海來自好看的天
終於迎來了我們《蝦票票》入門 iOS 系列的最後一節——CocoaPods 的介紹和使用。
話不多說,我將按照上述大綱的四個步驟開始講解。
是什麼、為什麼、怎麼用?#
CocoaPods 是什麼❓
官方解釋,它是一個開發 iOS 應用程序的第三方庫依賴管理工具。
為什麼要使用它呢❓
因為它能自動化地、集中地、直觀地管理第三方開源庫,這裡可以類比 gradle、npm 等等。
PS:iOS 常用框架集成方式對比如下,參考《極客時間》。
怎麼使用呢❓
- 首先要安裝~
- 前提 -- 安裝 Ruby:
brew install ruby
,CocoaPods 是基於 Ruby 來構建的; - 安裝 CocoaPods:
sudo gem install -n /usr/local/bin cocoapods
,gem
是 Ruby 模塊的包管理器; - 安裝spec 倉庫❗️到本地:
pod setup
,spec 倉庫體積較大,喝一杯☕️等待~
- 前提 -- 安裝 Ruby:
- 使用步驟如下:
cd [項目根目錄]
- 初始化 pod:
pod init
,即可生成 Podfile 文件; - 編輯 Podfile❗️
- 在項目中集成對應的代碼庫❗️:
pod install
- 使用時,
#import <頭文件>
即可。
細心的你可能會發現上面的 3 個❗️,這是今天的重點🎺🎺🎺,讓我們帶著下面兩個問題繼續往下看:
- 如何編輯 Podfile 呢?
- spec 倉庫和代碼庫是什麼,它們有什麼區別?可以暫時理解為說明書和實物。
首先看第一個問題:如何編輯 Podfile 呢?
編輯 Podfile#
Podfile 的基本模版如下:
platform :ios, '9.0' # 指定設備平台「iOS」和最低支持版本號「9.0」
inhibit_all_warnings! # 禁止所有警告
use_frameworks! # 使用動態庫,否則使用靜態庫
target 'MyApp' do # target指定針對的target名稱
pod 'Masonry', # 導入Mansonry的最新版本
pod 'YYModel', '1.0.4' # 導入YYModel的1.0.4版本
pod 'ObjectiveSugar', '>= 0.5.2' # 導入ObjectiveSugar>=0.5.2的最新版本
target 'MyAppTests' do # 嵌套測試的target
inherit! :search_paths # 繼承上者的搜索路徑(至少包含上述第三方庫)
pod 'OCMock', '~> 2.0.4' # 導入OCMock>=2.0.4且<2.1的最新版本
end
end
- 注意版本號的匹配規則、嵌套寫 target 以減少重複寫 pod 的技巧,更多細節見註釋。
學會了簡單的 Podfile 編寫方法,那麼我們現在看看《蝦票票》用到了哪些第三方庫呢?👇
- Masonry:UI 佈局約束
- AFNetworking:網絡請求
- SDWebImage:圖片下載 / 緩存 / 解碼
- YYModel:模型轉換(json 和 model)
- MJRefresh:下拉刷新、上拉加載
- MBProgressHUD:loading 交互
你是否可以想出 Podfile 的模樣呢?👇
source 'https://github.com/CocoaPods/Specs.git' # 可以手動指定spec庫的地址
platform :ios, '9.0'
use_frameworks!
target 'ShoPiaoPiao_Example' do
pod 'ShoPiaoPiao', :path => '../' # 通過設置:path=>拉取本地庫
pod 'Masonry' # 上面提到的6個第三方庫
pod 'AFNetworking'
pod 'SDWebImage'
pod 'YYModel'
pod 'MJRefresh'
pod 'MBProgressHUD'
end
- 手動指定的 spec 庫可以是公司或者個人私有的 Git 倉庫。⚠️:如果手動指定了其他庫,則必須指定所有要用到的 spec 庫,即默認的 spec 庫(首次安裝的)也要指定,見上碼。
- 可以通過設置
=> 拉取本地庫,多用於開發該庫。 - 這裡的第三方庫都默認使用最新的版本。
溫馨補充🎺:這裡你可能會想 ShoPiaoPiao 是什麼第三方庫呢?它是屬於《蝦票票》的第三方庫。那它為什麼是以本地導入的方式 pod 呢?其實我是以開發第三方庫的方式,來開發《蝦票票》這個項目,公司裡多以這種方式開發,類似 SDK 開發。在下面的常用命令一節還會提到如何製作基於 CocoaPods 的第三方庫。
圖解原理#
借鑒網上三張圖來說明白 CocoaPods 的基本原理。
先解答前面提到的第二個問題:spec 倉庫和代碼庫是什麼,它們有什麼區別?
看圖:
1)通過 pod setup
安裝 spec 倉庫到本地,其實就是把遠程的 CocoaPods 官方索引庫拉取到本地,而這個索引庫裡存放了各個第三方庫的描述信息,分別用一個spec 文件存放,裡面包含了第三方庫的這些信息:
- 庫名
- 版本號
- 描述信息
- 源碼地址❗️
- ...
2)在我們編寫好 Podfile 並運行 pod install
時,CocoaPods 就會根據每個庫的源碼地址去拉取源碼集成到項目裡。(當然這個源碼是會有緩存的)
這樣看完是不是能夠理解 spec 庫和代碼庫的區別了呢?
再看兩張關於 pod install
過程的圖解:
跟著序號和箭頭試著理解 pod install
的過程,如果能夠理解上面的講解,理解這兩張圖就不成問題了~🤔
常用命令#
整理了一張常用命令圖,可保存當作工具圖使用。
🥩加加加餐: pod install
VS. pod update
它倆的區別是什麼呢?這應該是初次使用 CocoaPods 時最常見的一個疑惑。
相同點:
- 目的都是拉取項目依賴的代碼庫
- 更新 Podfile.lock
不同點:
- 前者受 Podfile.lock 約束,後者不受
- 後者會更新本地的 spec 庫
過程詳解:
pod install
檢查Podfile.lock是否已經包含 Podfile 中的庫;
(一)如果包含,則繼續判斷 Podfile 裡是否指定版本:1)如果指定版本就去檢查 Podfile.lock 中保存的版本是否與 Podfile 裡指定的相同,相同則跳過,不相同則更新為 Podfile 裡指定的;2)如果沒有指定版本,則不檢查更新直接跳過;
(二)如果不包含該庫,則去下載該庫並將版本保存在 Podfile.lock 文件中。
PS:Podfile.lock 一般作用於 Podfile 沒有指定版本的工程。
pod update
忽略 Podfile.lock 中的記錄,先更新 spec 庫,然後直接去找符合 Podfile 文件中該依賴庫的指定版本,如果沒有指定,就會找最新版本。
PS:pod update [PODNAME] 指定某個 Pod 庫去更新。
參考#
是什麼、為什麼、怎麼用?
How do I install CocoaPods?——stackOverflow
CocoaPods Guides—— 官方
從文檔開始了解 cocoapods 之 Podspec—— 簡書
編輯 Podfile
你真的會寫 Podfile 嗎—— 掘金
inherit!—— 官方
常用命令
pod install 與 pod update 的區別—— 簡書
尾聲#
差不多一個月的時間把《蝦票票入門 iOS》系列寫完了,希望看到這裡的你有一些收穫,或者可以自行實現《蝦票票》了,歡迎交流你的成果~
後續我還會整理一個傳送門,放上《蝦票票》的源碼,並做個總結✅。