CocoaPods(封装库管理控件)

写在前面:如果你是首次使用CocoaPods,目标是快准狠的安装和使用,可以直接看安装、具体使用、使用补充三部分快速上手尝鲜。有一定经验后回来具体看看每部指令的含义,你会对CocoaPods了解越来越深~

一、CocoaPods简介:

CocoaPods是负责管理iOS项目中第三方开源库的工具,CocoaPods能让我们集中、统一管理第三方开源库,为我们节省设置和更新第三方开源库的时间。

二、CocoaPods安装:

在正式开始介绍安装CocoaPods,温馨提示如下:

  1. 操作命令中间可能有空格看不出来,建议直接复制粘贴执行;

  2. CocoaPods是由ruby语言编写的。我们需要通过Ruby来安装CocoaPods(至于为什么,我百度过也不知道原因,知道的朋友可以留言~)。然后因为Mac电脑自带Ruby环境,我们就只需打开终端开始动手。但是默认情况下mac系统自带的Ruby环境版本比较低(大概是2.0.0版本的),现在安装CocoaPods需要2.2.2版本及以上的,所以我们不管三七二十一先直接先升级ruby。

  3. 安装CocoaPods整体思路是:更新ruby->设置CocoaPods下载地址->下载并安装CocoaPods->使用CocoaPods

正式安装:

1、打开终端(不会的请自行百度)

2、查看当前Ruby版本(一般都是2.0.0,如果已经是最新版本的,可以跳过2-7两步)

ruby -v

3、升级Ruby环境,需要借助rvm(rvm是一个便捷的多版本ruby环境的管理和切换工具)。安装rvm(第一步要下载一些东西等两分钟左右);有rvm可以跳过3、4步,不确定可执行第4步检查

curl -L get.rvm.io | bash -s stable 

source ~/.bashrc

source ~/.bash_profile

4、查看rvm版本(有版本号就表示安装成功)

rvm -v 

5、检出ruby可安装的版本信息

rvm list known

6、安装一个ruby版本(可以是2.4.1版本,当然你也可以选择其他的)

rvm install 2.4.1

7、设置为默认版本

rvm use 2.4.1 --default

8、更换源(由于国内访问的CocoaPods国外下载路径被墙,我们需要来修改更换源,把源切换至ruby-china;网上大多数是使用的https://ruby.taobao.org的,这里不再建议使用的了,这是因为taobao Gems 源已停止维护,现由 ruby-china 提供镜像服务)

sudo gem update --system // 更新gem

gem sources --remove https://rubygems.org/ // 移除旧有镜像资源地址

gem sources -a https://gems.ruby-china.org/ // 添加新的镜像资源地址

9、为了验证你的Ruby镜像是并且仅是ruby-china,执行以下命令查看

gem sources -l

如果是以下结果说明正确,如果有其他的请自行百度解决

*** CURRENT SOURCES ***

https://gems.ruby-china.org/

10、终于正式安装CocoaPods

sudo gem install cocoapods
sudo gem install -n /usr/local/bin cocoapods // macOS 10.11系统后使用。现在基本上用这个命令

11、如果安装了多个Xcode使用下面的命令选择(一般需要选择最近的Xcode版本)

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

12、初始化本地库(作用:将CocoaPods记录的所有第三方库下载信息下载到本地~/.cocoapods/repos/master下面)

pod setup

13、执行以上命令后会输出一句话:Setting up CocoaPods master repo,然后就是漫长的等待,并不是卡死了而是在下载文件(下载完成后大概800多兆)。网速稍好些,几分钟就好了,人品不好网络差的可能会等很久很久很久........

查看文件下载进度的可以另外打开一个终端窗口(快捷键:选中终端按下Command+N组合键),复制粘贴以下两行命令回车执行

cd ~/.cocoapods
du -sh *

执行du -sh *之后会显示已下载的文件大小,可以多次执行来监看下载进度,如果之前还有文件大小,后来变成0了,可能是网络问题,下载已经中断了,需要结束命令并从新执行 pod setup

网上有文章说可以将别人机器上~/.cocoapods/repos/master下面的文件copy到自己电脑上的文件里可以跳过这步,本人亲测过,或多或少都有点问题。如果复制后,执行pod setup依然会清空原来内容重新下载,而不是智能的根据已下载的内容走剩下的流程,白复制,所以还是乖乖下载吧。

14、下载安装完成之后可执行下列命令检查是否可用(第一次使用要等一会,因为这个时候CocoaPods需要生成本地的封装库搜索文件目录);

pod search AFNetworking

如果是以下结果说明正确,如果有其他的请自行百度解决;AFNetworking+AutoRetry (0.0.5)不是我们要找的,AFNetworking (3.1.0)才是。退出搜索结果界面输入wq

-> AFNetworking (3.1.0)
   A delightful iOS and OS X networking framework.
   pod 'AFNetworking', '~> 3.1.0'
   - Homepage: https://github.com/AFNetworking/AFNetworking
   - Source:   https://github.com/AFNetworking/AFNetworking.git
   - Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3,
   3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,
   2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0,
   2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4,
   1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2,
   1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo]
   - Subspecs:
     - AFNetworking/Serialization (3.1.0)
     - AFNetworking/Security (3.1.0)
     - AFNetworking/Reachability (3.1.0)
     - AFNetworking/NSURLSession (3.1.0)
     - AFNetworking/UIKit (3.1.0)

