目前, 在iOS開發(fā)中, CocoaPods應該算是使用最為頻繁的包管理工具了.
使用CocoaPods管理iOS項目中的第三方類庫
CocoaPods的安裝如下:
sudo gem install cocoapods # 會被墻掉。
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem sources -l
sudo gem install cocoapods
在項目所在目錄下執(zhí)行*** pod init *** , 生成Podfile文件, 我們需要對其進行相應的配置, Podfile文件如下:
# Uncomment this line to define a global platform for your project
platform :ios, '8.0'
# Uncomment this line if you're using Swift
use_frameworks!
pod 'CSSwiftExtension'
pod 'Reachability'
pod 'Alamofire'
pod 'SwiftyJSON'
target 'myProject' do
end
target 'myProjectTests' do
end
然后, 執(zhí)行*** pod install *** 或 *** pod update *** ,
即可安裝這些第三方類庫. 然后在項目中導入即可使用:
import Alamofire
// xxx
Alamofire.request(.GET, url, parameters: nil).validate()
.responseJSON { response in
// xxx
}
怎么樣, 非常方便吧?
看到這里, 是不是也想將自己的一些代碼在CocoaPods上發(fā)布呢!
接著往下看!
Swift中常見的extension方法
這里, 將以CSSwiftExtension為例, 簡單介紹下如何在CocoaPods上發(fā)布自己的代碼.
CSSwiftExtension是一個Swift的extension集合, 包含了一些常見的方法:
如Foundation的一些基本extension方法:
extension String {
public func cs_trim() -> String
public func cs_intValue() -> Int?
public func cs_stringValue() -> String?
}
extension NSData {
public func cs_jsonObjectFromNSData() -> AnyObject
}
extension NSFileManager {
public func cs_homeDirectory() -> String
public func cs_tempDirectory() -> String
public func cs_documentsDirectory() -> String
public func cs_libraryDirectory() -> String
public func cs_cacheDirectory() -> String
}
以及, UIImage的縮放cs_imageScaledToSize, 以及不會引起離屏渲染的圖片圓角cs_imageWithCornerRadius.
extension UIImage {
public func cs_saveImageToFile(filePath: String, compressionFactor: CGFloat) -> Bool
public func cs_imageScaledToSize(size: CGSize, withOriginalRatio: Bool) -> UIImage
public func cs_imageRotatedByDegrees(degrees: CGFloat) -> UIImage
public func cs_imageWithCornerRadius(cornerRadius: CGFloat) -> UIImage
}
UIDevice的一些常見方法, 以及UIApplication的cs_currentViewController可用于獲取當前的ViewController,
cs_isRunningAppVersionReleased方法接收當前App在AppStore中的id, 即可查詢當前版本是否已經(jīng)release.
extension UIDevice {
public func cs_screenSize() -> CGSize
public func cs_isIPhone4s() -> Bool
public func cs_isIPhone5() -> Bool
public func cs_isIPhone6() -> Bool
public func cs_isIPhone6Plus() -> Bool
public func cs_isIPhone6PlusBigMode() -> Bool
public func cs_isIPadAir2() -> Bool
public func cs_isIPadPro() -> Bool
}
extension UIDevice {
public func cs_currentLanguage() -> String
public func cs_isCurrentLanguage_en() -> Bool
public func cs_isCurrentLanguage_zh_Hans() -> Bool
public func cs_isCurrentLanguage_zh_Hant() -> Bool
public func cs_isCurrentLanguage_ja() -> Bool
public func cs_isCurrentLanguage_ko() -> Bool
}
extension UIApplication {
public func cs_appDelegate() -> UIApplicationDelegate
public func cs_currentViewController() -> UIViewController
}
extension UIApplication {
public func cs_appVersion() -> String
public func cs_appVersionInAppStore(appId: String) -> String
public func cs_isRunningAppVersionReleased(appId: String) -> Bool
}
extension UIApplication {
public func cs_snapShot(inView: UIView) -> UIImage
}
另外, 其中的CSNetworkManager可用于同步獲取網(wǎng)絡請求的JSON數(shù)據(jù).
public class CSNetworkManager : NSObject {
public class func sharedInstance() -> CSSwiftExtension.CSNetworkManager
public class func cs_GET(urlString: String, completionHandler: (jsonObject: AnyObject) -> Void)
public class func cs_getJSONObjectSynchronously(urlString: String, completionHandler: (jsonObject: AnyObject) -> Void) -> AnyObject
}
下面, 介紹CSSwiftExtension的發(fā)布過程.
創(chuàng)建并正確配置項目的podspec文件
pod spec create CSSwiftExtension
生成的CSSwiftExtension.podspec文件如下:
Pod::Spec.new do |s|
s.name = "CSSwiftExtension"
s.version = "0.0.1"
s.summary = "Some useful extension for Swift."
s.description = <<-DESC
Some useful extension for Swift.
Including Foundation, UIKit and CSNetworkManager.
DESC
s.homepage = "https://github.com/icetime17/CSSwiftExtension"
s.license = { :type => "MIT", :file => "LICENSE.md" }
s.author = { "Chris Hu" => "xxxxx@126.com" }
s.platform = :ios, "8.0"
s.source = { :git => "https://github.com/icetime17/CSSwiftExtension.git", :tag => "#{s.version}" }
s.source_files = "CSSwiftExtension/**/*"
s.requires_arc = true
end
其中, s.source_files指定源文件的路徑.
然后, 執(zhí)行*** pod lib lint *** 可以驗證podspec的正確性.
驗證通過后, 可以將podspec文件也添加到git管理中.
git add CSSwiftExtension.podspec
git commit -m'add podspec file'
git push
git tag -a 0.0.1 -m "Tag 0.0.1"
git push --tags
使用pod trunk命令上傳項目至Cocoapods
pod trunk命令是CocoaPods提供的用來管理個人提交的命令:
命令幫助可以參考getting-setup-with-trunk.
需要先注冊:
pod trunk register xxxxxx@gmail.com 'Chris Hu' --description='Chris Hu'
然后在郵箱中點擊確認之后, 就可以執(zhí)行下邊的命令, 將代碼push到CocoaPods官方了.
pod trunk push CSSwiftExtension.podspec
打印的log如下:
? CSSwiftExtension [develop] pod trunk push CSSwiftExtension.podspec
Updating spec repo `master`
Validating podspec
-> CSSwiftExtension (0.0.1)
Updating spec repo `master`
- Data URL: https://raw.githubusercontent.com/CocoaPods/Specs/32d8166bff5e30508e565d1c76db980ab5de987f/Specs/CSSwiftExtension/0.1/CSSwiftExtension.podspec.json
- Log messages:
- June 25th, 13:51: Push for `CSSwiftExtension 0.0.1' initiated.
- June 25th, 13:51: Push for `CSSwiftExtension 0.0.1' has been pushed (0.282206408 s).
成功之后即可通過*** pod search CSSwiftExtension *** 來搜索:
-> CSSwiftExtension (0.0.1)
Some useful extension for Swift.
pod 'CSSwiftExtension', '~> 0.0.1'
- Homepage: https://github.com/icetime17/CSSwiftExtension
- Source: https://github.com/icetime17/CSSwiftExtension.git
- Versions: 0.0.1 [master repo]
另外, 可使用*** pod trunk delete CSSwiftExtension 0.0.1 *** 來刪除該提交.
而*** pod trunk me *** 可用來查看相應的信息.
我們在CocoaPods的目錄中, 可以看到相關信息了.
? CSSwiftExtension [master] pwd
/Users/chris/.cocoapods/repos/master/Specs/CSSwiftExtension
? CSSwiftExtension [master] ls
0.0.1 0.0.2 0.0.3
? CSSwiftExtension [master]
CocoaPods官方的類庫都是在master目錄下.
如果, 我們需要添加私人的pod庫, 在Podfile中加入
source 'http://xxxxx.com/iosmodules/specs.git' ***
然后, 執(zhí)行*** pod install *** 或者 *** pod udpate *** 的時候, 會將該source中所有pod庫的spec信息都拉取到本地, 在/Users/chris/.cocoapods/repos/目錄下單獨建立一個新的目錄用于存儲這些spec, 然后我們使用*** pod search *** 即可查詢到這些類庫.
Demo
做到了這些, 就能在CocoaPods上使用自己的代碼庫了.
Demo請參考
CSSwiftExtension.
如果覺得在Swift代碼中用得上, 請在github上給個star吧.