关于 Cocoapods 使用

一、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 文件存的就是:

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 改为自己库的名字。
写第三方库的源代码

把 ReplaceMe 文件名改为 MathTool

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 存库源代码的那个库
Github 提示

step8:git tag '0.1.0' (tag 号码一定要跟 .podspec 文件的 s.version 要一致!)
版本是 0.1.1!!!

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 会帮我们做这些事情:

  1. 读取 Podfile 文件,并根据 Podfile 里指定的版本算出应该获取这个库的那个版本。当然,如果有 podfile.lock 文件的话,cocoapods 还会看 podfile.lock 中的版本和 Podfile 的版本是否一致,如果一致的话就算出这个库应该下载的版本号。
  2. 如果此时的版本号本地缓存里有的话,就不用下载这个存库源代码的仓库了,而是直接用缓存里的库的源代码。
  3. 如果缓存没有这个版本号的话,就要远程下载库的源代码了。然后下载完后把源代码存进缓存中。
  4. 生成 Pods 项目,并生成一个 Pods.xcodeproj 的文件。以后你只能打开这个文件,因为这个文件把 iOS app 的项目跟所有 dependencies 链接在一起了。
  5. 生成一个 .xcworkspace 的文件。
  6. 如果没有 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 仓库。

找特定的存 .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

列出缓存里所有的库的地址、名字等信息。