-> AFNetworking+AutoRetry (0.0.5)
   Auto Retries for AFNetworking requests
   pod 'AFNetworking+AutoRetry', '~> 0.0.5'
   - Homepage: https://github.com/shaioz/AFNetworking-AutoRetry

三、CocoaPods的使用

1、 新建一个Xcode工程,使用终端cd到工程目录下(项目的.xcodeproj同级文件夹)

2、创建Podfile文件:

pod init

之后就可以在项目目录里看到一个Podfile文件

3、命令行打开Podfile文件或直接双击打开Podfile文件:

open Podfile

4、添加需要的第三方库(以AFNetworking为例),在打开的Podfile最下面添加以下内容:

pod 'AFNetworking' // 这里示范,所以不指定版本号,就是下载最新的第三方库。

// pod 'AFNetworking', '~> 3.1.0' // 实际工作中,必须要指定版本。

5、保存(command + S)后退出

6、开始下载:

pod install --no-repo-update

终端的结果没有红色的内容,基本上安装成功了。

7、打开.xcworkspace。一开始如果不习惯CocoaPods,往往会继续打开.xcodeproj运行工程,然后成功报错的哦。使用CocoaPods 需要打开.xcworkspace才能成功运行工程~

8、卸载CocoaPods。虽然很少用到,但贴心附上卸载CocoaPods的命令:

sudo gem uninstall cocoapods

四、CocoaPods具体使用补充

1、 podfile文件内容简单介绍:

// 用来设置所有第三方库所支持的iOS最低版本
platform :ios, '7.0'

target 'test' do // test是项目名

// 如果是swift项目,这句话保留;如果是OC项目,这句话要删除
use_frameworks!

// 添加第三方类库
pod 'AFNetworking'

// 添加指定版本号的第三方类库
pod 'SVProgressHUD', '1.1.3'

2、 版本说明

// 设置框架的名称和版本号
pod 'SDWebImage','~>3.7.5'//任何高于或等于3.7.5的版本,但是不包含高于4.0.0版本

//  版本号的规则:
//  '>1.0'    可以安装任何高于1.0的版本
//  '>=1.0'   可以安装任何高于或等于1.0的版本
//  '<1.0'    任何低于1.0的版本
//  '<=1.0'   任何低于或等于1.0的版本
//  '~>0.1'   任何高于或等于0.1的版本,但是不包含高于1.0的版本
//  '~>0'     任何版本,相当于不指定版本,默认采用最新版本号

