一、Podfile & .podspec 文件
1、Podfile
1.1. 什么是 pod
简单来说,一个 pod 就是 xcode 里面的一个 dependency:
Anyway,pod 就是第三方库的意思。一个 pod 就是指一个第三方库。
1.2. Podfile 有什么用
Podfile 可以理解为就是一个用 ruby 写的脚本文件。这个文件的主要功能就和 Xcode 自带的 Swift Packages Manager (SPM)一样 —— 用来给自己的 iOS 项目加 dependencies 的。
像图中的第 11 行代码,它的意思就是在 Xcode 加一个叫 PrivateMath 的 dependencies,并且和 SPM 一样,把这个 dependencies 的 target 定为 Calculator.
其实 Podfile 还有另外一个用处,但这个在下面讲 pod install 时才会提到。
1.3. 如何配置一个最基本的 Podfile
其实配置一个最基本的 Podfile 并没有想象中那么困难,只要:
- 指定 iOS 的版本号
- 指定 podspecs 仓库的远程地址
- 给特定的 target 加 dependencies
2、.podspec 文件
2.1. 什么是 .podspec 文件
.podspec 的全写就是 pod specification,就是 pod 说明书。所以从后缀名就可以看出,.podspec 文件就是用来描述一个第三方库的基本信息的;或者说 .podspec 文件存的是这个第三方库除源代码以外的信息(比如这个库的作者、库的版本、库的源代码的仓库地址、库所支持的 swift 版本……)。
以下图 PrivateMath 这个第三方库的 .podspec 文件举例:
这个 .podspec 文件存的就是:
- 这个库的名字是 PrivateMath
- 这个 .podspec 文件描述的是 0.3.0 版本的 PrivateMath 库
- PrivateMath 这个库的首页地址是:https://github.com/chuanzhima0415/PrivateMath
- PrivateMath 这个库只支持 swift 5.0 的版本
- PrivateMath 这个库的作者是 chuanzhima0415
- PrivateMath 这个库的源代码地址是:https://github.com/chuanzhima0415/PrivateMath.git
- PrivateMath 这个库只支持 iOS 12.0 及以上的 iPhone 运行
2.2. 如何配置一个最基本的 .podspec 文件
在新建一个第三方库时终端执行 pod lib create ${ 自己写的库的名字 } 命令后,cocoapods 会给你生成一个最基本的 .podspec 文件的模版,其中我们要改的部份就是:
- s.summary:这个库的大概描述
- s.description:这个库的详细描述
- s.swift_version:这个库所适用的 swift 版本
- s.homepage:这个库的首页地址
- s.source:这个库的源代码的地址
- s.ios.deployment_target:这个库适用于 iOS 的哪个版本
但需要注意的是:
- s.description 的内容一定要比 s.summary 的内容长很多,要不然 pod lib lint 和 pod spec lint 会过不了
- s.source 一定要正确
- s.homepage 选一个可以打开的网页地址就行了
- 一定要指定 swift_version,要不然 pod lib lint 和 pod spec lint 会过不了
- Xcode 的 iOS app 项目里的 iphone 设备版本一定要大于等于 s.ios.deployment_target
二、podspec 仓库
1、什么是 podspec 仓库
看名字就知道了,podspec 仓库就是专门存第三库的 .podspec 文件的仓库。注意,这个仓库只存第三方库的 .podspec 文件,不存第三库的源代码!!!
2、如何配置 podspec 仓库
例子:假设我现在要配置一个叫 PrivateSpecs 的 podspec 仓库,然后这个仓库内部存有自己写的 PrivateMath 库的 .podspec 文件。
step1:在 github 上创建一个远程的仓库,名字一般为 xxxSpecs。这里的 README、证书都可以勾,但要把 visibility 设为 Private
step2:终端执行 pod repo add ${ .podspec 远程仓库的名字 } ${ podspec 远程仓库的地址 }
step3:终端执行 pod lib create ${ 自己写的库的名字 }。后面会跳出多行的选择,记住 test 的框架要选 none,然后 view 模版也选 no。选完回车后 xcode 会弹出一个模版
step4:在 pods target 下的 Development Pods/${ 自己写的库的名字 }/ReplaceMe 文件写自己的库代码了。顺便也可以把 ReplaceMe 改为自己库的名字。


