通过这个教程,你会学习使用一个很流行的第三方开源组件管理工具----CocoaPods。不过这个工具是什么,为什么要使用它呢?
作为一个iOS开发者,你一定会用到很多别人的代码,这些代码以类库的形式提供。想象一下,如果所有的东西都要你从零开始创建,得有多麻烦!
如果没有管理工具,你可能会简单地将每个组件加入到你的工程中。但是,这么做有一些弊端:
1. 组件代码保存在你的工程中,浪费空间。
2. 没有一个集中的能看到所有可用组件的地方。
3. 查找和升级组件很困难,尤其是有多个组件需要升级。
4. 在你的工程中下载然后引入组件可能存在这样的风险:修改其代码,然后搁置一边。从而导致下次升级时更加麻烦。
一个第三方组件管理工具可以帮助你克服这些问题。它能自动获取组件的源代码,解决类库之间的依赖,甚至可以创建并维护一个正常的环境来创建你的项目。
在本教程中,你会学习如何使用CocoaPods。特别的是,你会使用多个开源组件来创建一个app,它可以获取并展示来自trakt.tv的电视及电影信息。CocoaPods让这个过程变得非常简单。接着往下看!
准备开始
开始之前:该教程需要你熟悉Xcode,命令行工具,了解ASIHTTPRequest组件、JSON格式。如果你对这些都不熟悉,先看看其他教程。
PS:原文中的示例太复杂,和CocoaPods关系不大,因此我强行替换成一个使用ASIHTTPRequest查询天气的示例demo。
CocoaPods官网说,它是Objective-C工程下最好的管理类库依赖的工具,这么说确实不假!与其自己从GitHub下载代码然后复制到你的工程中,导致将来升级很困难,CocoaPods可以帮你做这些事。
下面,你需要安装CocoaPods。它在Ruby下运行,不过这是它唯一的限制。幸运的是,最近版本的Mac OSX系统(从OS X10.7Lion开始)都已经预装了Ruby。所以你只需要更新RubyGems到最新版本。
打开终端,然后输入如下的命令:
- sudo gem update --system
按提示输入密码,要注意在终端中密码不显示字符,只要输完后按回车即可。终端中输入看起来应该是这样的:
更新会花费一点时间,耐心等待几分钟。
然后,你需要安装CocoaPods。在终端中输入如下命令:
- sudo gem install cocoapods
如果安装过程中遇到以下提示,输入y继续。
- rake's executable "rake" conflicts with /usr/bin/rake
- Overwrite the executable? [yN]
最后,在终端中输入如下命令来完成安装:
- pod setup
这条命令,将CocoaPods Specs repository复制到你电脑上的~/.cocoapods目录下,它需要一点时间来完成。
到这里,你已经成功安装了CocoaPods!
PS:从这里开始,不使用原文demo,自己创建一个新工程。
打开Xcode,创建一个新的singleView工程,然后关掉Xcode,是的关掉它。现在该创建你的podfile了。
安装你的第一个第三方组件
打开终端,并定位到刚刚创建的工程目录下:
- cd ~/Path/To/Folder/Containing/PodDemo
然后输入命令:
- pod init
这条命令会在你的工程下创建一个默认的Podfile。你将在Podfile里定义所用到的组件。
输入下面的命令,用Xcode打开Podfile:
- open -a Xcode Podfile
默认的Podfile看起来像这样:
- # Uncomment this line to define a global platform for your project
- # platform :ios, "6.0"
- target "PodDemo" do
- end
将# platform:ios, "6.0"替换成,告诉CocoaPods你的工程是运行在iOS7下:
- platform :ios, "7.0"
很多类库都有最低的iOS版本要求。如果你省略了这一行,CocoaPods会给一个默认的iOS版本(目前是iOS4.3)。
现在终于可以用CocoaPods加入你的第一个组件了。在Podfile中,target "PodDemo" do下面加上:
- pod 'ASIHTTPRequest', '1.8.2'
这句话告诉CocoaPods你想要在工程中引入ASIHTTPRequest Version 1.8.2。
如果你想要使用更复杂的操作,请看更多Podfile语法。
保存并关闭Podfile。
现在告诉CocoaPods去安装这些组件到你的工程中。在终端中输入(确保在项目目录下):
- pod install
你会看到如下的输出:
- Analyzing dependencies
- Downloading dependencies
- Using ASIHTTPRequest (1.8.2)
- Using Reachability (3.1.1)
- Generating Pods project
- Integrating client project
可能还会有:
- [!] From now on use `ShowTracker.xcworkspace`.
此时CocoaPods在项目目录下创建了一个Pods文件夹----用于存放所有的第三方组件,以及PodDemo.xcworkspace。
正如上面的警告提醒,从现在开始,你必须使用PodDemo.xcworkspace来打开该项目。
如果Xcode项目还打开着,关掉它,打开PodDemo.xcworkspace。
测试ASIHTTPRequest
1.在ViewController.h中导入ASIHTTPRequest头文件:
- #import <ASIHTTPRequest/ASIFormDataRequest.h>
2.给ViewController.h添加一个ASIFormDataRequest属性:
- @property (nonatomic,strong)ASIFormDataRequest *request;
3.修改ViewController.m的ViewDidLoad方法:
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
- NSURL *url = [NSURL URLWithString:@"http://www.weather.com.cn/data/sk/101010100.html"];
- self.request = [[ASIFormDataRequest alloc] initWithURL:url];
- self.request.requestMethod = @"GET";
- self.request.delegate = self;
- [self.request startAsynchronous];
- }
4.在ViewController.m中添加ASIHTTPRequest代理方法:
- - (void)requestFinished:(ASIHTTPRequest *)request
- {
- NSArray *result = [NSJSONSerialization JSONObjectWithData:request.responseData options:NSJSONReadingMutableContainers error:nil];
- NSLog(@"%@",result);
- }
运行代码,看到Console输入如下:
- 2014-10-15 14:08:24.734 PodDemo[7319:120294] {
- weatherinfo = {
- Radar = "JC_RADAR_AZ9010_JB";
- SD = "16%";
- WD = "\U5317\U98ce";
- WS = "4\U7ea7";
- WSE = 4;
- city = "\U5317\U4eac";
- cityid = 101010100;
- isRadar = 1;
- njd = "\U6682\U65e0\U5b9e\U51b5";
- qy = 1010;
- temp = 21;
- time = "13:55";
- };
- }
至此,组件已经被成功的引入到你的工程中了!
添加更多Pods
既然你已经知道CocoaPods如何工作,下面只剩下一件事可做:添加更多的Pods!
不过,事实上。。。你应该在工程中引入尽量少的pods。虽然CocoaPods让升级组件变得更容易,但是你始终要不时地更新你自己的代码。长远来看,最好的方式是让这些组件在你的控制之内。
现在向你的工程添加2个组件。比起从命令行打开Podfile,现在你可以在workspace中找到这个文件并打开。添加:
- pod 'SAMCategories', '0.5.2'
- pod 'Nimbus/AttributedLabel', '1.2.0'
保存,然后安装引用(在终端中使用pod install)。
你是否注意到Nimbus/AttributedLabel和其他pod不一样,多了一个"/"?大的pods常常将他们的库拆分成核心模块和一些小的子模块。在这个例子中,“/”表示AttributedLabel是Nimbus的子模块。
如果你不熟悉这些类库,这里有两个例子:
sstoolk是一个便捷的工具包,用于解决iOS开发者们经常遇到的问题。
Nimbus,全称NimbusKit,是另一个很有用的工具包。
为了测试一切正常,编译项目。此时,你会看到有很多警告!
“等等,我还没有更改项目代码!”你可能会这么想。
不管什么时候,你通过CocoaPods添加一个引用,它的源码已经被加入到项目中了。当你编译项目时,它们也会一起被编译。
所以,如果你加入的引用有很多警告,甚至编译报错,很可能它已经不再被维护了。
遇到这种情况,你可以在CocoaPods website上查找一个替换的组件。同时你还能找到它们的详细信息,如网站链接,说明文档,等等。
我们这个实力,大部分的警告都来源于iOS7废弃了一些方法,你可以安全地无视掉它们。
为了让CocoaPods的引入不显示警告,在Podfile最上方加上:
- inhibit_all_warnings!
重新运行pod install,编译项目,此时你应该看到警告已经不显示了。
PS: 对Podfile修改安装之后编译项目,可能会出现如下警告:
- The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
此时,正确的做法是:
I. Project Cleanup
- In the project navigator, select your project
- Select your target
- Remove all libPods*.a in Linked Frameworks and Libraries
II. Update CocoaPods
- Launch Terminal and go to your project directory.
- Update CocoaPods using the command
pod install
注意,1.3很重要。
入门教程到此结束。
使用cocoaPods和遇到的问题以及解决办法
上一篇说到cocoaPods的安装,本篇就来说说cocoaPods的使用和遇到一些问题的解决办法( ⊙ o ⊙ )
一、cocoaPods的创建使用
1、cd进入所在的项目目录
2、创建Podfile文件 $ pod init
3、编辑Podfile文件 $sudo vi Podfile
4、导入框架 $ pod ‘框架名’ 可以指定版本号$ pod ‘框架名’,’~>版本号’,一般不指定版本号,默认用最近的
5、按esc,然后输入 :wq 保存
6、添加框架, $ pod install (把xcode和模拟器都关闭了)
7、打开 项目名.xcworkspace这个文件就能打开项目了
8、添加头文件就可以用了,注意:只能用尖括号导入<>
9、框架的更新 $ pod update
10、第三方框架的追加,搜索框架 $ pod search,然后写入Podfile,使用 $ pod install
***注意,如果之前手动导入个第三方库,现在用cocoa pods的话,要修改Other Linker Flags,增加$(inherited)
二、可能遇到的问题
(1)使用cocoapods导入第三方类库后头文件没有代码提示?
解决办法: 选择Target -> Build Settings 菜单,找到\”User Header Search Paths\”设置项,新增一个值"${SRCROOT}",并且选择\”Recursive\”
(2)出现如下警告
[!] Your Podfile has had smart quotessanitised. To avoid issues in the future, you should not use TextEdit forediting it. If you are not using TextEdit, you should turn off smart quotes inyour editor of choice.
解决办法:不要使用文本编辑去编辑Podfile,使用Xcode编辑,或者使用终端敲命令去编辑。
(3) 执行pod install 或pod update 命令后,updating local specsrepositories 卡住不动
解决办法:pod install 被墙了,换成新的命令pod install --verbose --no-repo-update