iOS开发实战教学:在Swift怎样建立CocoaPod?

摘要:开发者可能对一些比较知名的开源CocoaPods框架比较熟悉,但有些时候可能找不到恰好知足需求的pod,本文做者以一个实战演练的过程详细介绍了如何使用Swift建立CocoaPods的过程。

本文出自:raywenderlich,译文出自:开发技术前线,译者:MrLoong  android

你可能会熟悉一些众所周知的、开源的CocoaPods的框架,例如AlamofireMBProgressHUD,但有的时候你并不能找到一个符合你要求的pod,或者你可能想要把一个大的项目分红小的项目,或是可复用组建。 ios

幸运的是建立本身的CocoaPods很容易。 git

若是你已经针对你的元件建立一个Cocoa Touch框架,那么就已经完成了大部分困难的工做。若是你没有建立过,不要惊慌,由于它确实很简单。 github

若是你仅仅是建立了iOS应用的一部分,那也是OK的。你能够很轻松地建立一些新的pod,用于特殊环境下使用的推送类和功能。 swift

本教程以 How to Use CocoaPods with Swift结束。若是你以前历来没有使用过CocoaPods,然而这是本教程的一个先决条件。 浏览器

开始

你的顶级客户是一个冰淇凌店,他们的冰淇凌是如此地受欢迎,他们的柜台跟不上客户的订单,须要建立一个简洁的iOS应用,让用户使用他们的Phone订购冰淇凌。你将开始开发这个应用程序。 app

从 这里下载这个开始的项目——这是How to Use CocoaPods with S wift最终版本。这个应用有一些pod开发包已经包含在下载中,因此你不须要运行pod install去安装他们。 框架

打开IceCreamShop.xcworkspace,而后点击Main.storyboard,在Views\Storyboards & Nibs看看这个应用是如何布局的。 ide

下面是快速Choose Your Flavor的应用场景,核心功能以下: oop

  • PickFlavorViewController: handles user interaction, such as when
  • the user selects an ice cream flavor.
  • PickFlavorViewController:处理用户交互,例如当用户选择一个口味的冰淇凌的时候
  • PickFlavorDataSource: is the data source for the collection view
  • that displays ice cream flavors.
  • PickFlavorDataSource:是选择冰淇凌口味试图的数据源。
  • IceCreamView: is a custom view that displays an ice cream cone and
  • is backed by a Flavor model.
  • IceCreamView: 是一个冰淇凌自定义模型。
  • ScoopCell: is a custom collection view cell that contains a
  • ScoopView, which is also backed by an instance of the Flavor
  • model class.
  • ScoopCell:自定义集合试图集合单元包含一个ScoopView,也是风味模型的一个支持类。

 

这个冰淇凌店的老板很是喜欢这个应用程序,但他们又添加了一个新的要求:在他们的应用程序中须要有相同的口味风格选择。

等等,那不是最初的设计,可是,对于一个NB的开发者来讲,应该没有问题的。

 

你能猜猜这个功能是怎么作的吗?是的,你将把这个功能集成到你本身的CocoaPod!。

创建你本身的Pod

建立一个新的Xcode项目而且选择iOS\Framework & Library\Cocoa Touch Framework,而后点击下一步:

将工程命名为RWPickFlavor,并选择Swift语言,点击Next。

这个教程的工程将建立在~/Documents/Libraries,在你的主目录中选择Documents文件夹。若是你没有Libraries文件夹,在底部点击新建文件夹按钮而且建立它。

最后,选择Libraries文件夹并单击建立。

保存你开发的pods这个目录很是重要,由于在本地开发Podfile期间,你将引用这个目录。

正常状况下,当你使用CocoaPods,你在你的Podfile包含的关系是:

pod ' PodName ', '~> 1.0'
可是当你开发你本身的CocoaPod,你将在本地创建一个特殊的路径,像这样: 
pod ' MyPodName ', :path => ' ~/Path/To/Folder/Containing/My/Pod '

这种方法有两种好处:

  • 对于你的pod,它是使用本地机器上的文件,而不是从远程仓库中获取。
  • 正常状况下,你不须要选择一个pod包含到你的App中,由于这些选择将在你下一次运行pod install时被覆盖,pod将会从新从远程仓库读取而且覆盖更改的文件。

你可使用不一样的位置对你的pods进行开发,通常状况下我建议仍是将它们放在~/Documents/Libraries。若是你和一个团队合做开发,CocoaPods扩展做为扩展主目录,所以你不须要努力构建绝对路径在Podfile目录中。