step5:写完之后还要去到 Development Pods/${ 自己写的库的名字 }/ Pod 目录下配置 ${ 自己写的库名字 }.podspec:
- s.description 一定要比 s.summary 要长很多(不然验证不通过)
- 一定要规定 s.swift_version
- 确保 s.source 链接一定要正确
- s.homepage 只要写一个可以访问到的 url 就行了
step6:根据 .podspec 的 source 地址在 GitHub 上建一个存库源代码的仓库(README, 证书那三样都不要勾,否则可能会有分支错误)
step7:根据 github 的提示,把这个本地的库项目 push 到远程 github 存库源代码的那个库

step8:git tag ‘0.1.0’ (tag 号码一定要跟 .podspec 文件的 s.version 要一致!)

step9:打标签,即终端运行:git push --tags
step10:验证库的源代码,即终端执行:pod lib lint
step11:验证库的 .podspec 文件,即终端执行:pod spec lint
step12:把 .podspec 文件 push 到存 .podspec 的远程仓库中,即终端执行:pod repo push ${ 存 .podspec 文件的远程仓库名 } 库项目下的 .podspec 文件
step13:推送完成
3、如何使用 podspec 仓库
Xcode 开了一个 app 项目后:
step1:终端执行 pod init 指令(执行完会生成 Podfile 文件)
step2:Xcode 配置 Podfile
step3:终端执行 pod install 命令
step4:打开 .xcworkspace 文件
step5:build 项目,可能会遇到 CoreStore.framework/_CodeSignature" failed: Operation not permitted 报错,参考下文 pod install 命令介绍的第 3 点。
step6:此时可以使用第三方库了
三、cocoapods 相关命令
1、pod init
生成 podfile 文件,然后你要在这个 podfile 文件里面写你要加载的库(add dependencies)。
注意:这个命令并没有加载库,只是要你写要加载的依赖而已。
2、pod install
2.1. pod install 有什么用
根据 podfile 的内容把库加载进项目中。即增加依赖,但如果重新 pod install 并不会改变库的版本;生成 Podfile.lock(这个文件定死了库的版本)
注意:如果你已经改变了 Podfile 的内容,在 Xcode build 项目前一定要重新执行 pod install!因为一旦改过 dependence 的获取路径(比如从本地路径改为远程地址),然后如果不执行 pod install,直接 Xcode build 的话,因为远程的库源代码没有下载下来,所以Xcode 会找不到这个库,于是就会报错说找不到库。
2.2. pod install 背后的流程
在终端执行 pod install 时,其实 cocoapods 会帮我们做这些事情:
- 读取 Podfile 文件,并根据 Podfile 里指定的版本算出应该获取这个库的那个版本。当然,如果有 podfile.lock 文件的话,cocoapods 还会看 podfile.lock 中的版本和 Podfile 的版本是否一致,如果一致的话就算出这个库应该下载的版本号。
- 如果此时的版本号本地缓存里有的话,就不用下载这个存库源代码的仓库了,而是直接用缓存里的库的源代码。
- 如果缓存没有这个版本号的话,就要远程下载库的源代码了。然后下载完后把源代码存进缓存中。
- 生成 Pods 项目,并生成一个 Pods.xcodeproj 的文件。以后你只能打开这个文件,因为这个文件把 iOS app 的项目跟所有 dependencies 链接在一起了。
- 生成一个 .xcworkspace 的文件。
- 如果没有 podfile.lock 文件,就生成 podfile.lock 文件。
2.3. pod install 的坑:CoreStore.framework/_CodeSignature" failed: Operation not permitted
如果执行 pod install 之后报 # CoreStore.framework/_CodeSignature" failed: Operation not permitted 错,请不要慌张,解决方法就是 build settings -> 搜 sand boxing -> 把 Yes 改成 No。就解决了。
3、pod update
重写 Podfile.lock ,把所有旧的版本改成新的;但不会把新的 dependencies 加载进项目,只是仅仅写 Podfile.lock 而已。
4、pod repo list
显示所有存 .podspec 的仓库的名字、远程地址、本地地址。
5、pod repo remove ${ 存 .podspec 的仓库的名字 }
删除 .podspec 仓库。
6、pod search ${ 存 .podspec 的仓库的名字 }
找特定的存 .podspec 的仓库。
7、pod repo add ${ 存 .podspec 的仓库的名字 }
往 pod repo list 中增加存 .podspec 的仓库。
8、pod lib create ${ 自己写的库的名字 }
让 cocoapods 给你创建一个第三方库的模版。
9、pod cache clean --all
清空存有 pod 的源代码的缓存。
10、pod cache list
列出缓存里所有的库的地址、名字等信息。