怎样在Swift中使用CocoaPods

怎样在Swift中使用CocoaPods

它不是神秘的亚马逊区域的部落人用手捡出来的生可可的豆荚,肯定不是!让CocoaPods website来回答可能是最好的:

CocoaPods是Cocoa项目的依赖管理工具。它有上千个能帮你优雅地扩充自己项目的库。

优雅地扩展项目听起来很令人好奇,但是什么是依赖管理工具呢?你为什么会需要它呢?

无论你正在创建一个什么样的app,你都有可能会用到别的开发者的代码,无论是以框架的形式还是库的形式。你可能很熟悉UIKit和Foundation,这两个都是苹果提供的框架。

在这个教程中,你将会:

  • 了解为什么要和第三方库做朋友
  • 安装CocoaPods
  • 在一个starter项目中使用CocoaPods
  • 安装使用并修改依赖关系文件来提高用户体验
  • 了解语义化版本控制

为什么库是你的朋友

尽管你并不一定非要使用第三方库和框架,但是它们确实能节省你很多的时间,可以让你集中注意力在优化自己的app上,而不是敲无数行的你本不需要写的代码。

你可以不通过依赖管理工具来使用第三方库和框架,我们网站提供了关于这种使用方式的实践性的教程。例如,这是我们的Alamofire教程SwiftyJSON教程

不使用依赖管理工具,你可以简单地通过手动方式将每个库添加到你的工程里面。然而,这个方法有几个缺点:

  • 更新一个库到新的版本可能会很麻烦,尤其是一个库依赖于另外一个库的情况,那么就必须将这几个库全部更新。
  • 在项目中添加三方库可能会需要在代码中做一些本地的修改,这使得之后更新版本更加困难。
  • 判断你的app中用到的库的当前版本也是一件困难的事,尤其是当你没有提前记录下来的时候。
  • 如果没有一个中央位置来查看所有可用库的话,查找新库也是一件很困难的事。

CocoaPods帮你克服以上问题甚至更多别的问题。它抓取库代码,解决库之间的依赖性问题,帮你查找并发现新的库,甚至以最简便的方式为你的项目配置正确的环境。

前提

这篇教程要求你熟悉基础的iOS和Swift开发。如果你完全不了解iOS或者Swift,那么在看这篇教程之前,你最好看下我们网站上一些其他文章或者视频教程,然后再回来看这篇。或者是深入来学习iOS Apprentice

这篇教程也包含了使用了Core Graphics的一些类。了解Core Graphics是一件有利的事,但不是必须的。如果你想学习更多关于Core Graphics的知识,请阅读我们的Modern Core Graphics With Swift系列。

这篇教程要求Xcode 6.3和Swift 1.2.

开始

首先你需要安装CocoaPods。幸运的是,CocoaPods被建立在Ruby上,而最近的Mac OS X版本带有Ruby。这自从OS X 10.7之后就实现了。

打开终端并且输入以下命令行:


1

sudo gem install cocoapods

当要求的时候输入你的密码。终端的输出结果看起来应该是这样的:

你必须使用sudo来安装CocoaPods,但是安装后就无需再使用了。

最后,在终端输入以下命令行来完成设置:


1

pod setup --verbose

这个过程可能需要几分钟的时间,因为它将CocoaPods Master Specs repository克隆到了你电脑上的~/.cocoapods/目录下。

verbose选项记录下了进程运行时的进展,能让你看到进程而不是一个僵在那里的屏幕。

太好了,现在你开始设置来使用CocoaPods了。

代码时间!

为客户Ice Cream Shop, Inc.开发一款App

你的首要客户是Ice Cream Shop, Inc。他们的冰淇淋太受欢迎了以至于不能在柜台接收用户订单了。他们雇佣你来做一个漂亮的iOS应用,那样就能让用户在他们的iPhone上下订单了。

你开始开发app了,并且进展得还不错。在这里下载开始程序

打开IceCreamShop.xcodeproj,然后运行,你会看到一个非常好吃的香草冰淇淋。

用户应该能从这个屏幕中选择冰淇淋的口味,但是还不太可能,因为你还没有完成这个功能。

从Views/Storyboards&Nibs中打开Main.storyboard来看app的布局。现在我们来快速整体地看一下这个app的核心,"选择你的口味"那一屏:

  • PickFlavorViewController处理用户交互,例如,用户选择了冰淇淋的一种口味。
  • PickFlavorDataSource是collection view所展示的不同冰淇淋口味的数据源。
  • IceCreamView是一个自定义的view,可以用来展示冰淇淋圆锥形的蛋卷,并且它以Flavor model来支撑。
  • ScoopCell是一个自定义的collectionviewcell,它包含了一个ScoopView,这个view也是以Flavor model来支撑的。