你也能使用其余的CocoaPods在你的工程中做为项目的依赖对于你建立CocoaPod。你只须要一个Podfile来管理你的CocoaPod依赖关系。

关闭Xcode,而后在终端输入如下命令:

cd ~/Documents/Libraries/RWPickFlavor
pod init
open -a Xcode Podfile

这是建立一个新的Podfile,并在Xcode中打开它。

使用下面的命令对Podfile进行更新:

platform :ios, '8.0'
use_frameworks!
target 'RWPickFlavor' do
  pod 'Alamofire', '~> 1.2'
  pod 'MBProgressHUD', '~> 0.9.0'
end

这声明RWPickFlavor将在Alamofire和MBProgressHUD提供依赖关系。

保存并关闭Podfile,而后在终端输入如下命令:

pod install

正如你所指望的,这将建立一个工做区间并安装你所须要的各类文件。

注意:若是pod install给你任何警告,这样的话你可能使用的是旧版本。Swift基于CocoaPods,尤为是Alamofire,须要CocoaPods 0.36版本或更新。根据如下命令,你能够检测你已经安装的CocoaPods版本。 
pod --version 
若是是版本太低的缘由,输入如下终端命令来安装最新的版本。 
sudo gem install CocoaPods

输入如下命令,打开并建立一个新的RWPickFlavor工做区间。

open RWPickflavor.xcworkspace

你的项目导航器看起来应该是这个样子:

 

你如今须要从IceCreamShop复制一些已经存在的文件在RWPickFlavor工做区间。

首先在RWPickFlavor.xcworkspace建立一个组,把你须要的文件复制进去。

  1. Categories
  2. Controllers
  3. Factories
  4. Models
  5. Views
  • Ice Cream
  • Storyboards & Nibs

如今拖拽每个文件,除了AppDelegate.swift和LaunchScreen.xib,从IceCreamShop.xcworkspace拖拽进RWPickFlavor.xcworkspace,就像这样:

 

当被提示时,确保每个须要被复制的条目被复制安装了而不是简单的连接。

当你完成了,RWPickFlavor应该有如下文件:

RWPickFlavor

  • RWPickFlavor.h

Categories

RGBAColorFromString.swift

  • Controllers

PickFlavorDataSource.swift 
PickFlavorViewController.swift

  • Factories

FlavorFactory.swift

  • Models

Flavor.swift

  • Supporting Files

Info.plist

  • Views
  • Ice Cream
  • Storyboard & Nibs

Main.storyboard

如今,打开Info.plist,找到Supporting Files组,而且删除Main storyboard file base name。

构建并运行,你不该该看见任何错误,而且你会看见“Ice Cream Shop”的图标和黑色的背景。


图像呢?

你可能会注意,你并无复制Resources组,这是由于你须要复制的仅仅是background.jpg他本身自己到Resources文件夹中。不完整的Images.xcassets资源文件。

首先在RWPickFlavor建立一个Resources组。

下一步,选择Images.xcassets在IceCreamShop,点击右侧background,而且选择Show In Finder,像这样。

 

如今拖拽background.jpg到RWPickFlavor的 Resources组中。当提示的时候依然检测每个条目是否被安装。当你复制后,从IceCreamShop中删除Images.xcassets原来的背景。

最后,在RWPickFlavor更新视图的图像上选择你的场景在Main.storyboard,因此引用background.jpg替代background:

 

信不信,最难创造的是你的pod。

CocoaPods和Git

自从CocoaPods傻瓜式引导,每个pod将须要有他本身的git仓库。若是你已经有一个首选的git托管,好的,你能够用它来做为你的仓库。

若是没有, GitHub是一个很好的的选择由于它是众所周知的开发平台,有着不少自由的开源项目。在本教程中,咱们使用GitHub,但你也可使用git仓库。

GitHub设置

首先建立或登录你的GitHub帐户。

下一步,点击顶部右侧+ (create new)图标并选择New repository展现以下:

 

进入RWPickFlavor仓库,并选择Create repository。 Github将建立一个新的仓库在你的帐户下。而后你会看到下面的屏幕与一个快速设置,显示你储存的仓库网址。

因此距离打开到如今你须要这个URL在短短的一瞬间。

如今你须要第二个仓库涌来存放你全部私有的pod,你将在本教程中使用。

在新窗口打开github.com,再一次点击Create new图标,并选择New repository。仓库名为RWPodSpecs,选择Create repository。

离开这个标签,这样当你须要使用它的时候很简单去使用了。

Podspec设置

如今你须要建立RWPickFlavor.podspec文件对于RWPickFlavor,Podspec包含基础信息,尤为是pod的名字,版本和Git下载的URL