温馨提示:

  1. 工作中建议使用'~>0 .1' 方式指定版本号,不建议不指定版本号。因为版本号的命名规则,每个0.01版本增加,一般是bug修复等小改动;每个0.1版本增加是引入或更新新的第三方库,或增加新的小功能等;每个1.0版本增加往往是大的新功能增加或者变量、方法命名等有大改变,往往对我们引用造成很大影响,因为可能要调整项目中的代码。如果不指示版本号,就会容易出现下载超过大于1.0版本的第三方库,出现不可知问题哦。
  1. 指定版本号也方便知道目前引用的第三方库大概是什么版本号,当然具体的可以到podfile.lock中查看。这远比手工拖入第三方库好的多。毕竟如果你手工拖入第三方库,并且没有做任何标示,天知道你下载的是哪个版本的,后续维护就是一个巨坑。本人就试过想将手工拖入的第三方库转移到CocoaPods中,由于不知道原版本号,只能指定最新的版本号,一运行成功,各种飘红~

3、 podfile和podfile.lock的区别

Podfile文件:
1. 记录本项目中的第三方库版本要求。
2. 必须做版本管理,项目成员间保持一致。

Podfile.lock文件:
1. 记录最后一次更新Pods时, 所有第三方框架的最终版本号。
2. 推荐做版本管理。除了项目很复杂,需要针对不同内容使用不同第三方库依赖时不做版本管理

4、 常用指令介绍

// 根据Podfile.lock文件中列举的版本号来安装第三方框架
// 如果一开始Podfile.lock文件不存在, 就会按照Podfile文件列举的版本号来安装第三方框架
// pod install

// 将所有第三方框架更新到最新版本, 并且创建一个新的Podfile.lock文件
// pod update // 更新Podfile中所有的第三方库
// pod update PODNAME // 只更新某个特定的库

// 上述两个指令在执行前默认会执行pod repo update指令
// 长时间不更新镜像,会出现pod search的结果低于实际上该第三方库在github上的版本。这个时候就执行该命令更新镜像,否则就无法下载最新的第三方库
pod repo update  

// 由于不需要经常更新第三方库,也没必要一定要下载最新的第三方库(有可能还不稳定),另外更新镜像很费时间,实际中往往不每次都更新镜像,需要带上后缀--no-repo-update,以免执行pod repo update指令
pod install --no-repo-update // 推荐使用
// pod update --no-repo-update // 不推荐使用
pod update PODNAME --no-repo-update // 推荐使用, PODNAME应改为具体的第三方库库名
        
// 检出那些所有较Podfile.lock里面有新版本的库(那些当前被安装着的库的版本)
pod outdated 

5、 pod install & pod update区别

  • 举个例子好说明:
// 1. 初次建立项目,Podfile中第三方库要求如下:
pod 'SDWebImage','~>3.7.5'
pod 'AFNetworking', '~> 3.1.0'

// 2. 使用pod install --no-repo-update后,会安装SDWebImage和AFNetworking,在Podfile.lock中版本号分别是3.7.5和3.1.0
pod install --no-repo-update

// 3. 后来AFNetworking的作者发布3.2.0最新包,SDWebImage没变化;没有对Podfile中第三方库要求做任何修改

// 4.1 若此时执行pod install --no-repo-update 
pod install --no-repo-update 
// 由于已经有Podfile.lock,当前已安装的第三方库(Podfile.lock记录的)依然符合Podfile中要求,不会做任何处理;即当前SDWebImage和AFNetworking,依然是3.7.5和3.1.0

// 4.2 若此时执行pod update --no-repo-update 
pod update --no-repo-update 
// 不管有没有Podfile.lock,CocoaPods会找远方服务器最新的,并且符合Podfile中要求的第三方库更新,并重新生成Podfile.lock;即当前SDWebImage和AFNetworking,依然是3.7.5和3.2.0

// 5.要注意的是,假如项目中SDWebImage和AFNetworking,依然是3.7.5和3.1.0。远方服务器SDWebImage和AFNetworking最新的版本是3.8.5和3.2.0
// 需要引入新的第三方库MJExtension
pod 'MJExtension', '~> 3.0.13'

