作者:AppCoda,原文鏈接核行,原文日期:2016-09-16
譯者:ckitakishi;校對:mmoaay;定稿:CMB
CocoaPods 是一個面向 Xcode 的項目依賴管理工具线欲。當(dāng)需要向項目添加庫和框架時,它是一項極其有用且值得選擇的服務(wù)李丰。
試想一下,有人開發(fā)了一個足以改變游戲規(guī)則竖慧、且具有劃時代意義的庫,并想把它分享給這個世界。這時候該怎么辦钳垮?長話短說悄泥,我要說的是你需要知道如何發(fā)布自己的 CocoaPod!
前提
本教程基于 Xcode 8 和 Swift 3瞧剖。如果你想了解更多關(guān)于 Swift 3 的新特性,可以閱讀這篇很棒的教程。
譯者注:本站譯作
目前莺治,CocoaPods 有一個針對 Swift 3 和 Xcode 8 的預(yù)發(fā)布版本。為了編譯基于 Swift 3 的項目帚稠,你應(yīng)該使用這個版本谣旁。在終端執(zhí)行下述命令即可完成安裝:
sudo gem install cocoapods --pre
同時你還需要一點 CocoaPods 的使用經(jīng)驗。不妨看看這篇 Gregg Mojica 寫的令人驚嘆的教程滋早,我相信你會從中了解更多相關(guān)的內(nèi)容榄审。
好了,我們開始杆麸!
做一個值得用 Pod 管理的項目
從現(xiàn)在開始搁进,讓我們來做一個具有創(chuàng)造性,值得用 pod 管理的項目昔头。我的想法是做一個會緩慢改變顏色的 UIView饼问。我相信對于背景來說這會十分有用。
讓我們先從最基礎(chǔ)的地方開始揭斧。首先莱革,在 Xcode 中創(chuàng)建一個新工程,選擇使用 single view 模版讹开。將工程命名為 FantasticView盅视。項目創(chuàng)建之后,添加一個同名的 Swift 文件 FantasticView.swift
萧吠。
![](https://www.appcoda.com/wp-content/uploads/2016/09/fantasticview-project.png)
現(xiàn)在你已經(jīng)有了 FantasticView.swift
左冬,然后在其中定義一個名為 FantasticView
的類,它繼承自 UIView
:
import UIKit
class FantasticView : UIView {
}
初始化
下一步纸型,為上面定義的類添加兩個初始化方法:
override init(frame: CGRect) {
super.init(frame: frame)
// 核心部分
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// 你不需要實現(xiàn)這部分
}
第一個初始化方法是 init(frame: CGRect)
拇砰。當(dāng)一個 frame 被傳給 FantasticView
的構(gòu)造函數(shù)時該方法會被調(diào)用。我們將會在這里調(diào)用顏色更改函數(shù)狰腌。
酷炫的顏色
接下來除破,定義一個由 UIColor
對象組成的數(shù)組 colors
。在我們的核心代碼中琼腔,將會通過“遍歷”這個數(shù)組來改變 UIView
的背景顏色瑰枫。
let colors : [UIColor] = [.red, .orange, .yellow, .green, .blue, .purple]
除此之外,你還需要添加一個計數(shù)器對象,在每次顏色改變時計數(shù)光坝。
var colorCounter = 0
但是為什么需要一個計數(shù)器呢尸诽?難道我們不是在遍歷顏色數(shù)組嗎?
注意我剛剛是怎么說“遍歷”的
魔法調(diào)味劑
現(xiàn)在我要告訴你如何處理遍歷顏色數(shù)組的問題盯另。
你可能會認(rèn)為在 UIView
的動畫 block 中設(shè)置一系列顏色也是一種方法性含。然而遺憾的是,這無法正常工作鸳惯,因為最終將只有一種顏色生效商蕴。
還有一種方法是創(chuàng)建一個 for 循環(huán),然后在其中運行一個動畫 block芝发。這也將遇到先前的問題绪商。要解決這個問題,你可以使用 GCD 來等待動畫 block 執(zhí)行完畢辅鲸。
但是我堅信有更簡單的方法格郁。沒錯,你可以使用 NSTimer
瓢湃!
在你的 init(frame: CGRect)
方法中添加下述代碼:
let scheduledColorChanged = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { (timer) in //1
UIView.animate(withDuration: 2.0) { //2
self.layer.backgroundColor = self.colors[self.colorCounter % 6].cgColor //3
self.colorCounter+=1 //4
}
}
scheduledColorChanged.fire() //5
讓我們逐行看一看上面的代碼:
創(chuàng)建一個
Timer
對象理张,也就是剛才說的的NSTimer
。為定時器設(shè)置一個時間間隔绵患,讓它重復(fù)執(zhí)行某些動作。在設(shè)置時間間隔之后悟耘,我們的定時器將會運行一個代碼塊落蝙。調(diào)用
animate(withDuration)
函數(shù)。設(shè)置
UIView.layer.backgroundColor
暂幼。注意筏勒,并不是UIView.backgroundColor
,因為layer
屬性可動旺嬉,而UIView
屬性不可管行。計數(shù)器加 1。
銷毀計時器邪媳。
讓我們看看第三步中我具體做了什么捐顷。通過下標(biāo)可以從 colors
中取得一個 UIColor
。colorCounter
應(yīng)該是一個介于 0 到 5 之間的數(shù)字雨效,因為這是 colors
數(shù)組的界限迅涮。我使用 %
或 mod
操作符來求得 colorCounter
除以 6 的余數(shù)。所以如果 colorCounter
是 10徽龟,則求余得 4叮姑,于是此時選擇 colors
數(shù)組的第四項。
使用 Fantastic View
是時候在我們的主 View Controller 中使用 Fantastic View 了据悔。我希望我的 View Controller 擁有一個酷炫的背景传透,所以讓我們在 ViewController.swift
的 viewDidLoad
方法中插入下列代碼:
let fantasticView = FantasticView(frame: self.view.bounds)
self.view.addSubview(fantasticView)
這里我們定義了一個 FantasticView
耘沼,并使其邊框等于 ViewController
的視圖邊界。然后將 fantasticView
作為子視圖添加到主 view
朱盐。
好了耕拷,在模擬器中運行應(yīng)用吧托享!你將會看到隨著時間推移骚烧,背景也隨之改變。
推送到 GitHub
我知道你一定會問:“為什么不將 fantastic view 公布于眾呢闰围?人們有必要知道它赃绊!”
對,沒錯羡榴。讓我們來創(chuàng)建一個 Pod碧查,然后人們就可以使用它了!但是在此之前校仑,需要先將其推送到 GitHub忠售。
CocoaPods 要求 Pod 有一個源。大多數(shù)情況下迄沫,開發(fā)者使用 GitHub 來完成這一切稻扬。我們來快速過一遍提交項目到 GitHub 的必要步驟。如果你想知道更多 Git 的基礎(chǔ)知識羊瘩,不妨看一看這篇優(yōu)秀的教程泰佳。
簡單來說,下面這些就是你需要做的:
在 Github 上創(chuàng)建一個名為
FantasticView
的倉庫尘吗。復(fù)制倉庫的 URL逝她。
打開終端,跳轉(zhuǎn)到你的工程目錄下睬捶。
初始化 Git:
git init
將所有已修改文件添加到 Git 暫存區(qū)中:
git add .
提交這些已修改文件:
git commit -m "init"
添加一個遠(yuǎn)程庫 :
git remote add origin <paste your URL here>
推送到遠(yuǎn)程分支:
git push -u origin master
現(xiàn)在你必須為你的倉庫創(chuàng)建一個 release黔宛。一個 release 對應(yīng)產(chǎn)品的一個新版本。你可以在 Github 的操作面板上嘗試創(chuàng)建擒贸。首先進(jìn)入你的倉庫臀晃。
- 點擊
releases
按鈕。
![](https://www.appcoda.com/wp-content/uploads/2016/09/github-cocoapods-1.png)
- 點擊
Create a new release
![](https://www.appcoda.com/wp-content/uploads/2016/09/github-cocoapods-2.png)
- 將版本號設(shè)置為
0.1.0
酗宋,然后輸入標(biāo)題和描述积仗。
![](https://www.appcoda.com/wp-content/uploads/2016/09/github-cocoapods-3.png)
- 點擊
Publish release
,然后你看所看到的應(yīng)該與下圖相似:
以上是關(guān)于 Github 的內(nèi)容蜕猫,讓我們開始創(chuàng)建 Pod 本身吧寂曹!
創(chuàng)建 Pod
首先,我們需要確保已經(jīng)安裝 CocoaPods,并做好在終端使用它的準(zhǔn)備隆圆。動手吧漱挚,打開終端,運行以下命令:
sudo gem install cocoapods --pre
現(xiàn)在 CocoaPods 已經(jīng)安裝完成渺氧,下一步輪到創(chuàng)建 Pod 了旨涝。
創(chuàng)建 Podspec
所有 Pods 都擁有一個 podspec 文件。podspec侣背,顧名思義白华,用于定義 Pod 規(guī)范!讓我們動手創(chuàng)建一個:
打開終端贩耐,進(jìn)入項目根目錄弧腥。
運行
touch FantasticView.podspec
命令以創(chuàng)建文件。使用編輯器打開文件潮太。
-
將以下代碼粘貼到 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!
DESCs.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 的版本缀壤。務(wù)必注意,它得和 Github release 的版本號相同纠亚。如果兩者不匹配,就會報錯筋夏。s.summary
和s.description
– 這兩個變量最終會顯示在 Cocoapods 頁面上蒂胞。請確保description
比summary
更長,否則將會報錯条篷。s.homepage
– 這是 Pod 源代碼的 URL骗随。注意將YOUR GITHUB USERNAME
替換為你的用戶名喲。s.author
– 開發(fā)者信息赴叹,注意替換相應(yīng)內(nèi)容鸿染。-
s.source_files
– 這是最重要的參數(shù)。它會告訴 CocoaPods 應(yīng)該克隆哪些文件乞巧。我想要我的FantasticView.swift
被克隆涨椒,它的目錄是FantasticView/FantasticView.swift
。另外,有很多方法可以添加多個文件作為源代碼文件蚕冬。讓我們來看一個例子:├── FantasticView.xcodeproj
└── FantasticView
├── ViewController.swift
├── Info.plist
├── FantasticView.swift
└── FantasticerView.swift
在這個例子中免猾,我希望包含所有 .swift
文件。為達(dá)到目的囤热,我會將 source_files
變量設(shè)置為洗面這樣:
'FantasticView/*.swift'
星號 *
表示包含任意文件猎提。當(dāng)星號位于文件類型前時,表明包括所有該類型的文件旁蔼。
假設(shè)你想要在 Pod 下載時包含所有位于 /FantasticView
下的文件锨苏,只需要將文件名字和類型用星號代替即可:
'FantasticView/*'
這樣就涵蓋了所有,甚至是其他目錄棺聊。為了限制文件類型伞租,你也可以使用如下語句:
'FantasticView/*.{swift,plist}'
在這個例子中,將會涵蓋所有的 swift
和 plist
文件躺屁。
用 Lint 驗證項目
CocoaPods 需要驗證項目有沒有錯誤肯夏,這包含對錯誤甚至可疑代碼的限制和要求。也就是說在發(fā)布項目之前 CocoaPods 要求你 lint 你的項目犀暑。
lint 一個項目十分簡單驯击,但是絕對是難以置信的麻煩!為了 lint 你的項目耐亏,請在項目目錄下執(zhí)行以下命令:
pod lib lint
你可能會得到下述警告:
-> FantasticView (0.1.0)
- WARN | description: The description is shorter than the summary.
- WARN | url: There was a problem validating the URL https://github.com/<YOUR GITHUB USERNAME>/FantasticView.
警告說的很直接徊都。在這個例子中,你應(yīng)該增加描述內(nèi)容的長度广辰,并提交一個合法的源代碼 URL暇矫。一旦發(fā)生錯誤,甚至僅僅只是只是一個警告择吊,CocoaPods 的 lint 就會失敗李根。
再來讓我們看看你可能會遭遇的錯誤:
-> FantasticView (0.1.0)
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use --verbose for more information.
- ERROR | [iOS] xcodebuild: /Users/sahandedrisian/Desktop/FantasticView/FantasticView/FantasticView.swift:13:32: error: type 'UIColor' has no member 'red'
- ERROR | [iOS] xcodebuild: /Users/sahandedrisian/Desktop/FantasticView/FantasticView/FantasticView.swift:20:37: error: use of unresolved identifier 'Timer'
當(dāng)真的遇到錯誤的時候,不要著急几睛,嘗試通讀錯誤提示并分析為什么發(fā)生這個錯誤房轿。在本例中,你會注意到下述信息:
type UIColor has no member red.
但是為什么不能識別 UIColor
所森,事實上存在一個名為 red
的成員呀囱持?
一個合理的猜想是,在 Swift 3.0 中 UIColor.redColor()
已經(jīng)變?yōu)榱?UIColor.red
焕济。由此可以推測 CocoaPods纷妆,或者具體說是 xcodebuild 編譯項目使用的是 swift 2.2 或 2.3。第二個錯誤也驗證了我們的猜想晴弃,因為 NSTimer
已經(jīng)轉(zhuǎn)換為了 Timer
掩幢。
那么究竟可以如何修復(fù)這個問題呢逊拍?CocoaPods 為此發(fā)布了一個修正版。在 lint 時你被要求必須指定 Swift 版本粒蜈。為了這么做顺献,你必須得創(chuàng)建一個名為 .swift-version
的新文件,并添加編譯器版本枯怖。只需簡單地輸出以下命令:
echo "3.0" >> .swift-version
現(xiàn)在再次運行 pod lib lint
注整,你應(yīng)該能夠得到一條通過驗證的消息:
-> FantasticView (0.1.0)
FantasticView passed validation.
Woohoo!你通過了整個流程中最富挑戰(zhàn)的一部分度硝。
注意:如果出現(xiàn)含義不明的錯誤或警告消息肿轨,請嘗試鍵入此命令,pod lib lint -verbose蕊程,相比常規(guī)的 pod lint 命令椒袍,你將得到更詳細(xì)的信息。
發(fā)布你的 Pod
噢藻茂,是時候?qū)⒛愕?Fantastic View 發(fā)布到 CocoaPods 了驹暑。每個開發(fā)者都應(yīng)該擁有一個 CocoaPods 賬戶,以備發(fā)布之時用辨赐。
現(xiàn)在的你應(yīng)該會覺得优俘,CocoaPods 賬號就是一個 CocoaPods 賬號啊,然而并不是掀序,它是一個 Trunk 賬號帆焕。我并不是在評判 CocoaPods,但我覺得這是一個十分奇怪的決定不恭,著實讓我困惑了一段時間叶雹。我這么說了之后,你會不會想讀一下他們所寫的關(guān)于為什么做 Trunk 的博文换吧。
創(chuàng)建 Trunk 賬號
確切地說折晦,Trunk 并不是一個賬號;是一個會話沾瓦。所以從根本上來說并不需要密碼的存在筋遭,需要的僅僅是一個郵箱。
創(chuàng)建流程非常簡單:
pod trunk register <Your Email>
你應(yīng)該很快就會受到一封來自 CocoaPods 的郵件以驗證你發(fā)起的“會話”暴拄。點擊郵件提供的鏈接,完成你的賬號驗證编饺。之后 CocoaPods 將會給你發(fā)來友好的歡迎信息:好棒乖篷,設(shè)置完成!
推送你的 Pod
到這一步透且,就只剩下用 Trunk 將你的 podspec 推送到 CocoaPods 了:
pod trunk push FantasticView.podspec
由于我已經(jīng)搶先一步使用了 FantasticView
這個超級酷炫的名字撕蔼,它就不再可用了豁鲤。你應(yīng)該在 podspec 文件中修改 s.name
,同時不要忘記修改你的 podspec 文件的名字鲸沮。
完成修改之后琳骡,像前一節(jié)所演示的一樣 lint 你的 podspec,然后再一次推送你的 trunk讼溺。若成功推送了你的 Pod楣号,應(yīng)該會得到以下信息:
Updating spec repo `master`
Validating podspec
-> FantasticView (0.1.0)
Updating spec repo `master`
- Data URL: https://raw.githubusercontent.com/CocoaPods/Specs/06dcdf13dd11b8c2eb4fd522b25a652fa654b180/Specs/FantasticView/0.1.0/FantasticView.podspec.json
- Log messages:
- September 24th, 11:08: Push for 'FantasticView 0.1.0' initiated.
- September 24th, 11:08: Push for 'FantasticView 0.1.0' has been pushed (0.500379641 s).
恭喜!回顧所做的一切怒坯,并非那么難炫狱,對吧?現(xiàn)在可以將 Pod ‘FantasticView’ 添加到你的 podfile 了剔猿。
總結(jié)
事實上视译,有幾種不同的方式來推送你的 Pod。你也可以使用 CocoaPods 模版來創(chuàng)建 Pod 工程归敬,其中包含示例項目酷含,readme,license 等等汪茧。不過我認(rèn)為這稍有些復(fù)雜了椅亚,因為它包含了一些不必要的步驟,繁瑣陆爽,還容易讓人困惑什往。
在本教程中,我創(chuàng)建了一個工程慌闭,添加了一個 podspec别威,解釋了 podspec 文件的不同選項,創(chuàng)建了一個 trunk 賬號并推送了 Pod驴剔。如果遇到了問題省古,你可以在 CocoaPods 的 Github 倉庫提交一個 issue。那是一個非常友好的社區(qū)丧失,很酷豺妓,他們總是會在最短時間內(nèi)給出答復(fù)。
誠摯地希望你喜歡這篇教程布讹!你可以在這里下載完整項目作為參考琳拭。
本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán)描验,最新文章請訪問 http://swift.gg白嘁。