好看的海来自好看的天
终于迎来了我们《虾票票》入门 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》系列写完了,希望看到这里的你有一些收获,或者可以自行实现《虾票票》了,欢迎交流你的成果~
后续我还会整理一个传送门,放上《虾票票》的源码,并做个总结✅。