由于每个冰淇淋店一般都会有一些招牌口味,每个也有他们本地的风味。因此,Flavor的实例中包含的数据需要通过web service来提供。

然而,这还没有回答问题,"为什么用户不能选择一个冰淇淋口味?"

在Controllers这个分组下面,打开PickFlavorViewController.swift,你会看到一个备用的方法:


1

2

private func loadFlavors() {

  // Implement this}

哈哈,这里面没有口味,你需要实现它。

你可以使用NSURLConnection或NSURLSession并用你自己写的网络类,这儿还有一个更简单的办法:Alamofire,一个开源的网络库。

你可能想就这么把它下载下来并将文件拖拽到工程里面。然而,那是很麻烦的方法。CocoaPods提供了更加优雅和灵活的解决方法。

所以,闲话少说...

安装你的第一个依赖管理工具

首先你要关掉Xcode

是的,你说的对,该创建Podfile了,在那儿你要定义工程的依赖管理。

打开终端,用 cd 命令进入包含你IceCreamShop项目的那个目录下:


1

cd ~/Path/To/Folder/Containing/IceCreamShop

接下来,输入下面的命令:


1

pod init

这将为你的项目创建一个PodFile

输入下面的命令行打开PodFile,并使用Xcode进行编辑:


1

open -a Xcode Podfile

注意:你不能使用TextEdit来编辑Podfile,因为它有可能用图形化的更有吸引力的typeset quotes代替standard quotes,这可能导致CocoaPods不能理解并抛出错误,所以最好用Xcode或者别的编程文本编辑器来编辑你的Podfile。

默认的podFile看起来是这样的:


1

2

3

4

5

# Uncomment this line to define a global platform for your project# platform :ios, ‘6.0‘ 

target ‘IceCreamShop‘ do

end 

target ‘IceCreamShopTests‘ do

end

将注释的内容替换成下面的两行:


1

platform :ios, "8.0"use_frameworks!

这就告诉了CocoaPods--你的项目使用的是iOS 8.0,并且将使用框架来代替静态库。

想要在Swift中使用CocoaPods,你必须明确的写出use_frameworks! 来选择使用框架。如果你忘了写这个,CocoaPods能检测到你使用使用Swift CocoaPods,你安装pods的时候就会报错。

如果你仅仅使用过Swift编程,这可能看起来有些奇怪--那是因为Podfiel实际上使用Ruby写的。你无需为了使用CocoaPods而学习Ruby,但是你要知道即使是很小的文字错误通常也会使CocoaPods出错。

关于“库”

你会看到"library"通常代指库或框架。很抱歉这个教程也在无意间混杂了这两个概念。实际上,当某人提到"Swift library",他们实际上指的是"Swift dynamic frameworks",因为swift不允许静态库。

你可能想知道,"库(library)和框架(frameworkd)和cocoaPod之间的不同之处"。
Cocoapod或者简写为"pod"是一种惯常的叫法,用来表示使用Cocoapods工具添加库或者框架到你的应用程序中。

iOS 8引入了动态框架,这就允许了代码、图片和其他的东西(assets)可以被一起打包。在iOS 8之前,CocoaPods被作为静态库来创建,就是很"臃肿的"二进制文件。这意味着它包含了一些代码说明设置(例如i386 for the simulator, armv7 for devices等),但是它们不允许包含任何资源,例如图片或资产。

另外一个重要的区别是动态框架有命名空间类,而静态库没有。所以,如果单个项目中不同的静态库里分别有一个叫做MyTestClasses的类,那么Xcode可能不能成功创建工程因为它会因重复的标识而导致连接失败。然而,Xcode很乐意在一个工程里的不同框架下分别有一个名字相同的类。

为什么这很重要?不像OC,标准的Swift运行时库(runtime libraries)没有包含在iOS中!这意味着你的框架必须包含了必要的Swift运行时库。因此,用Swift语言写的pods必须以动态框架形式创建。如果苹果允许Swift静态库,那么使用同一个标准运行时依赖的不同库中将会产生重复符号。

幸运的是,CocoaPods为你做了这些事。它甚至能做到一次性包含需要的依赖关系。你所要做的就是在使用swift cocoaPods时记得在Podfile中包含use_frameworks! ,那就没问题了。

amazing,对不对?

安装你的第一个依赖关系

这是使用cocoapods安装你的依赖性文件的最后的时刻。将下面的内容添加到你的Podfile里面


1

pod ‘Alamofire‘‘1.2.3‘

这个是告诉CocoaPods你想添加1.1.4版本的Alamofire到你的工程中作为一个依赖性文件,这是写这篇教程时的最新版本。

保存并关闭podFile

现在你需要告诉Cocoapods为你的工程安装依赖性文件。在终端中输入下面的命令,但是要首先确认你还在包含了IceCreamShop和Podfile的目录下:


1

pod install

你会看到输出结果与下面的类似


1

2

3

4

5

Analyzing dependencies

Downloading dependencies

Installing Alamofire (1.1.4)Generating Pods project

Integrating client project

 [!] Please close any current Xcode sessions and use `IceCreamShop.xcworkspace` for this project from now on.

使用Finder打开你的工程文件夹,你看看到CocoaPods创建了一个新的IceCreamShop.xcworkspace文件和一个Pods文件来存储所有的工程依赖文件。

注意:从现在开始,就像命令行警告提示的,你必须使用workspace文件而不是project,否则你将遇到编译错误。

太棒了!你已经使用CocoaPods添加了你的第一个依赖管理。

使用安装好的Pods

如果已经打开了Xcode工程,那要关闭它并打开IceCream.xcworkspace.

打开PickFlavorViewController.swift,在现有的导入下添加以下代码:


1

import Alamofire

点击command+b进行编译。如果一切都没有问题,你不会收到任何编译错误的。

接下来,用下面的代码代替loadFlavors()方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

private func loadFlavors() {

  let urlString = "http://www.raywenderlich.com/downloads/Flavors.plist"   // 1

  Alamofire.request(.GET, urlString, encoding: .PropertyList(.XMLFormat_v1_0, 0))

    .responsePropertyList { request, response, array, error in     // 2

    if let error = error {

      println("Error: \(error)")     // 3

    else if let array = array as? [[String: String]] {       // 4

      if array.isEmpty {

        println("No flavors were found!")       // 5

      else {

        self.flavors = self.flavorFactory.flavorsFromDictionaryArray(array)

        self.collectionView.reloadData()

        self.selectFirstFlavor()

      }

    }

  }}

下面是对这个过程的详细描述:

1.你用Alamofire创建了一个get请求,并下载了一个包含冰淇淋口味的plist文件。

2.一般你去看查看请求是否出错并解析错误。现在如果出错的话你只需要打印错误。

3.将一个AnyObject?类型数组转换为字典数组。

4.如果数组是空的,你只需要打印一个错误信息。

5.如果一切都OK的话,你就将FlavorFactory方法创建的包含Flavor对象的数组赋值给self.flavors。这是一个同事为你写的类,是用来将装了字典类型对象的数组转换为Flavor对象。如果你喜欢的话你可以仔细看看这个工厂类,但是它对教程的其他部分不是特别重要。

编译并运行!现在你可以选择一个冰淇淋口味了!

选择装饰物

app看起来很不错了,但是你仍然可以进行优化。

你有没有注意到app花费了几秒钟的时间来下载flavors文件?如果你的网络很快的话你可能注意不到,但是用户不会都这么幸运的。

为了让用户理解app现在正在加载什么内容,你可以显示一个加载指示器。MBProgressHUD是个很不错的加载指示器.并且它支持CocoaPods,多么的巧合!

你需要把这个加入到你的podfile里面。你现在不用通过命令行打开podfile了,你可以在工作区的pods中找到它。

打开podFile并在Alamofire后面加入下面几行:


1

pod ‘MBProgressHUD‘‘~> 0.9.0‘

保存文件,并在终端通过pod install命令来安装依赖文件,就像你之前做的那样。

这次发现什么不同的了吗?对,你写出了具体的版本号~>0.9.0。这儿会发生什么呢?

Cocoapods建议所有的pods都使用语义化版本号(Semantic Versioning)。

语义化版本号

这三个数字被定义为主要的,次要的和补丁版本号。例如,版本号0.9.0会被翻译为

当主要的(major)版本号数字增加时, 意味着你做了一些不能兼容旧版本的更新。当你将pod升级到下一个主要版本时,你可能需要修复编译错误,否则pod可能跟之前表现得不太一样。

当次要(minor)版本号增加时,意味着增加了新功能,但同时兼容旧版本。当你决定升级时,你可能需要也可能不需要新的功能,但是它不应该引起编译错误或者改变现有的功能。

当补丁(patch)版本号增加的时候,这意味着做了bug修复。但是没有没有增加也没有改变功能。一般来说,你会希望尽快更新补丁版本到最新的版本,以便使用最新最稳定版本的pod。

最后,最高版本号(major>minor>patch)必须按照以上规则逐步增加,而较低的版本号必须从0开始。

需要一个例子吗?

考虑一个当前版本为1.2.3的pod。

如果做了一些不能向后兼容的改变,没有新的功能,但是修改了现有的bug,那么下一个版本是2.0.0

挑战时间

1.如果一个pod当前版本号是2.4.6,并且做了一些修复bug的改变,添加了一些向后兼容的功能,新版本应该是多少呢??

答案:2.5.0

解释:如果修改包含向后兼容的新功能,次要版本号(monir)就要增加了,并且补丁版本号(patch)就要被置为0.

2.如果一个pod的当前版本是3.5.8,并且对当前的功能做了一些改变,新版本应该是多少?

答案:4.0.0

解释:如果改变修改了现有的功能,那么这就是不向后兼容的。所以,主要版本号(major)必须增加,而次要版本和补充版本置为0.

3.如果一个pod的向前版本号是10.20.30并且只修复了一些bug,那么新版本号应该是多少?

答案:10.20.31

解释:如果只修复了bug,补充版本号(patch)就要增加了。

说了这么多,这儿有一个例外:

如果一个pod的版本低于1.0.0,这就被认为是测试版,次要版本号(minor)增加可能意味着向后兼容的改变。

所以在MBProgressHUB中使用~>0.9.0意味着你需要安装大于或者等于0.9.0但是小于0.10.0的最新的版本.

这就保证了你在安装pod的时候获得了最新的bug修复,但是不会意外的拉去向后兼容的改变。这儿还有一些其他的可用操作。具体的列表,请看Podfile Syntax Reference

显示进程

现在,回到PickFlavorViewController.swift,在其他的引用下面添加下面的内容


1

import MBProgressHUD

下一步,在loadFlavors()后面加入以下方法


1

2

3

4

5

private func showLoadingHUD() {

  let hud = MBProgressHUD.showHUDAddedTo(contentView, animated: true)

  hud.labelText = "Loading..."

private func hideLoadingHUD() {

  MBProgressHUD.hideAllHUDsForView(contentView, animated: true)}

现在在loadFlavors()方法中,添加下面代码:


1

2

3

4

5

6

private func loadFlavors() {

    let urlString = "http://www.raywenderlich.com/downloads/Flavors.plist"

    showLoadingHUD()  // <-- Add this line

    Alamofire.request(.GET, urlString, encoding: .PropertyList(.XMLFormat_v1_0, 0))

      .responsePropertyList { request, response, array, error in       self.hideLoadingHUD()  // <-- And this line       if let error = error {

  //...

就像方法名字所表明的,showLoadingHUD()方法会在GET请求下载时产生一个MBProgressHUD的实例对象,当请求结束时hideLoadingHUD()会将HUD隐藏。由于showLoadingHUD()在闭包之外所以它不需要前置代码self。

编译运行。现在你会看到一个加载指示器:

干的漂亮!用户现在可以选择他们最喜欢的冰淇淋口味了,并且在口味文件下载的时候会显示一个正在加载的指示器。

下一步

你可以从这儿 下载完整的项目

恭喜你,现在你已经学会了使用cocoapods的基础,包括创建和修改依赖性文件,并且理解了语义化版本号。现在你可以准备开始在你自己的项目中使用他们了。

当然你 还可以用cocoapods做很多别的事。你可以在Cocoapods官方网站上搜索现有的pods。也可以参考Cocoapods指南去学习如何使用这个杰出工具的更多细节内容。但是要记住,一旦你开始使用你会好奇你曾经是怎么不用它来进行管理的!

时间: 2024-10-04 00:28:18

怎样在Swift中使用CocoaPods的相关文章

怎样在swift中使用cocoapods导入的第三方oc库

假如你来到这里,说明你已经開始着手使用swift这门新语言了. 就像Java有Maven一样.Objective-C也有自己的依赖管理工具cocoapods. 可是因为swift才出来不久,眼下非常多cocoapods管理的第三方库依旧是由Objective-C编写的. 为了可以在swift中使用这些类库.须要在Xcode中进行一些配置. 如果你的项目是基于cocoapods的,而且是通过XX.xcworkspace打开的.(Xcode6以上) 为了进行演示,如果导入的第三方库是MBProgre

如何在swift中使用cocoapods导入的第三方oc库

假如你来到这里,说明你已经开始着手使用swift这门新语言了. 就像Java有Maven一样,Objective-C也有自己的依赖管理工具cocoapods. 但是由于swift才出来不久,目前很多cocoapods管理的第三方库依然是由Objective-C编写的. 为了能够在swift中使用这些类库,需要在Xcode中进行一些配置. 假设你的项目是基于cocoapods的,并且是通过XX.xcworkspace打开的.(Xcode6以上) 为了进行演示,假设导入的第三方库是MBProgres

swift中使用CocoaPods

参考文:http://www.cocoachina.com/swift/20150630/12305.html 1.首先你需要安装CocoaPods.幸运的是,CocoaPods被建立在Ruby上,而最近的Mac OS X版本带有Ruby.这自从OS X 10.7之后就实现了. 打开终端并且输入以下命令行: sudo gem install cocoapods 在终端输入以下命令行来完成设置: pod setup --verbose 2.关掉程序,打开终端,用 cd 命令进入包含你IceCrea

怎样在Swift中使用CocoaPods-b

最近关于CocoaPods有很多的议论.你可能从别的开发者那里听到过,或者在Github的目录中看到过.如果你之前从来没有用过,你可能会问,"CocoaPods到底是什么?" 它不是神秘的亚马逊区域的部落人用手捡出来的生可可的豆荚,肯定不是!让CocoaPods website来回答可能是最好的: CocoaPods是Cocoa项目的依赖管理工具.它有上千个能帮你优雅地扩充自己项目的库. 优雅地扩展项目听起来很令人好奇,但是什么是依赖管理工具呢?你为什么会需要它呢? 无论你正在创建一个

(转)在 Swift 和 Objective-C 项目中使用 CocoaPods

在 Swift 和 Objective-C 项目中使用 CocoaPods 2016-07-13  838 作者:Gregg Mojica,原文链接,原文日期:2016/06/24译者:saitjr:校对:Cee:定稿:千叶知风 CocoaPods——Swift 与 Objective-C 项目的依赖管理工具,iOS 开发者的必备技能.如果你没有任何 CocoaPods 经历,那么这篇短文就是为你而写.我们将会学到什么是 CocoaPods,为什么我们要使用它,还有怎样开始使用它! AppCod

如何在Swift中创建自定义控件

更新通知:这篇引导教程由Mikael Konutgan使用iOS 8和Swift语言重新制作,在Xcode6和7上测试通过.原始教程是由Colin Eberhardt团队制作的. 用户界面控件是许多应用的重要组成部分.使用这些控件,可以让用户查看应用的内容或与他们的应用进行交互.苹果提供了一个控件集,像UITextField, UIButton 和 UISwitch.灵活使用这些工具箱中已经存在的控件,可以让你创建各种各样的用户界面. 但是,有的时候你可能需要做一些与众不同的事情:库中的控件已经

Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)

一.介绍 随着Swift的逐渐成熟,使用swift开发或者混合开发已经成为了一个趋势,本身苹果公司也十分推荐使用Swift这门新语言.目前Swift已经更新到了3.0,估计没有多久4.0就要出来了.那么再用Swift开发时遇到一些问题不可避免,下面就来解决几个常遇到的问题. 二.问题和解决办法 如何在Swift中手动桥接OC? 1.创建swift桥接文件   2.设置桥接文件路径,也即Objective-C Bridging Header的路径,设置完就可以导入自定义的OC类文件使用了 如何使用

Swift Tips - 当 Swift 遇上 CocoaPods

CocoaPods 作为 iOS 开发的包管理工具,几乎成为了 Objective-C 的行业标准.它为我们提供了非常方便的包管理功能.而苹果正式发布 Swift 语言也已经有半年多时间了,Swift 作为 iOS 开发语言发布后,迅速的被开发者们所接受.而随之而来的,就是越来越多用 Swift 写出得第三方库的管理问题.而 CocoaPods 的最新预览版已经支持了 Swift 语言.这对已经开始使用 Swift 来进行开发的朋友无疑是一个很大的福音. CocoaPods 简介 这一小节是对

swift中第三方网络请求库Alamofire的安装与使用

swift中第三方网络请求库Alamofire的安装与使用 Alamofire是swift中一个比较流行的网络请求库:https://github.com/Alamofire/Alamofire.下面我们就介绍一个这个库的安装与使用. 一.安装包管理工具CocoaPods 由于国内容易被墙,速度也非常的慢,这里我们使用提供的源 http://ruby.taobao.org/ gem sources --remove https://rubygems.org/ gem sources –a htt