CocoaPods 1.8.0
CocoaPods 1.8将CDN设为默认的spec repo 源,并进行了一些增强。
CDN
概念
全称:Content Delivery Network
或Content Ddistribute Network
,即内容分发网络
。
基本思路
通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

目的
解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度和成功率。
CDN已设为默认值
CDN
是cocoapods在1.7
版本开始支持的并在1.7.2
版本中完成。在1.8
版本中不需要再去clone master库了。
Cocoapods-1.8使用
-
升级到最新版本
$ sudo gem install -n /usr/local/bin cocoapods --pre
-
替换掉原来的
source
# 若podfile中没有 - source 'https://github.com/CocoaPods/Specs.git' #git 源 + source 'https://cdn.cocoapods.org/' #cdn源
-
删除master库
$ pod repo remove master
-
查看当前版本(
非必须命令
)# 检测是否为1.8.0版本 $ pod --version
-
检测本地是否还包含
master
repo库(非必须命令
)$ pod repo list
-
部署pod环境
$ pod setup
-
安装三方库
# 会看到Addomg spec repo 'trunk' with CDN `https://cdn.cocoapods.org/` $ pod install
trunk库
trunk
是CDN支持的主要规格存储库的新名称。因为Cocoapods - 1.8.0
后默认使用CDN
的。升级到1.8.0及以后,trunk
替代了臃肿的master
库。
trunk
库包含的文件

.txt
文件:一组三方库名称及其所有的版本号。这样的文件有很多。

CocoaPods-version.yml文件
CocoaPods-version.yml
文件:指定了Cocoapods
的版本边界
---
min: 1.0.0
last: 1.8.4
prefix_lengths:
- 1
- 1
- 1
AlgoliaSearch.yml文件
此文件是第一次执行pod search
时生成的。此文件为远端对本地生成的身份信息。可以用来加快检索及请求效率。
---
application_id: WBHHAMHYNM
api_key: 4f7544ca8701f9bf2a4e55daff1b09e9
index: cocoapods
ETag文件
Etag
由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用If-None-Match.请求一个文件的流程可能如下:ETag
文件是一个可以与Web资源相关联的token(资源的身份证)。
第一次请求:客户端发起 HTTP GET 请求一个文件;服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设服务器支持Etag生成和已经开启了Etag).状态码200
第二次请求:客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头的内容就是第一次请求时服务器返回的Etag:2e681a-6-5d044840。服务器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存
;
# 此为 CocoaPods-version.yml.etag 对应的
"031c25b97a0aca21900087e355dcf663-ssl"
#####Specs
文件夹
此文件中只存储了Podfile
的工程中已经下载的三方库的spec
文件。并没有过多赘余,所以要比master
库小很多。(master库2.52GB
,trunk库1.2MB
。基于My Mac)

常规操作
执行search
必须将master
库取消关联,不然还会重新clonemaster
库.
$ pod repo remove master
$ pod search MJRefresh
注意
:search未使用过的三方库,可能会报错[!] CDN: trunk URL couldn't be downloaded: https://cdn.cocoapods.org/AlgoliaSearch.yml, error: Net::OpenTimeout
。使用新三方库时,Cocoapods
会去远程库拉取对应的spec
文件。原因是第一次使用某个三方库时,Cocoapods
回去远端拉取.txt
及对应的.txt.etag
文件。
若podfile
中有私有库源,则需要把CDN
的源也加进去。
source 'https://git.sprucetec.com/mei***ile/***zation/***ecs.git'
# CDN新源
source 'https://cdn.cocoapods.org/'
替换libwebp
文件的源
以前查找libwebp
时
$ find ~/.cocoapods/repos/master -iname libwebp
现在需要更换路径,执行下面命令
$ find ~/.cocoapods/repos/trunk/Specs -iname libwebp
# /Users/pengge/.cocoapods/repos/trunk/Specs/1/9/2/libwebp
Cocoapods表象上的变化
- 第一次安装不需要去下载臃肿的
master
库了。 - 不需要再升级三方库时再去
pod repo update
了。CDN
自动校验了。
注意
cdn在cocoapods中应用还存在一些问题(真的太垃圾了)。某些 podspec.json会被Q。
[!] CDN: trunk URL couldn't be downloaded: https://raw.githubusercontent.com/CocoaPods/Specs/master/Specs/5/f/7/CL_ShanYanSDK/2.2.1.7/CL_ShanYanSDK.podspec.json, error: Failed to open TCP connection to raw.githubusercontent.com:443 (Connection refused - connect(2) for "raw.githubusercontent.com" port 443)
目前的解决思路有三种:
- 弃用
cdn
机制。回退到原来的master repo库的方式。 - 多执行几次
pod
指令,说不定某个时间点它又下载下来了。 - 那就是让 shell 翻Q。