目录

一、Cocoapods安装

二、Cocoapods使用(怎么把工程创建成pods工程)

三、Cocoapods工作流程(pod是怎么把一个库下载到工程里的)

四、pod update太慢、pod search不到最新库、pod不到最新库

五、pod install 和pod update的区别

六、Cocoapods1.7.0、1.7.2、1.8.0+有哪些更新

cocoapods1.7.0

cocoapods1.7.2

cocoapods1.8.0

CDN: trunk URL couldn't be downloaded解决办法:


 

本文内容来自亲身实践、cocoapods官方博客、网友博客

一、Cocoapods安装

推荐使用Homebrew安装,比用gem安装方便多了,终端输入命令即可完成。homebrew使用方法移步我这篇文章

brew install cocoapods

 

二、Cocoapods使用(怎么把工程创建成pods工程)

1、终端cd 到工程目录下

2、终端输入vim Podfile,为工程创建 一个Podfile文件(或手动创建一个文本文件,命名为Podfile)。

3、可以按i键输入一些内容,比如下面这样:

platform :ios, '12.0'
target 'TestPods' do
	use_frameworks!
	pod 'DFPlayer'
    	pod 'AFNetworking'
end

输入完成后,按esc,然后输入:wq,:wq意思是保存退出。

如果不按i键,可以到工程目录下,手动打开Podfile文件,然后输入上面的内容,保存退出。

4、然后就可以在终端执行pod install,或者pod update了。这个过程可能时间很长,原因看下面。

 

三、Cocoapods工作流程(pod是怎么把一个库下载到工程里的)

经过上面两步之后,在终端输入:

pod repo list

可以查看库地址。例如下面这样:有master和trunk两个repo,或者只有第一个。

如何查看pods容器的大小_工作流程

可以调用pod repo remove repoName删除一个repo,比如删除trunk。

pod repo remove trunk

更新repo

pod repo update

以下流程针对第一个master这个源,关于第二个trunk源的解释在后面。

 

open Path地址查看文件夹,或者 浏览器输入URL网址https:///CocoaPods/Specs.git查看,找到Specs文件夹,一层一层点下去,直到点不下去为止。两种方式是一样的。这里以文件夹来说明:

如何查看pods容器的大小_工作流程_02

首先我们知道master这个repo下的Specs是一个git仓库。这个仓库里的内容是所有提交到cocoapods的库的索引文件。比如AFNetworking这个库的所有提交到cocoapods里的版本信息都存在这里。每个版本对应一个.podspec.json文件。例如下面这样:

如何查看pods容器的大小_工作流程_03

.podspec.json文件就是这个库的索引文件,对于在cocoapods上提交过库的作者来说,应该很熟悉这个文件。

因为在把库上传到cocoapods时,要写一个“库名.podspec”文件,这个文件里面的内容大概是下面这个样子的,包括库的名字、版本、简介、作者、许可证、git地址、依赖的框架等等。cocoapods就是把这个文件收集起来。.podspec.json文件和.podspec文件只是格式不一样,里面实际内容信息是一致的。

如何查看pods容器的大小_如何查看pods容器的大小_04

当AFNetworking的作者更新了一个版本,比如3.2.0,会对应修改AFNetworking.podspec里的version信息为3.2.0,同时会对AFNetworking的git库打一个tag为3.2.0,并提交到了github。注意.podspec中的version值和tag值是相同的。

下图中的66就是tag的个数,可以点进去查看都有哪些tag值。

如何查看pods容器的大小_工作流程_05

全都修改好以后,AFNetworking的作者会首先执行pod spec lint命令,验证这个文件有没有错误。

没有错误之后,他会执行命令pod trunk push AFNetworking.podspec命令把这个文件发送给cocoapods。

至此,AFNetworking已经完成了在cocoapods上的新版本的更新。

cocoapods接收到这个文件之后,会把这个文件根据名称和版本号对应放到Specs这个git库里面。这里是需要一些时间的,不是作者pod trunk push成功以后,接着就能pod  search到最新的库。

当我们在Podfile中加上pod 'AFNetworking',(没有指定版本,默认拉取最新的),执行pod update,我们会看到下图所示,表明pod正在从`https:///CocoaPods/Specs.git`这个git地址更新文件到本地的Specs仓库。

如何查看pods容器的大小_工作流程_06

经过上面的步骤之后,3.2.0版本的AFNetworking.podspec.json这个文件就下载到了自己的电脑里了。

然后,pod会去Specs这个仓库搜索AFNetworking,发现3.2.0是最新的,3.2.0文件夹下的AFNetworking.podspec.json文件中有以下内容:

如何查看pods容器的大小_如何查看pods容器的大小_07

意思就是去https:///AFNetworking/AFNetworking.git这个git地址下,下载tag为3.2.0的文件。这就是整个流程。

 

 

四、pod update太慢、pod search不到最新库、pod不到最新库

问题1:

为什么执行pod install 或者 pod update的时候,有时会很慢,并会出现如下图的信息:

如何查看pods容器的大小_工作流程_08

如何查看pods容器的大小_工作流程_06

 

经过上面的流程解释我们已经知道,因为它要先从`https:///CocoaPods/Specs.git`这个地址,克隆所有库的信息到本地(Updating local specs repositories更新本地specs这个仓库)。然后再去给你安装你需要的库到工程。

