前言
在iOS项目中使用第三方类库可以说是非常常见的事,但是要正确地配置他们有时候是非常繁琐的事情,幸运的是CocoaPods是一个很好的解决方案。
一、什么是CocoaPods
CocoaPods是一个负责管理iOS项目中第三方开源库的工具。CocoaPods的项目源码在Github上管理。该项目开始于2011年8月12日,在这两年多的时间里,它持续保持活跃更新。开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和更新第三方开源库的时间
Cocoapods意义体现在两个方面。
- 第一,在引入第三方库时它可以自动为我们完成各种各样的配置,包括配置编译阶段、连接器选项、甚至是ARC环境下的-fno-objc-arc配置等。
- 第二,使用CocoaPods可以很方便地查找新的第三方库,这些类库是比较“标准的”,而不是网上随便找到的,这样可以让我们找到真正好用的类库。
二、CocoaPods的核心组件
CocoaPods是用Ruby写的,并划分成了若干个Gem包。
CocoaPods在解析执行过程中最重要的几个包的路径分别是:CocoaPods/CocoaPods、 CocoaPods/Core和 CocoaPods/Xcodeproj。
1、CocoaPods/CocoaPods
CocoaPods / CocoaPod:这是面向用户的组件,每当执行一个pod命令时,这个组件将被激活。它包括了所有实用CocoaPods的功能,并且还能调用其他gem包来执行任务。
2、CocoaPods/Core
CocoaPods / Core:Core gem提供了与CocoaPods相关的文件(主要是podfile和podspecs)的处理。
(1)、Podfile:该文件用于配置项目所需要的第三方库,它可以被高度定制。本文中我们主要在这里做动作。
(2)、Podspec:该文件描述了一个库将怎样被添加进工程中。.podspec文件可以标识该第三方库所需要的源码文件、依赖库、编译选项,以及其他第三方库需要的配置。
3、CocoaPods / Xcodeproj
CocoaPods / Xcodeproj:这个包负责处理工程文件,它能创建以及修改.xcodeproj文件和.xcworkspace文件。它也可以作为一个独立的包使用,当你要编写修改项目文件的脚本时,可以考虑使用CocoaPods/Xcodeproj。
三、Cocoapods安装步骤
1、升级Ruby环境
终端输入:
$gem update --system
此时会出现
Updating rubygems-update
Fetching: rubygems-update-2.6.6.gem (100%)
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
这个是因为你没有权限去更新Ruby。
这个时候你可以在终端使用:
$sudo gem update —system
来进行升级。
2、ruby镜像
安装CocoaPods时我们要访问cocoapods.org,该网站可能被我们大天朝墙了,这样下载安装可能会是龟速,幸好我们可以用淘宝的Ruby镜像来访问该网站,方法如下:
(1)、移除现有 Ruby 默认源
$ gem sources --remove https://rubygems.org/
(2)、使用新的源
$ gem sources -a https://ruby.taobao.org/
(3)、验证新源是否替换成功
$ gem sources -l
3、安装Cocoapods
在终端输入命令
$ sudo gem install cocoapods
$ sudo gem install -n /usr/local/bin cocoapods
$ pod setup
备注:苹果系统升级 OS X EL Capitan 后安装改为:
$ sudo gem install -n /usr/local/bin cocoapods
$ pod setup
注意:
执行pod setup 命令
出现Setting up CocoaPods master repo,说明Cocoapods在将它的信息下载到 ~/.cocoapods里;
cd 到该目录里,用du -sh *命令来查看文件大小,每隔几分钟查看一次,这个目录最终大小是733M,就是完成了,下载时间较长,请耐心等待。
ps:
错误提示
Error installing cocoapods: activesupport requires Ruby version >= 2.2.2.
解决方案 :
(1)、安装 RVM baby 版本管理器
$curl -L get.rvm.io | bash -s stable
//________等安装完成 出现下面这行提示以下___________
In case of problems: https://rvm.io/helpandhttps://twitter.com/rvm_io
执行
$source ~/.bashrc
$source ~/.bash_profile
测试是否安装正常
$rvm -v
//________提示以下___________
rvm 1.27.0 (latest) by Wayne E. Seguin, Michal Papis[https://rvm.io/]
(2)、用RVM升级Ruby查看当前ruby版本
$ruby -v
$rvm list known
//________提示以下___________
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.8]
[ruby-]2.2[.4]
[ruby-]2.3[.0]
[ruby-]2.2-headruby-head
# for forks use: rvm install ruby-head---url https://github.com/github/ruby.git --branch 2.2
# JRuby
安装ruby 2.2.2 执行
$rvm install 2.2.2
打印
ruby-2.2.2 - #validate archive
ruby-2.2.2 - #extract
ruby-2.2.2 - #validate binary
ruby-2.2.2 - #setup
ruby-2.2.2 - #gemset created /Users/abc/.rvm/gems/ruby-2.2.2@global
ruby-2.2.2 - #importing gemset
/Users/abc/.rvm/gemsets/global.gems..............................
ruby-2.2.2 - #generating global wrappers........
ruby-2.2.2 - #gemset created /Users/abc/.rvm/gems/ruby-2.2.2
ruby-2.2.2 - #importing gemsetfile /Users/abc/.rvm/gemsets/default.gems
evaluated to empty gem list
ruby-2.2.2 - #generating default wrappers........
Updating certificates in '/etc/openssl/cert.pem'.
mkdir: /etc/openssl: Permission denied
mkdir -p "/etc/openssl" failed, retrying with sudo
LiuWenqiang password required for 'mkdir -p /etc/openssl':
and sudo mkdir worked
则说明安装成功了
查看版本
$ pod --version
打印:
1.0.1
4、 更新 gem
$sudo gem update --system
5、更新master
$ pod repo update master
6、新建 Podfile 文件
在终端用 cd 指令到文件夹内,新建 Podfile 文件
$ touch Podfile
执行
$ pod install
7、添加三方库
(1)、查找
$ pod search 第三方
例如:
$ pod search AFNetworking
退出:
esc+Q
(2)、编辑Podfile文件
$ vim Podfile
进入如下页面:
然后紧接着按键盘上的“i”键,变成如下状态,这个时候可以对Podfile文件进行编辑:
$ platform:ios, '7.0'
$ target 'firstPodDemo' do
$ pod 'AFNetworking', '~> 3.1.0'
$ end
在编辑完成后按”esc”,在按”shift”+”:”,这个时候输入wq,点击回车,保存并退出。
7、导入三方库
在终端输入命令安装相应的第三方类库
$ pod install
然后安装成功
之后关闭工程,从类型为工程名.xcworkspace文件打开即可。
四、可能遇到的错误提示及解决方法
Error 1:
Error fetching http://ruby.taobao.org/:
bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
解决方案:
把安装流程中
$ gem sources -a http://ruby.taobao.org/
改为:
$ gem sources -a https://ruby.taobao.org/
Error 2:
[!] Unable to satisfy the following requirements:
- `AFNetworking (~> 2.3.1)` required by `Podfile`
Specs satisfying the `AFNetworking (~> 2.3.1)` dependency were found, but they required a higher minimum deployment target.
解决方案:
Podfile 文件 中 platform:ios, ‘8.0’ 后边的 8.0 是平台版本号 ,一定要加上。
Error 3:
The dependency `AFNetworking (~> 2.3.0)` is not used in any concrete target.
解决方案:
新的版本cocoapods
把如下代码:
$ platform:ios, '7.0'
$ pod 'AFNetworking', '~> 3.1.0'
改成:
$ platform:ios, '7.0'
$ target 'firstPodDemo' do
$ pod 'AFNetworking', '~> 3.1.0'
$ end
Error 4:
Error installing cocoapods: activesupport requires Ruby version >= 2.2.2.
解决方案 :
(1)、安装 RVM baby 版本管理器
$curl -L get.rvm.io | bash -s stable
//________等安装完成 出现下面这行提示以下___________
In case of problems: https://rvm.io/helpandhttps://twitter.com/rvm_io
执行
$source ~/.bashrc
$source ~/.bash_profile
测试是否安装正常
$rvm -v
//________提示以下___________
rvm 1.27.0 (latest) by Wayne E. Seguin, Michal Papis[https://rvm.io/]
(2)、用RVM升级Ruby查看当前ruby版本
$ruby -v
$rvm list known
//________提示以下___________
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.8]
[ruby-]2.2[.4]
[ruby-]2.3[.0]
[ruby-]2.2-headruby-head
# for forks use: rvm install ruby-head---url https://github.com/github/ruby.git --branch 2.2
# JRuby
安装ruby 2.2.2 执行
$rvm install 2.2.2
打印
ruby-2.2.2 - #validate archive
ruby-2.2.2 - #extract
ruby-2.2.2 - #validate binary
ruby-2.2.2 - #setup
ruby-2.2.2 - #gemset created /Users/abc/.rvm/gems/ruby-2.2.2@global
ruby-2.2.2 - #importing gemset
/Users/abc/.rvm/gemsets/global.gems..............................
ruby-2.2.2 - #generating global wrappers........
ruby-2.2.2 - #gemset created /Users/abc/.rvm/gems/ruby-2.2.2
ruby-2.2.2 - #importing gemsetfile /Users/abc/.rvm/gemsets/default.gems
evaluated to empty gem list
ruby-2.2.2 - #generating default wrappers........
Updating certificates in '/etc/openssl/cert.pem'.
mkdir: /etc/openssl: Permission denied
mkdir -p "/etc/openssl" failed, retrying with sudo
LiuWenqiang password required for 'mkdir -p /etc/openssl':
and sudo mkdir worked
则说明安装成功了
然后继续安装 CocoaPods
$sudo gem install cocoa pods
$sudo gem install -n /usr/local/bin cocoapods
$pod setup
Error 5:
无法搜到到最新SDK
解决办法:
执行
$ pod repo update
更新本地仓库
五、关于 Podfile.lock
当你执行pod install之后,除了 Podfile 外,CocoaPods 还会生成一个名为Podfile.lock的文件,Podfile.lock 应该加入到版本控制里面,不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后如果多次执行pod install 不会更改版本,要pod update才会改Podfile.lock了。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致。
CocoaPods 的这篇 官方文档 也在What is a Podfile.lock一节中介绍了Podfile.lock的作用,并且指出:
This file should always be kept under version control.