在终端输入如下命令:

cd ~/Documents/Libraries/RWPickFlavor
pod spec create RWPickFlavor
open -a Xcode RWPickFlavor.podspec

这是建立的RWPickFlavor.podspec,在Xcode中打开它。

默认状况下有不少优秀的例子和文档,然而你并不须要其中的大部分。

如下RWPickFlavor.podspec代替了一切:

Pod::Spec.new do |s|
  # 1
  s.platform = :ios
  s.ios.deployment_target = '8.0'
  s.name = "RWPickFlavor"
  s.summary = "RWPickFlavor lets a user select an ice cream flavor."
  s.requires_arc = true 
  # 2
  s.version = "0.1.0"
  # 3
  s.license = { :type => "MIT", :file => "LICENSE" }
  # 4 - Replace with your name and e-mail address
  s.author = { "[Your Name Goes Here]" => "[Your_Email@Your_Email_Domain.com]" } 
  # For example,
  # s.author = { "Joshua Greene" => "jrg.developer@gmail.com" }
  # 5 - Replace this URL with your own Github page's URL (from the address bar)
  s.homepage = "[Your RWPickFlavor Homepage URL Goes Here]"
  # For example,
  # s.homepage = "https://github.com/JRG-Developer/RWPickFlavor"
  # 6 - Replace this URL with your own Git URL from "Quick Setup"
  s.source = { :git => "[Your RWPickFlavor Git URL Goes Here]", :tag => "#{s.version}"}
  # For example,
  # s.source = { :git => "https://github.com/JRG-Developer/RWPickFlavor.git", :tag => "#{s.version}"}
  # 7
  s.framework = "UIKit"
  s.dependency 'Alamofire', '~> 1.1'
  s.dependency 'MBProgressHUD', '~> 0.9.0' 
  # 8
  s.source_files = "RWPickFlavor/**/*.{swift}"
  # 9
  s.resources = "RWPickFlavor/**/*.{png,jpeg,jpg,storyboard,xib}"
end

就像一个Podfile,Podspec是用Ruby写的。要格外当心,不要作任何错误,不然将可能没法验证安装后是否成功.

这是发生了什么?

  • 首先你详细说明了pod的基本信息。Swift必须最低基于CocoaPods8.0版本或者更高。 若是你指定了较低的版本,pod没法正常安装。
  • 对于你指定的CocoaPod版本好,本质上Podspec是一个快照。当你更新一个pod,你也将须要更新Podspec的版本。全部的高版本度遵循 Semantic Versioning。若是你并无类似的版本,请查阅《如何在Swift中使用CocoaPods?》。
  • 全部pods必须指定一个许可证。若是你没有,CocoaPods将在你安装的时候提出警告。而且你 不能把它上传到分支。
  • 在这里,您能够指定关于本身的信息,pod做者。输入你的名字和e-mail地址。替代那些占 位符文本。
  • 在这里你须要指定你的pod的网页和网址。就是简单的从浏览器地址栏复制和粘贴到Github 主页。
  • 从上面建立第一个“Quick Setup”,那部分的git下载网址替代URL。最好使用一个HTTP或HTTPS:URL更容易被其余用户处理。若是你想你也可使用SSH URL,可是你须要确保你团队的每个人-不管谁须要访问CocoaPod-已经有本身的公钥/私钥针对你的Git host。
  • 这里你须要说明你的框架和pod依赖关系。
  • 在这里你能够说明指定基于文件扩展的公共源文件,在这种状况下,你能够说明‘.swift’做 为扩展。
  • 最后你能够根据指定的文件扩展名指定资源。

推送Git

你终于准备推送RWPickFlavor pod GitHub主页!在终端输入如下命令, 而后跳出提示,输入你的用户名和密码到Github。

cd ~/Documents/Libraries/RWPickFlavor
git init
git add .
git commit -m "Initial commit"
git tag 0.1.0
git remote add origin [Your RWPickFlavor Git URL]
git push -u origin master --tags

这全部文件在RWPickFlavor目录中,建立一个新的0.1.0标签,而且推送你每个东西到你的远程仓库。祝贺你,你已经建立你的第一个CocoaPod!

 

你已经建立了第一个CocoaPod,可是你能真正的使用吗?并不能很快使用。

你首先须要添加你的Podspec去私有的specs repo,当你尝试去安装它这让CocoaPods发现pod。对于这个你已经建立一个Git repo,因此这最后一步比较简单。

在终端输入如下命令,确保你仍在RWPickFlavor目录中。

pod repo add RWPodSpecs [Your RWPodSpecs Git URL]
pod repo push RWPodSpecs RWPickFlavor.podspec

