本文出自:raywenderlich,譯文出自:開發技術前線,譯者:MrLoong android
你可能會熟悉一些衆所周知的、開源的CocoaPods的框架,例如Alamofire或MBProgressHUD,但有的時候你並不能找到一個符合你要求的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
這個冰淇凌店的老闆很是喜歡這個應用程序,但他們又添加了一個新的要求:在他們的應用程序中須要有相同的口味風格選擇。
等等,那不是最初的設計,可是,對於一個NB的開發者來講,應該沒有問題的。
你能猜猜這個功能是怎麼作的嗎?是的,你將把這個功能集成到你本身的CocoaPod!。
建立一個新的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 '
這種方法有兩種好處:
你可使用不一樣的位置對你的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建立一個組,把你須要的文件複製進去。
如今拖拽每個文件,除了AppDelegate.swift和LaunchScreen.xib,從IceCreamShop.xcworkspace拖拽進RWPickFlavor.xcworkspace,就像這樣:
當被提示時,確保每個須要被複制的條目被複制安裝了而不是簡單的連接。
當你完成了,RWPickFlavor應該有如下文件:
RWPickFlavor
Categories
RGBAColorFromString.swift
PickFlavorDataSource.swift
PickFlavorViewController.swift
FlavorFactory.swift
Flavor.swift
Info.plist
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傻瓜式引導,每個pod將須要有他本身的git倉庫。若是你已經有一個首選的git託管,好的,你能夠用它來做爲你的倉庫。
若是沒有, GitHub是一個很好的的選擇由於它是衆所周知的開發平臺,有着不少自由的開源項目。在本教程中,咱們使用GitHub,但你也可使用git倉庫。
首先建立或登錄你的GitHub帳戶。
下一步,點擊頂部右側+ (create new)圖標並選擇New repository展現以下:
進入RWPickFlavor倉庫,並選擇Create repository。 Github將建立一個新的倉庫在你的帳戶下。而後你會看到下面的屏幕與一個快速設置,顯示你儲存的倉庫網址。
因此距離打開到如今你須要這個URL在短短的一瞬間。
如今你須要第二個倉庫涌來存放你全部私有的pod,你將在本教程中使用。
在新窗口打開github.com,再一次點擊Create new圖標,並選擇New repository。倉庫名爲RWPodSpecs,選擇Create repository。
離開這個標籤,這樣當你須要使用它的時候很簡單去使用了。
如今你須要建立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寫的。要格外當心,不要作任何錯誤,不然將可能沒法驗證安裝後是否成功.
這是發生了什麼?
你終於準備推送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被創建!比你想象的容易,對嗎?
最後來使用你建立的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的知識。