// 5.1 若只是引入MJExtension而不更新已有的库,执行
pod install --no-repo-update 
// 此时SDWebImage和AFNetworking,依然是3.7.5和3.1.0;并增加MJExtension(3.0.13)

// 5.2若不仅要引入MJExtension并更新已有的库,执行
pod update --no-repo-update
// // 此时SDWebImage和AFNetworking,升级到3.8.5和3.2.0;并增加MJExtension(3.0.13)
  1. 使用pod install/update命令安装框架后的大致过程:

     01 分析依赖:该步骤会分析Podfile,查看不同类库之间的依赖情况。如果有多个类库依赖于同一个类库,但是依赖于不同的版本,那么cocoaPods会自动设置一个兼容的版本。
     02-1 下载依赖(pod install):根据分析依赖的结果,根据Podfile.lock是否已有符合的第三方库,若有则不下载,若无则下载指定版本的类库到本地项目中,并更新Podfile.lock。
     02-2 下载依赖(pod update):根据分析依赖的结果,无视已有的版本库,下载最新的指定版本的类库到本地项目中,并更新Podfile.lock。
     03 生成Pods项目:创建一个Pods项目专门用来编译和管理第三方框架,CocoaPods会将所需的框架,库等内容添加到项目中,并且进行相应的配置。
     04 整合Pods项目:将Pods和项目整合到一个工作空间中,并且设置文件链接。
    

7、 CocoaPods specs的镜像索引

  • CocoaPods specs的镜像索引是指CocoaPods管理的全球所有第三方库相关信息在本地的查询数据。CocoaPods需要依靠本地的镜像索引来获取服务端中对应的第三方库信息(下载地址等)并进行分析下载。

  • 所有的项目的podspec文件(镜像索引文件)都托管在https://github.com/CocoaPods/Specs上。

  • 第一次执行pod setup时,cocoapods会将这些podspec索引文件更新到本地的 ~/。cocoapods/目录下,这个索引文件比较大,国内网络的问题,更新非常慢。

  • 国内很多善丈人翁就在国内建了新的地址,并及时和国外的保持同步,大家使用之余要记得感恩,不过这些国内的地址不时就会失效,目前最新的是https://gems.ruby-china.org

  • 使用方法:

pod repo remove master // 移除旧有镜像资源地址
pod repo add master https://gems.ruby-china.org // 添加新的镜像资源地址
pod repo update // 更新镜像
  • 后续使用中进行pod repo update 时(pod update、pod install 默认执行pod repo update命令),会去更新获取pod specs。

8、 使用注意:不是所有的库都可以由CocoaPods管理。需要该第三方库拥有.podspec才行。.podspec包含了该第三方库的名称、版本号、下载地址、第三方库依赖等信息。CocoaPods需要根据该信息才能找到对应的下载地址

五、CocoaPods拓展-原理和组件化

CocoaPods原理
  • CocoaPods 背后的理念主要体现在两个方面。首先,在工程中引入第三方代码会涉及到许多内容。针对 Objective-C初级开发者来说,工程文件的配置会让人很沮丧。在配置buildphases和linker flags过程中,会引起许多人为因素的 错误。CocoaPods 简化了这一切,它能够自动配置编译选项。

  • 其次,通过 CocoaPods,可以很方便的查找到新的第三方库。当然,这并不是 说你可以简单的将别人提供的库拿来拼凑成一个应用程序。它的真正作用是让你能够找到真正好用的库,以此来缩短我们的开发周期和提升软件的质量。

  • CocoaPods的原理,它是将所有的依赖库都放到另一个名为Pods项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中
    1、Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a 文件即可。
    2、对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本, 该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目 标目录中。
    3、CocoaPods通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和 参数。

CocoaPods组件化

试想一下,既然CocoaPods能够管理第三方库,那为什么不管理公司自有的封装库,方便公司内部跨app使用和测试?在这种思路下,组件化就应运而生了。目前越来越多的公司CocoaPods来实现组件化。有兴趣的可以自行搜一下关于组件化的内容。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容