作者:AppCoda,原文链接,原文日期:2016-09-16
译者:ckitakishi;校对:mmoaay;定稿:CMB
CocoaPods 是一个面向 Xcode 的项目依赖管理工具。当需要向项目添加库和框架时,它是一项极其有用且值得选择的服务。
试想一下,有人开发了一个足以改变游戏规则、且具有划时代意义的库,并想把它分享给这个世界。这时候该怎么办?长话短说,我要说的是你需要知道如何发布自己的 CocoaPod!
前提
本教程基于 Xcode 8 和 Swift 3。如果你想了解更多关于 Swift 3 的新特性,可以阅读这篇很棒的教程。
译者注:本站译作
目前,CocoaPods 有一个针对 Swift 3 和 Xcode 8 的预发布版本。为了编译基于 Swift 3 的项目,你应该使用这个版本。在终端执行下述命令即可完成安装:
sudo gem install cocoapods --pre |
同时你还需要一点 CocoaPods 的使用经验。不妨看看这篇 Gregg Mojica 写的令人惊叹的教程,我相信你会从中了解更多相关的内容。
好了,我们开始!
做一个值得用 Pod 管理的项目
从现在开始,让我们来做一个具有创造性,值得用 pod 管理的项目。我的想法是做一个会缓慢改变颜色的 UIView。我相信对于背景来说这会十分有用。
让我们先从最基础的地方开始。首先,在 Xcode 中创建一个新工程,选择使用 single view 模版。将工程命名为 FantasticView。项目创建之后,添加一个同名的 Swift 文件FantasticView.swift
。
现在你已经有了FantasticView.swift
,然后在其中定义一个名为FantasticView
的类,它继承自UIView
:
import UIKit |
初始化
override init(frame: CGRect) { |
第一个初始化方法是init(frame: CGRect)
。当一个 frame 被传给FantasticView
的构造函数时该方法会被调用。我们将会在这里调用颜色更改函数。
酷炫的颜色
接下来,定义一个由UIColor
对象组成的数组colors
。在我们的核心代码中,将会通过“遍历”这个数组来改变UIView
的背景颜色。
let colors : [UIColor] = [.red,.orange,.yellow,.green,.blue,.purple] |
除此之外,你还需要添加一个计数器对象,在每次颜色改变时计数。
var colorCounter = 0 |
但是为什么需要一个计数器呢?难道我们不是在遍历颜色数组吗?
注意我刚刚是怎么说“遍历”的
魔法调味剂
现在我要告诉你如何处理遍历颜色数组的问题。
你可能会认为在UIView
的动画 block 中设置一系列颜色也是一种方法。然而遗憾的是,这无法正常工作,因为最终将只有一种颜色生效。
还有一种方法是创建一个 for 循环,然后在其中运行一个动画 block。这也将遇到先前的问题。要解决这个问题,你可以使用 GCD 来等待动画 block 执行完毕。
但是我坚信有更简单的方法。没错,你可以使用NSTimer
!
在你的init(frame: CGRect)
方法中添加下述代码:
let scheduledColorChanged = Timer.scheduledTimer(withTimeInterval: 2.0,repeats: true) { (timer) in//1 |
让我们逐行看一看上面的代码:
-
创建一个
Timer
对象,也就是刚才说的的NSTimer
。为定时器设置一个时间间隔,让它重复执行某些动作。在设置时间间隔之后,我们的定时器将会运行一个代码块。 -
设置
UIView.layer.backgroundColor
。注意,并不是UIView.backgroundColor
,因为layer
属性可动,而UIView
属性不可。 -
计数器加 1。
-
销毁计时器。
让我们看看第三步中我具体做了什么。通过下标可以从colors
中取得一个UIColor
。colorCounter
应该是一个介于 0 到 5 之间的数字,因为这是colors
数组的界限。我使用%
或mod
操作符来求得colorCounter
除以 6 的余数。所以如果colorCounter
是 10,则求余得 4,于是此时选择colors
数组的第四项。
使用 Fantastic View
是时候在我们的主 View Controller 中使用 Fantastic View 了。我希望我的 View Controller 拥有一个酷炫的背景,所以让我们在ViewController.swift
的viewDidLoad
方法中插入下列代码:
let fantasticView = FantasticView(frame: self.view.bounds) |
这里我们定义了一个FantasticView
,并使其边框等于ViewController
的视图边界。然后将fantasticView
作为子视图添加到主view
。
好了,在模拟器中运行应用吧!你将会看到随着时间推移,背景也随之改变。
推送到 GitHub
我知道你一定会问:“为什么不将 fantastic view 公布于众呢?人们有必要知道它!”
对,没错。让我们来创建一个 Pod,然后人们就可以使用它了!但是在此之前,需要先将其推送到 GitHub。
CocoaPods 要求 Pod 有一个源。大多数情况下,开发者使用 GitHub 来完成这一切。我们来快速过一遍提交项目到 GitHub 的必要步骤。如果你想知道更多 Git 的基础知识,不妨看一看这篇优秀的教程。
简单来说,下面这些就是你需要做的:
-
在 Github 上创建一个名为
FantasticView
的仓库。 -
复制仓库的 URL。
-
打开终端,跳转到你的工程目录下。
-
初始化 Git:
git init
-
推送到远程分支:
git push -u origin master
现在你必须为你的仓库创建一个 release。一个 release 对应产品的一个新版本。你可以在 Github 的操作面板上尝试创建。首先进入你的仓库。
- 点击
releases
按钮。
- 点击
Create a new release
- 将版本号设置为
0.1.0
,然后输入标题和描述。
以上是关于 Github 的内容,让我们开始创建 Pod 本身吧!
创建 Pod
首先,我们需要确保已经安装 CocoaPods,并做好在终端使用它的准备。动手吧,打开终端,运行以下命令:
sudo gem install cocoapods --pre |
现在 CocoaPods 已经安装完成,下一步轮到创建 Pod 了。
创建 Podspec
所有 Pods 都拥有一个 podspec 文件。podspec,顾名思义,用于定义 Pod 规范!让我们动手创建一个:
Pod::Spec.new do |s| s.name = 'FantasticView' s.version= '0.1.0' s.summary= 'By far the most fantastic view I have seen in my entire life. No joke.' s.description= <<-DESC This fantastic view changes its color gradually makes your app look fantastic! DESC s.homepage = 'https://github.com/<YOUR GITHUB USERNAME>/FantasticView' s.license= { :type => 'MIT',:file => 'LICENSE' } s.author = { '<YOUR NAME HERE>' => '<YOUR EMAIL HERE>' } s.source = { :git => 'https://github.com/<YOUR GITHUB USERNAME>/FantasticView.git',:tag => s.version.to_s } s.ios.deployment_target = '10.0' s.source_files = 'FantasticView/FantasticView.swift' end |
s
后面的这些变量都是 CocoaPods 需要的,提供像是名字,版本,概要,描述,仓库,源代码文件等必要信息。
下面介绍几个需要注意的重要变量:
-
s.name
– 显而易见,他人使用时可以通过该名字将 Pod 添加到项目中。 -
s.version
– 这是你 Pod 的版本。务必注意,它得和 Github release 的版本号相同。如果两者不匹配,就会报错。 s.summary
和s.description
– 这两个变量最终会显示在 Cocoapods 页面上。请确保description
比summary
更长,否则将会报错。-
s.homepage
– 这是 Pod 源代码的 URL。注意将YOUR GITHUB USERNAME
替换为你的用户名哟。 -
s.author
– 开发者信息,注意替换相应内容。 s.source_files
– 这是最重要的参数。它会告诉 CocoaPods 应该克隆哪些文件。我想要我的FantasticView.swift
被克隆,它的目录是FantasticView/FantasticView.swift
。另外,有很多方法可以添加多个文件作为源代码文件。让我们来看一个例子:
├── FantasticView.xcodeproj |
在这个例子中,我希望包含所有.swift
文件。为达到目的,我会将source_files
变量设置为下面这样:
'FantasticView/*.swift' |
星号*
表示包含任意文件。当星号位于文件类型前时,表明包括所有该类型的文件。
假设你想要在 Pod 下载时包含所有位于/FantasticView
下的文件,只需要将文件名字和类型用星号代替即可:
'FantasticView/*' |
这样就涵盖了所有,甚至是其他目录。为了限制文件类型,你也可以使用如下语句:
'FantasticView/*.{swift,plist}' |
用 Lint 验证项目
CocoaPods 需要验证项目有没有错误,这包含对错误甚至可疑代码的限制和要求。也就是说在发布项目之前 CocoaPods 要求你lint你的项目。
lint 一个项目十分简单,但是绝对是难以置信的麻烦!为了 lint 你的项目,请在项目目录下执行以下命令:
pod lib lint |
你可能会得到下述警告:
-> FantasticView (0.1.0) |
警告说的很直接。在这个例子中,你应该增加描述内容的长度,并提交一个合法的源代码 URL。一旦发生错误,甚至仅仅只是只是一个警告,CocoaPods 的 lint 就会失败。
再来让我们看看你可能会遭遇的错误:
-> FantasticView (0.1.0) |
当真的遇到错误的时候,不要着急,尝试通读错误提示并分析为什么发生这个错误。在本例中,你会注意到下述信息:
type UIColor has no member red. |
但是为什么不能识别UIColor
,事实上存在一个名为red
的成员呀?
一个合理的猜想是,在 Swift 3.0 中UIColor.redColor()
已经变为了UIColor.red
。由此可以推测 CocoaPods,或者具体说是 xcodebuild 编译项目使用的是 swift 2.2 或 2.3。第二个错误也验证了我们的猜想,因为NSTimer
已经转换为了Timer
。
那么究竟可以如何修复这个问题呢?CocoaPods 为此发布了一个修正版。在 lint 时你被要求必须指定 Swift 版本。为了这么做,你必须得创建一个名为.swift-version
的新文件,并添加编译器版本。只需简单地输出以下命令:
echo "3.0" >> .swift-version |
现在再次运行pod lib lint
,你应该能够得到一条通过验证的消息:
-> FantasticView (0.1.0) |
Woohoo!你通过了整个流程中最富挑战的一部分。
>
注意:如果出现含义不明的错误或警告消息,请尝试键入此命令,pod lib lint -verbose,相比常规的 pod lint 命令,你将得到更详细的信息。
发布你的 Pod
噢,是时候将你的 Fantastic View 发布到 CocoaPods 了。每个开发者都应该拥有一个 CocoaPods 账户,以备发布之时用。
现在的你应该会觉得,CocoaPods 账号就是一个 CocoaPods 账号啊,然而并不是,它是一个 Trunk 账号。我并不是在评判 CocoaPods,但我觉得这是一个十分奇怪的决定,着实让我困惑了一段时间。我这么说了之后,你会不会想读一下他们所写的关于为什么做 Trunk的博文。
创建 Trunk 账号
确切地说,Trunk 并不是一个账号;是一个会话。所以从根本上来说并不需要密码的存在,需要的仅仅是一个邮箱。
创建流程非常简单:
pod trunk register <Your Email> |
你应该很快就会受到一封来自 CocoaPods 的邮件以验证你发起的“会话”。点击邮件提供的链接,完成你的账号验证。之后 CocoaPods 将会给你发来友好的欢迎信息:好棒,设置完成!
推送你的 Pod
到这一步,就只剩下用 Trunk 将你的 podspec 推送到 CocoaPods 了:
pod trunk push FantasticView.podspec |
由于我已经抢先一步使用了FantasticView
这个超级酷炫的名字,它就不再可用了。你应该在 podspec 文件中修改s.name
,同时不要忘记修改你的 podspec 文件的名字。
完成修改之后,像前一节所演示的一样 lint 你的 podspec,然后再一次推送你的 trunk。若成功推送了你的 Pod,应该会得到以下信息:
Updating spec repo `master` |
恭喜!回顾所做的一切,并非那么难,对吧?现在可以将 Pod ‘FantasticView’ 添加到你的 podfile 了。
总结
事实上,有几种不同的方式来推送你的 Pod。你也可以使用 CocoaPods 模版来创建 Pod 工程,其中包含示例项目,readme,license 等等。不过我认为这稍有些复杂了,因为它包含了一些不必要的步骤,繁琐,还容易让人困惑。
在本教程中,我创建了一个工程,添加了一个 podspec,解释了 podspec 文件的不同选项,创建了一个 trunk 账号并推送了 Pod。如果遇到了问题,你可以在 CocoaPods 的 Github 仓库提交一个 issue。那是一个非常友好的社区,很酷,他们总是会在最短时间内给出答复。
诚挚地希望你喜欢这篇教程!你可以在这里下载完整项目作为参考。
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问http://swift.gg。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。