iOS---如何在CocoaPods上发布自己的项目

目前, 在iOS开发中, 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

在项目所在目录下执行*** 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

然后, 执行*** pod install *** 或 *** pod update *** ,
即可安装这些第三方类库. 然后在项目中导入即可使用:

import Alamofire

// xxx

Alamofire.request(.GET, url, parameters: nil).validate()
    .responseJSON { response in
        // xxx
    }

怎么样, 非常方便吧?
看到这里, 是不是也想将自己的一些代码在CocoaPods上发布呢!
接着往下看!

Swift中常见的extension方法

这里, 将以CSSwiftExtension为例, 简单介绍下如何在CocoaPods上发布自己的代码.
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, 即可查询当前版本是否已经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可用于同步获取网络请求的JSON数据.

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的发布过程.

创建并正确配置项目的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指定源文件的路径.

然后, 执行*** 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'

然后在邮箱中点击确认之后, 就可以执行下边的命令, 将代码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' ***

然后, 执行*** pod install *** 或者 *** pod udpate *** 的时候, 会将该source中所有pod库的spec信息都拉取到本地, 在/Users/chris/.cocoapods/repos/目录下单独建立一个新的目录用于存储这些spec, 然后我们使用*** pod search *** 即可查询到这些类库.

Demo

做到了这些, 就能在CocoaPods上使用自己的代码库了.
Demo请参考
CSSwiftExtension.
如果觉得在Swift代码中用得上, 请在github上给个star吧.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容