iOS CocoaPods详细教程

CocoaPods简介

CocoaPods是一个负责管理iOS项目中第三方开源库的工具。CocoaPods的项目源码在Github上管理。该项目开始于2011年8月12日,在这两年多的时间里,它持续保持活跃更新。开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和更新第三方开源库的时间

在我们有了CocoaPods (https://github.com/CocoaPods/CocoaPods) 这个工具之后,只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后在命令行执行$ pod install命令。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我们的工程设置好相应的系统依赖和编译参数。

一、CocoaPods 的安装

CocoaPods基于Ruby语言开发而成,因此安装CocoaPods前需要安装Ruby环境。幸运的是Mac系统默认自带Ruby环境,如果没有请自行查找安装。检测是否安装Ruby:
$ gem -v
安装则会提示当前Ruby版本。

1、RubyGems换源

RubyGems是什么呢?下面是官网给出的一段介绍:

The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a “gem” and contains a package Ruby application or library.

Gems can be used to extend or modify functionality in Ruby applications. Commonly they’re used to distribute reusable functionality that is shared with other Rubyists for use in their applications and libraries. Some gems provide command line utilities to help automate tasks and speed up your work.

通俗地来讲RubyGems就像是一个仓库,里面包含了各种软件的包(如Cocoapods、MySql),可以通过命令行的方式来安装这些软件包,最为方便的是自动帮你配置好软件依赖的环境,整个安装过程仅仅只需要几行命令行。

我们在安装CocoaPods的时候,就是通过rubygems来安装的,由于在国内访问rubygems非常慢,所以替换rubygems镜像源就显得十分必要了。之前很多人用的都是淘宝的镜像源,现在淘宝的rubygems镜像源交给Ruby China来维护了,替换rubygems镜像源的命令行如下:

$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ (这里是需要替换的原来的镜像源)
$ gem sources -l
https://gems.ruby-china.org
//确保只有 gems.ruby-china.org

列出gem sources.png

2、更新升级 Gem 版本

Gem是管理Ruby库和程序的标准包,如果它的版本过低也可能导致安装失败,解决方案自然是升级Gem,执行下述命令即可:

// 更新升级gem
$ sudo gem update --system

更新升级gem.png

3、更新升级 Ruby 版本

在进行CococaPods安装的时候,遇到错误,错误提示大致意思是ruby版本太低,需要升级至2.2.2以上.果然,在终端使用ruby -v查看版本为2.0.

A. 使用RVM也就是Ruby Version Manager,Ruby版本管理器来升级ruby,RVM包含了Ruby的版本管理和Gem库管理(gemset)。
a. RVM安装
$ curl -L get.rvm.io | bash -s stable

RVM安装.png

b. 安装成功之后,执行下面命令进行验证。
$ source ~/.bashrc
$ source ~/.bash_profile

进行验证.png

c. 无异常,测试是否安装正常。
$ rvm -v

打印rvm版本号.png

如果出现rvm(版本号)就算是安装RVM成功了。

d. 列出已知ruby的版本。
$ rvm list known

列出已知ruby的版本.png

稍等一下,会出现很多平台不同的ruby的版本,因为是需要2.2.2以上的版本,所以直接安装2.4.0版本。

e. 安装ruby 2.4.0
$ rvm install 2.4.0

安装ruby 2.4.0.png

安装完之后,可以ruby -v 测试一下,看看版本有没有变化。

f. ruby和gem的关系。

RubyGems 是 Ruby 的一个包管理器,它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具。
RubyGems 旨在方便地管理 gem 安装的工具,以及用于分发 gem 的服务器。这类似于 Ubuntu 下的apt-get, Centos 的 yum,Python 的 pip。
RubyGems大约创建于2003年11月,从Ruby 1.9版起成为Ruby标准库的一部分。所以当我们更新了ruby版本之后发现gem版本号也变成了最新的2.6.10。

4、安装CocoaPods

// 安装CocoaPods(OS X 10.11以前)
$ sudo gem install cocoapods
// 安装CocoaPods(10.11后苹果升级了安全策略)
$ sudo gem install -n /usr/local/bin cocoapods

如果换成国内镜像使用 gem install cocoapods 报错:
ERROR: While executing gem ... (Gem::DependencyError) Unable to resolve dependencies: cocoapods requires cocoapods-core (= 1.1.1), cocoapods-downloader (< 2.0, >= 1.1.2), cocoapods-trunk (< 2.0, >= 1.1.1), xcodeproj (< 2.0, >= 1.3.3)
说明Gem版本太低需要更新则执行:
$ sudo gem update --system

然后执行以下命令:
$ sudo gem install cocoapods

如果报错:
ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/xcodeproj

执行:
sudo gem install -n /usr/local/bin cocoapods

安装完成,输入以下命令检测是否安装成功:
$ pod --version

5、更换repo镜像

所有的项目的Podspec文件都托管在https://github.com/CocoaPods/Specs 第一次执行pod setup时,CocoaPods会将这些podspec索引文件更新到本地的 /.cocoapods/目录下,这个索引文件比较大,有380M左右,大概花了我3个多小时,噗 想知道为什么慢的原因可以参考这篇博文http://www.cocoachina.com/ios/20170208/18645.html

在github上设置pod.png

正式因为如此慢,有人在gitcafe、oschina和coding上建立了CocoaPods索引库的镜像,因为他们都是国内的服务器,所以在执行索引更新操作时,会快很多。如下操作可以将CocoaPods设置成使用国内镜像源:

// 1.移除原有服务器

  • pod repo remove master
移除原有repo服务器.png

// 2.添加境内服务器

clone境内repo服务器.png

另外,在自己工程中的Podfile文件加入下面一行描述:
source 'https://git.coding.net/hging/Specs.git'

添加默认镜像源描述.png

如果不加这一句话,它默认还是从github镜像源地址去下载的,这个不要给忘记了。

注意点:

  • master repo里面存放的是所有第三方库的地址列表,下载第三方库对应的源码还是要到指定的源码存放地址(podspecs中有指定)去下载。更换repo源只是加快了repo的下载速度,并不会加快第三方库源码的下载速度,两者是没有任何关系的。
  • 在工程中尽量避免直接使用pod update、pod install,在后面添加--no-repo-update后使用。
  • 工程中依赖第三方库版本过低,可以先到repos目录下,使用git clone更新master repo,然后在工程中使用pod update --no-repo-update命令。

上面提到的方案从一定程度上加快了CocoaPods的执行速度,但是仍然避免不了要更新全部repo的情况,而实际情况是我们项目当中用到的第三方库大部分只需要十几个,大量的时间被浪费在我们不需要的库上面了。因为CocoaPods是使用中心化的方式来进行管理的,所以当第三方库多起来的时候,就会出现刚才的情况,这个时候可以选择使用Carthage来管理第三方库,它比CocoaPods最大的优势就在于去中心化的方式来管理,不过Carthage的缺点是里面的库还不是很丰富,不过随着时间的推移就不是问题了。

二、CocoaPods 的使用

1、新建 Podfile 文件

使用时需要在你的项目根目录下新建一个名为Podfile的文件,将依赖的库名字依次列在文件中即可。
//进入你的工程目录
$ cd /Users/***/Demo
//创建Pods文件
$ touch Podfile

2、编辑 Podfile 文件
假设我们想导入 AFNetworking ,进入http://cocoapods.org, 搜索AFNetworking。

搜索AFNetworking.png

//在工程中添加第三方
$ vim Podfile

Podfile 文件的使用方法官方已经更新,格式如下:

  platform :ios, "8.0"

  target '工程名' do

  pod 'AFNetworking'
  end

target 后面接的是你的工程的名字
在文本编辑界面按ESC切换为末行模式输入:wq按下回车返回终端命令行输入

配置Podfile信息.png

3、执行导入命令
进入根目录执行:

  • $ pod install
成功导入第三方库信息.png

pod install命令执行成功后,会看到工程目录下多出Foream.xcworkspace、Podfile.lock文件和Pods目录。再看看刚才执行完pod install命令打印出来的内容的最后一行:From now on use Foream.xcworkspace.提示我们从现在起,我们需要使用Foream.xcworkspace文件来开发。

//更新 CocoaPods 或者以前手动添加过第三方SDK改用Cocopods,可能会出现以下的错误:

  • [!] The Foream [Release] target overrides the HEADER_SEARCH_PATHS build setting defined in `Pods/Target Support Files/Pods-Foream/Pods-Foream.release.xcconfig'. This can lead to problems with the CocoaPods installation
    • Use the $(inherited) flag, or
    • Remove the build settings from the target.

产生此警告的原因是项目 Target 中的一些设置,CocoaPods 也做了默认的设置,如果两个设置结果不一致,就会造成问题。

打开.xcworkspace工程设置,分别在我的项目中定义PODS_ROOT 和 Other Linker Flags的地方,把他们的值用$(inherited)替换掉,或者

      Build Setting --> HEADER_SEARCH_PATHS--> 添加$(inherited)
      Build Setting --> LIBRARY_SEARCH_PATHS--> 添加$(inherited)

进入终端,执行

  pod update

警告没了

一种简单粗暴的方法:

点击项目文件 project.xcodeproj,右键显示包内容,用文本编辑器打开project.pbxproj,删除OTHER_LDFLAGS的地方,保存,pod update,警告没了。。。。

4、第三方库更新

只需要在Podfile文件中添加相应的第三方库信息,执行pod update命令即可。

更新MJRefresh.png
pod update.png

5、文件和指令说明

  • Podfile.lock文件
    • 最后一次更新Pods时, 所有第三方框架的版本号
  • 常用指令的区别
    • pod install
      • 会根据Podfile.lock文件中列举的版本号来安装第三方框架
      • 如果一开始Podfile.lock文件不存在, 就会按照Podfile文件列举的版本号来安装第三方框架
      • 安装框架之前, 默认会执行pod repo update指令
    • pod update
      • 将所有第三方框架更新到最新版本, 并且创建一个新的Podfile.lock文件
      • 安装框架之前, 默认会执行pod repo update指令
    • pod install --no-repo-update
    • pod update --no-repo-update
      • 安装框架之前, 不会执行pod repo update指令
  • 关于Podfile文件编辑时,第三方库版本号的各种写法
    pod ‘AFNetworking’ //不显式指定依赖库版本,表示每次都获取最新版本
    pod ‘AFNetworking’, ‘2.0’ //只使用2.0版本
    pod ‘AFNetworking’, ‘>2.0′ //使用高于2.0的版本
    pod ‘AFNetworking’, ‘>=2.0′ //使用大于或等于2.0的版本
    pod ‘AFNetworking’, ‘<2.0′ //使用小于2.0的版本
    pod ‘AFNetworking’, ‘<=2.0′ //使用小于或等于2.0的版本
    pod ‘AFNetworking’, ‘~>0.1.2′ //使用大于等于0.1.2但小于0.2的版本,相当于>=0.1.2并且<0.2.0
    pod ‘AFNetworking’, ‘~>0.1′ //使用大于等于0.1但小于1.0的版本
    pod ‘AFNetworking’, ‘~>0′ //高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本

写作此博文时大量参考了以下文章:

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

推荐阅读更多精彩内容

  • CocoaPods 是什么? CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具。CocoaPo...
    朝洋阅读 25,662评论 3 51
  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 21,615评论 0 39
  • 我们所记录的,都是已知的 我们所幻想的,都是不曾拥有的 能用什么去表达深刻? 地球伪装成太阳的中心 痛苦伪装成幸福...
    之蛇阅读 301评论 0 1
  • 马列死杂狗,为什么都这么恶心?
    孙大圣_8a6e阅读 121评论 0 0
  • 在生活中,大多数人并没有严格去区分家人、爱人、亲人这样的概念。 很多时候在使用时并没有多大差别,可它们之间确实有一...
    C小呆阅读 450评论 0 1