所以会有pod install --verbose --no-repo-update这个命令,跳过这个更新,直接从你本地的specs中检索你需要的库,然后下载 。

 

问题2:

为什么我们使用pod search搜索一个库时,明明官方说有版本2.0.1,但是pod search之后,显示最新的版本是1.0.5。这是因为pod search是检索你本地的specs库中的信息,而你本地的不是最新的。

 

问题3:

为什么pod一个库,没有pod到最新的?排除掉作者把索引文件上传到cocoapods,cocoapods同步到Specs这个仓库的时间差外,这个问题跟上个问题一样的原因,因为本地Specs跟远程的github上的Specs不一致。这两个问题执行pod update就行了。

 

五、pod install 和pod update的区别

详情移步这篇

简要说明:

1、新建一个pod工程时要用pod install。

2、编辑podfile文件后,两者的区别是:你在podfile中加了一个新库,假如版本是1.0,执行pod install,会在Podfile.lock文件中记录这个库1.0这个版本号,以后执行pod install会根据Podfile.lcok文件中记录的这个版本号去拉取代码,如果pods库已经更新到2.0,还是会去下载1.0。而pod update不关注Podfile.lock文件,总是试着查找到新的版本并下载。

 

六、Cocoapods1.7.0、1.7.2、1.8.0+有哪些更新

cocoapods1.7.0

增加对多版本的swift的支持:因为一些项目可能不能采用最新的swift版本编写,所以引用一些用新版本swift写的库就会报错。1.7.0就解决这个问题。你可以在Podfile中加上下面的字样,表明你的swift版本

target 'MyApp' do
  supports_swift_versions '>= 3.0', '< 4.0'
  pod 'CoconutLib', '~> 1.0'
end

而开发者把库提交到cocoapods的时候,podspec文件里可以加上以下属性表明你用的版本

spec.swift_versions = ['3.2', '4.0', '4.2']

在cocoapods1.7.0之前,我们都是采用上述解释的流程获取到一个库,就是下载到本地Specs这个官方索引库,然后根据这个库记录的某个库的版本信息去下载。所以,其实在Podfile里默认加了这句话:

source 'https:///CocoaPods/Specs.git'

 

cocoapods1.7.2

CDN方式去下载库在1.7版本引入,在1.7.2里最终完成,引用官方原图也就是:

如何查看pods容器的大小_工作流程_10

如果你用的cocoapods版本是1.7.2,并使用cdn方式下载的话,你需要在Podfile文件里加上这句话:

source 'https://cdn.cocoapods.org/'

还记得那个trunk源吗,它就是cdn方式下产生的。

为什么采用这种方式呢 ?

因为从上面的流程可以看出,以前我们下载一个库,需要先更新master这个repo下的Specs这个仓库,这个仓库是把全世界提交到cocoapods仓库的索引文件都集合在一起,然后你再clone到了本地。这个clone的过程就像老太太的裹脚布,长的没有边际,也看不到方向,以至怀疑人生。

到目前为止,specs这个git库已经有40万次提交,超过40万个文件夹,超过30万个.podspec索引文件,随着时间的累积,这个数量会只增不减。为了解决这个问题,于是采用CDN加载方式,使用这种方式只会在trunk下的Specs仓库里生成你指定下载的库的索引文件,而不用copy所有公共库的索引文件到你本地电脑。比如,在二、Cocoapods使用那个Podfile文件,执行pod install之后,会看到Specs下有两个文件夹,一直点下去之后分别是DFPlayer和AFNetworking。所以这种方式无疑会更加快速。

广告时间: DFPlayer库是本人写的一个简单灵活的iOS音频播放组件。基于AVPlayer,支持本地和远程音频播放,具有缓存、耳机线控、锁屏和控制中心信息展示、单曲顺序随机播放、倍速播放、歌词同步等音频播放器功能,DFPlayer封装了缓冲条、进度条、播放暂停按钮、下一首按钮、上一首按钮、播放模式按钮、歌词同步的tableview等UI控件,一行代码布局即可实现相应功能。

如何查看pods容器的大小_如何查看pods容器的大小_11

关于什么是CDN,后台同学会很熟悉,以下摘抄自百度百科。其他自行百度。

CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,
在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
CDN的基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,
CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

 

cocoapods1.8.0

开始默认使用CDN方式下载库,也就是不需要在Podfile文件里加这句话:source 'https://cdn.cocoapods.org/'

所以这种默认方式的改变,大家在cocoapods1.8.0版本之后(我目前是1.8.4),无论是pod install或者pod search都会遇到关于cdn的错误,比如:CDN: trunk URL couldn't be downloaded

如何查看pods容器的大小_如何查看pods容器的大小_12

又如:

如何查看pods容器的大小_如何查看pods容器的大小_13

有人说这是被墙的原因,假如被墙,并且不开vpn,那应该怎么都下载不了,但事实是,我多执行几次pod install,可能就有一次成功。所以还应该是网络的原因。

CDN: trunk URL couldn't be downloaded解决办法:

除了多执行几次pod install或者pod update,以下:

1、在Podfile上面加上这句,改用原来的方式

source 'https:///CocoaPods/Specs.git'

这种方式pod install和pod update都正常,pod search可能会异常,解决办法:移除trunk源。

pod repo remove trunk

2、手机热点下载。有效。但还是很大可能会意外挂断。但是上面那种方式也是很多情况下会意外挂断。

 

以上。