这将建立一个本地引用 RWPodSpecs在你的机器上,并推送RWPickFlavor.podspec到它上。

你如今有一个私有的pod specs repo被创建!比你想象的容易,对吗?

使用你的新CocoaPod

最后来使用你建立的pod。对于IceCreamShop打开Podfile,输入如下命令:

platform :ios, '8.0'
source 'https://github.com/CocoaPods/Specs.git'
source '[Your RWPodSpecs Git URL Goes Here]'
use_frameworks!
target 'IceCreamShop' do
  pod 'RWPickFlavor', :path => '~/Documents/Libraries/RWPickFlavor'
end

确保你替换的[Your RWPodSpecs Git URL Goes Here]Git URL是你的RWPodSpecs repo, 而后在终端运行pod install。

最后,用下面的替换AppDelegate.swift。

import UIKit
import RWPickFlavor
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  var window: UIWindow?
  var rootViewController: UIViewController!
  func application(application: UIApplication, didFinishLaunchingWithOptions 
    launchOptions: [NSObject : AnyObject]?) -> Bool { 
    setupRootViewController()
    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    window?.rootViewController = rootViewController
    window?.makeKeyAndVisible()
 
    return true
  } 
  func setupRootViewController() {
    let bundle = NSBundle(forClass: PickFlavorViewController.self)
    let storyboard = UIStoryboard(name: "Main", bundle: bundle)
    rootViewController = storyboard.instantiateInitialViewController() as! UIViewController
  }
}

在setupRootViewController(),你获得一个可参考的RWPickFlavor“bundle”,这其实是一个动态绑定框架,建立一个Main.storyboard,而且实例化其根视图控制器。

构建而且运行。你将看到你熟悉的“Choose Your Flavor”界面。

 

抽象全部事物

若是你像我同样,你可能会想,“哇,App Delegate必定知道不少关于RWPickFlavor结构”。幸运的是,有一些事情你能够作来减小这种耦合性,经过BetterBaseClasses来让建立CocoaPods更容易。

添加一下代码带你的RWPickFlavor:

pod 'BetterBaseClasses', '~> 1.0'

一样添加到RWPickFlavor.podspec:

s.dependency 'BetterBaseClasses', '~> 1.0'

如今替换版本:

s.version = "0.2.0"

在这里,你声明BetterBaseClasses做为一个关系,而后加入你的CocoaPod。如今你在终端运行pod install安装这个新的依赖关系。 接下来添加提取PickFlavorViewController:

import BetterBaseClasses

而后替换类的定义:

public class PickFlavorViewController: BaseViewController, UICollectionViewDelegate {

这种PickFlavorViewController是BetterBaseClasses中的BaseViewController的一部分, 如今你须要推送这些改变到你的RWPickFlavor andRWPodSpecs仓库。运行如下命令:

cd ~/Documents/Libraries/RWPickFlavor
git add .
git commit -m "Added BetterBaseClasses dependency"
git tag 0.2.0
git push origin master --tags
pod repo push RWPodSpecs RWPickFlavor.podspec

接下来你须要提交这些改变到你的IceCreamShop。更新IceCreamShop Podfile,替换`pod ‘RWPickFlavor’。

pod 'RWPickFlavor', '~> 0.2.0

在这里更新Podfile请求的版本就是你刚刚推送的。

在终端执行pod install去更新这种依赖关系在IceCreamShop。最后用如下内容替换AppDelegate.swift:

import UIKit
import RWPickFlavor
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  var window: UIWindow?
  func application(application: UIApplication, didFinishLaunchingWithOptions 
    launchOptions: [NSObject : AnyObject]?) -> Bool { 
    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    window?.rootViewController = UINavigationController(rootViewController: 
      PickFlavorViewController.instanceFromStoryboard())
    window?.makeKeyAndVisible()
    return true
  }
}

这很简单,BetterBaseClasses添加到U IViewController、UITableViewController和其余的UIkit类。这里包括一个UIViewController+BetterBaseClasses,增长了更加方便的方法,尤为是instanceFromStoryboard()使它更容易实例化视图控制器。不管他们在main bundle活着其余一些地方,尤为是在框架中。

再一次构建并运行,你应该看见了熟悉的界面“Choose Your Flavor”。

何去何从?

你能在 这儿和 这里完成IceCreamShop project和RWPickFlavor pod工程的下载。

你如今开始准备制做本身的CocoaPods!然而,本教程谈到的CocoaPods知识冰山一角。你能够经过学习 CocoaPods Guides去了解建立CocoaPods的知识。

相关文章
相关标签/搜索