CocoaPods 的安装和使用
一、CocoaPods是什么?
当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等。可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他类库,“子子孙孙无穷尽也”,这也许是比较特殊的情况。总之小编的意思就是,手动一个个去下载所需类库十分麻烦。另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下载新版本,重新加入到项目中,十分麻烦。如果能有什么工具能解决这些恼人的问题,那将“善莫大焉”。所以,你需要 CocoaPods。
CocoaPods应该是iOS最常用最有名的类库管理工具了,上述两个烦人的问题,通过cocoaPods,只需要一行命令就可以完全解决,当然前提是你必须正确设置它。重要的是,绝大部分有名的开源类库,都支持CocoaPods。所以,作为iOS程序员的我们,掌握CocoaPods的使用是必不可少的基本技能了。
二、如何下载和安装CocoaPods?
如果没有安装好,那么
http://blog.csdn.net/john_ls/article/details/51035499
1、安装ruby环境
(1) 安装 RVM
RVM 是干什么的这里就不解释了,后面你将会慢慢搞明白。终端中输入:
curl -L https://get.rvm.io | bash -s stable
期间可能会问你sudo管理员密码,以及自动通过homebrew安装依赖包,等待一段时间后就可以成功安装好 RVM。
然后,载入 RVM 环境(新开 Termal 就不用这么做了,会自动重新载入的)
source ~/.rvm/scripts/rvm
检查一下是否安装正确
rvm -v
终端中会出现以下信息:
rvm 1.22.17 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]
(2) 用 RVM 安装 Ruby 环境
列出已知的ruby版本
rvm list known
可以选择现有的rvm版本来进行安装(下面以rvm 2.0.0版本的安装为例)
rvm install 2.0.0
同样继续等待漫长的下载,编译过程,完成以后,Ruby, Ruby Gems 就安装好了。
另附:
查询已经安装的ruby
rvm list
卸载一个已安装版本
$ rvm remove 1.9.2
(3) 设置 Ruby 版本
RVM 装好以后,需要执行下面的命令将指定版本的 Ruby 设置为系统默认版本
rvm 2.0.0 --default
同样,也可以用其他版本号,前提是你有用rvm install
安装过那个版本
这个时候你可以测试是否正确
ruby -v
出现:
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin13.0.0]
输入:
$ gem -v
出现:
2.1.6
2、假如你在本地已经安装好Ruby环境,在终端中安装CocoaPods时,会发现半天没有任何反应。原因无他,因为那堵墙阻挡了cocoapods.org。
打开Terminal,然后键入以下命令:
$ sudo gem update --system 升级gem
$ gem sources -l (查看当前ruby的源)
$ gem sources --remove https://rubygems.org/
$ gem sources -a https://gems.ruby-china.com (以前是gem sources -a https://gems.ruby-china.org/,以前 gem sources -a https://ruby.taobao.org/,貌似不能用了)
$ gem sources -l
然后执行cocoapods的安装下载命令
$ gem install cocoapods --pre
等着就好了。
然后执行:
pod setup
当pod setup 进入Setting up CocoaPods master repo
等待的时候表示正在下载了,此时你可通过新开一个终端窗口,输入
cd ~/.cocoapods/
命令行跳到cocoapods文件夹内,执行
du -sh *
查看正在下载的文件。
三、使用cocoa pods
进入工程所在的目录(工程根目录)
执行命令
$ vim Podfile
这句是说新建一个名为Podfile的文件(不能写成别的名字,也可以自己在工程根目录里面直接新建)
然后在Podfile文件中输入以下文字:
platform :ios, '7.0'
use_frameworks!
target 'MyAppTarget' do
pod 'AFNetworking', '~> 3.0.4'
end
需要注意的几点:platform那一行,ios三个字母都要小写,而且与前 面的冒号之间不能有间隔,后面的版本号也可以不写,但是有些开源库对版本是有要求的,比如要在6.0以上才能运行,遇到这样的开源库就需要写上版本号。另外,MyAppTarget是你自己工程里面的target
platform下面就是Cocoapods需要集成的开源库,根据你的需要确定集成那些库。
然后保存退出。vim环境下,保存退出命令是:vim下保存退出,先按esc键,再输入
:wq
举个例子:
我要集成AFNetworking这个库类,需要在Cocoapods里面先搜索是否有需要的库,可以在Terminal中输入:
pod search AFNetworking
回车之后就可以看到和你搜索的关键字相关的一些库类,如图:
7C5989DA-5BDE-447B-912C-0CE192E8A431.png其中第一个就是我们需要的,把pod ‘AFNetworking’, ‘~>3.1.0’
那一行复制到我们的Podfile文件中,保存修改。
然后在Terminal中执行 :
pod install
或者pod install --verbose --no-repo-update
这样,AFNetworking就已经下载完成并且设置好了编译参数和依赖, 以后使用的时候切记如下两点:
1.从此以后需要使用Cocoapods生成的 .xcworkspace文件来打开工程,而不是使用以前的.xcodeproj文件
2.每次更改了Podfile文件,都需要重新执行一次pod update命令
ps:当执行pod install之后,除了Podfile,还会生成一个名为Podfile.lock的文件,它会锁定当前各依赖库的版本,之后即使多次执行pod install也不会更改版本,只有执行pod update才会改变Podfile.lock.在多人协作的时候,这样可以防止第三方库升级时候造成大家各自的第三方库版本不一致。所以在提交版本的时候不能把它落下,也不要添加到.gitignore中。这时的程序需要用后缀名为.xcworkspace 的文件打开。
1、如果不能生成.xcworkspace 的文件
更新版本试试:sudo gem install cocoa pods
2、swift pod OC文件后,例如:AFNetworking
可以直接在文件中import AFNetworking
使用
四、如何正确编译运行一个包含CocoPods类库的项目
你也许曾经遇到过(特别是新手iOS开发者)这种情况,好不容易在GitHub上找到一份代码符合自己想需求,兴冲冲下载下来,一编译,傻眼了,发现有各种各样错误。一看,原来是缺失了各种其他第三方类库。这时候莫慌,你再仔细一看,会发现你下载的代码包含了Podfile。没错,这意味着你可以用CocoaPods很方便下载所需要的类库。
下面,以代码 UAAppReviewManager 为例来说明如何正确编译运行一个包含CocoPods类库的项目。
UAAppReviewManager是一个能够让你方便地将提醒用户评分的功能加入你的应用中。当你去UAAppReviewManager的GitHub地址下载这份代码之后,打开Example工程(UAAppReviewManagerExample),编译,你会发现Xcode报告一大堆错误,基本都是说你编译的这份代码找不到某某头文件,这就意味着你要成功编译UAAppReviewManager的Example代码,必须先导入一些第三方类库。同时你会发现在UAAppReviewManagerExample文件夹下面有三个跟CocosPods相关的文件(文件夹):Podfile,Podfile.lock和Pods.
这时候,打开终端,进入UAAppReviewManagerExample所在的目录,也就是和Podfile在同一目录下,和场景1一样,输入以下命令(由于已经有Podfile,所以不需要再创建Podfile):
$ pod update
过几秒(也许需要十几秒,取决于你的网络状况)之后,终端出现:
Analyzing dependencies
Fetching podspec for `UAAppReviewManager` from `../`
Downloading dependencies
Installing UAAppReviewManager (0.1.6)
Generating Pods project
Integrating client project
[!] From now on use `UAAppReviewManagerExample.xcworkspace`.
这时候,再回到UAAppReviewManagerExample文件夹看一看,会看到多了一个文件UAAppReviewManagerExample.xcworkspace:
根据终端的信息提示,你以后就需用新产生的 UAAppReviewManagerExample.xcworkspace来运行这个Example代码了。
打开UAAppReviewManagerExample.xcworkspace,编译运行,成功!
注意,这里有个小问题,如果刚刚你不是输入 pod install,会发现类库导入不成功,并且终端出现下面提示:
[!] Required version (UAAppReviewManager (from `../`)) not found for `UAAppReviewManager`.
Available versions: 0.1.6
这里的意思大概是Podfile文件过期,类库有升级,但是Podfile没有更改。 pod update会更新所有的类库,获取最新版本的类库。而且你会发现,如果用了 pod install 就成功了。
那你也许会问,什么时候用 pod update 呢,我又不知道类库有没有新版本。好吧,那你每次直接用 pod install,如果不行,再用 $ pod update。
五、常见问题
- [!] Invalid Podfile file: undefined local variable or method `en_US' for #<Pod::Podfile:0x00000102a5d8b0>. Updating CocoaPods might fix the issue.
原因:单引号格式,可能是手动输入导致
解决办法:系统偏好设置-键盘-文本-将“使用智能引号和破折号”一项取消勾选-再将podfile里面的单(双)引号修改一下
2.[!] Oh no, an error occurred.
It appears to have originated from your Podfile at line 2.
Search for existing GitHub issues similar to yours:
https://github.com/CocoaPods/CocoaPods/search?q=%2FUsers%2Fxiao6%2FMusic%2FGI06%E5%AE%9E%E8%AE%AD%E8%8A%B8%E8%8C%97%E8%8C%B6%E5%8F%B6%2FYMTea%2FPodfile%3A2%3A+syntax+error%2C+unexpected+%27%3A%27%2C+expecting+end-of-input%0Aplatform+%3A+ios%2C+%277.0%27%0A++++++++++%5E&type=Issues
If none exists, create a ticket, with the template displayed above, on:
https://github.com/CocoaPods/CocoaPods/issues/new
Be sure to first read the contributing guide for details on how to properly submit a ticket:
https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md
Don't forget to anonymize any private data!
原因:这个问题比较蛋疼,弄了好久,仔细看发现就是因为Podfile文件里面 platform 那一行 冒号和ios之间多了一个空格。。。。
3.错误
ERROR: While executing gem ... (Errno::EACCES)
Permission denied @ rb_sysopen - /Users/snowcrash/.rvm/gems/ruby-2.2.3@global/wrappers/cert
解决:在终端中输入:
sudo chown -R $(whoami) /Users/snowcrash/.rvm (具体信息查看错误内容)
4.错误提醒
“Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.” when using GCC
解决:这是因为下载了新的xcode没有同意协议,打开xcode同意协议即可。
5.当出现如下错误时:
[!] An error occurred while performing `git pull` on repo `master`.
[!] /usr/bin/git pull --ff-only
这个错误应该是说这个节点有问题。就又找资料,然后试试把cocoapods的节点删除,重新添加一个节点,或许就行,说干就干:
原因: Cocoapods的分支不支持当前最新的Xcode版本
解决办法: 删除master分支 重新建立新的分支
sudo rm -fr ~/.cocoapods/repos/master
然后再: pod setup
附:如何使用CocoaPods的镜像索引:
所有项目的Podspec文件都托管在https://github.com/CocoaPods/Specs,
第一次执行pod setup时,CocoaPods会将这些podspec索引文件更新到本地的~/.cocoapods目录下,
这个索引文件比较大,所以第一次更新时非常慢.
友好人士在国内的服务器建立了Cocoapods索引库的镜像,
所以执行索引跟新操作时候会快很多.具体操作方法如下:
$ pod repo remove master
$ pod repo add master https://gitcafe.com/akuandev/Specs.git
$ pod repo update
这是使用gitcafe上的镜像,将以上代码中的 https://gitcafe.com/akuandev/Specs.git
替换成http://git.oschina.net/akuandev/Specs.git
即可使用oschina上的镜像。
3、如果提示Permission denied @ rb_sysopen - /Users/John_LS/.gemrc这个错误,那说明没有权限。
原因:我已经更新了我的rubygem像这样的gem update --syste,但是,只有我当地的gems被更新。由于gem: --user-install安装限制在我的/etc/.gemrc。当工作时,它使用全局rubygem与我无关。
解决方法:要解决这个问题,我更新了全局的RubyGems:
sudo gem update --system --no-user-install。
上述都只是CocoaPods的最基本用法。要继续研究CocoaPods其他高级用法,请点击这里CocoaPods Wiki。