一、創(chuàng)建本地pod私有庫
1.創(chuàng)建git私有庫
在進(jìn)行一切操作之前,先在內(nèi)網(wǎng)創(chuàng)建一個(gè)git倉庫。
這塊我就不多做介紹啦,建庫都會(huì)滴 ~~
https://xxxxxx/xxxx/iOSComponents/XXXXBaseIoTSocketManager.git
2.在本地創(chuàng)建工程
cd到你想要?jiǎng)?chuàng)建pod庫工程的路徑下,并執(zhí)行pod庫創(chuàng)建:
pod lib create XXX(庫名)
因?yàn)榭偙粔Γ裕瑘?zhí)行這步總443的小伙伴們,可以執(zhí)行下面的
pod lib create XXX(庫名) --template-url=https://gitee.com/peter_zhang/pod-template.git
如圖1所示:

回車,回答一下問題:
#選擇使用平臺(tái)
What platform do you want to use?? [ iOS / macOS ]
> iOS
#選擇你想使用的變成語言
What language do you want to use?? [ Swift / ObjC ]
> ObjC
#是否創(chuàng)建一個(gè)demo工程,為了方便測試,選擇Yes
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
#選擇測試框架
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
#是否需要視圖測試
Would you like to do view based testing? [ Yes / No ]
> Yes
#demo工程的class前綴
What is your class prefix?
> XXX
然后會(huì)彈出一個(gè)名為XXXBaseIotSocketManager-Example的工程,目錄如圖2所示:

cd 到 Example 文件夾下, 安裝CocoaPods項(xiàng)目
pod install --no-repo-update
進(jìn)入Example文件夾點(diǎn)擊.xcworkspace的文件夾打開項(xiàng)目,運(yùn)行一下是否成功
如圖3所示:

二、編輯私有庫
1.添加代碼文件 & 資源文件 (復(fù)制粘貼)
如圖4所示,XXXBaseIoTSocketManager目錄下有兩個(gè)文件夾,一個(gè)Assets,一個(gè)Classes文件夾,用來添加資源文件和代碼文件。
把代碼加進(jìn)了Classes文件夾中,如下圖4:

加進(jìn)來應(yīng)該后,工程應(yīng)該如圖5所示:

如果工程目錄中pod中,沒有該索引的話,就自己加一下,如圖6所示,如

2.編輯.podspec配置文件
#
# Be sure to run `pod lib lint BOEBaseIoTSocketManager.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
#名稱
s.name = 'XXXBaseIoTSocketManager'
#這一塊看個(gè)人需求,想要的起始分支。-版本號
s.version = '1.0.0'
#剪短的介紹喲~
s.summary = '這里寫你想要的簡介。。。。'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
#詳細(xì)介紹
s.description = <<-DESC
這里寫你想要的具體描述,有時(shí)候過短的話會(huì)有警告滴~~ 所以,不要逼summary短喲~~
DESC
#s.homepage里面寫你的git主頁,注意是沒有.git的喲~~ 一定要能訪問到,要不然驗(yàn)證不通過
s.homepage = 'https://github.com/jiangsujia@126.com/XXXBaseIoTSocketManager'
#截圖
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
#開源協(xié)議
s.license = { :type => 'MIT', :file => 'LICENSE' }
#作者信息
s.author = { 'jiangsujia@126.com' => 'jiangsujia@126.com' }
#項(xiàng)目地址,不支持SSH的地址,驗(yàn)證不通過,只支持HTTP和HTTPS,最好使用HTTPS
s.source = { :git => 'https://github.com/jiangsujia@126.com/XXXBaseIoTSocketManager.git', :tag => s.version.to_s }
#多媒體介紹地址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
#支持的平臺(tái)及版本
s.ios.deployment_target = '8.0'
#代碼文件地址,**/*表示Classes目錄及其子目錄下所有的文件,如果有多個(gè)目錄則用逗號分組顯示,這里也要做相應(yīng)的設(shè)置
s.source_files = 'XXXBaseIoTSocketManager/Classes/**/*'
#資源文件地址
# s.resource_bundles = {
# 'XXXBaseIoTSocketManager' => ['XXXBaseIoTSocketManager/Assets/*.png']
# }
#公開頭文件
# s.public_header_files = 'Pod/Classes/**/*.h'
#buildsetting相關(guān)設(shè)置
#s.xcconfig = {
# 'ENABLE_BITCODE' => 'NO',
# 'CLANG_CXX_LIBRARY' => 'libstdc++'
#}
#該pod依賴的系統(tǒng)framework,多個(gè)用逗號分隔開
# s.frameworks = 'UIKit', 'MapKit'
#該pod依賴的系統(tǒng)Library,多個(gè)用逗號隔開
#比如 libz.tdb, s.libraries = 'z'
#s.libraries = 'sqlite3',
#第三方.a文件
#s.vendored_libraries = 'XXXBaseIoTSocketManager/Classes/ThirdParty/*.a'
#第三方frameworks文件
#s.vendored_frameworks = 'XXXBaseIoTSocketManager/Classes/ThirdParty/*.framework'
#依賴關(guān)系,該項(xiàng)目所依賴的其他庫,如果有多個(gè)則需要填寫多個(gè)s.dependency
s.dependency 'CocoaAsyncSocket', '~> 7.6.3'
end
3.更新依賴關(guān)系
配置完成后,再次cd到Example文件夾下,更新pod:
jiangsjdeiMac:Example jiangsj$ pod update --no-repo-update
更新完成后打開項(xiàng)目能否正常運(yùn)行,并驗(yàn)證導(dǎo)入的文件是否能調(diào)用
Podfile如下:
use_frameworks!
platform :ios, '8.0'
target 'XXXBaseIoTSocketManager_Example' do
pod 'XXXBaseIoTSocketManager', :path => '../'
pod 'CocoaAsyncSocket', '~> 7.6.3'
target 'XXXBaseIoTSocketManager_Tests' do
inherit! :search_paths
pod 'FBSnapshotTestCase'
end
end
你會(huì)發(fā)現(xiàn),實(shí)際上按照當(dāng)前的podfile進(jìn)行update后,會(huì)報(bào)錯(cuò)如下:

建議先把下面這行在Podfile中注釋了,然后執(zhí)行update,但是你會(huì)發(fā)現(xiàn)目錄下的Development Pods 沒有了,然后再把這行打開,再update,就可以展示完整依賴了。
#先注釋此行,pod update , 然后再打開注釋, 再pod update
pod 'XXXBaseIoTSocketManager', :path => '../'
最終,終端如圖8顯示:

三、提交到私有倉庫
1.驗(yàn)證pod配置文件,為了保證項(xiàng)目正確性,pod文件配置沒問題
1.cd 到你有XXXBaseIoTSocketManager.podspec的文件夾下
2.運(yùn)行pod lib lint XXXBaseIoTSocketManager.podspec
ps:
1.如果出錯(cuò)了,就按照提示修復(fù)錯(cuò)誤,但是有可能沒有錯(cuò)有warnings,比如http什么的,
2.那么可以執(zhí)行 pod lib lint XXXXBaseIoTSocketManager.podspec --allow-warnings
還有幾個(gè)本地驗(yàn)證命令推薦如下:
#本地驗(yàn)證
pod lib lint
#本地驗(yàn)證+詳細(xì)打印信息
pod lib lint --verbose
#本地驗(yàn)證+允許使用靜態(tài)庫
pod lib lint --use-libraries
#本地驗(yàn)證+允許警告
pod lib lint --allow-warnings
#本地驗(yàn)證+快速驗(yàn)證
pod lib lint --quick
整個(gè)過程如圖9所示:

由于我這里有警告所以我就用了--allow-warinings

當(dāng)出現(xiàn)XXX passed validation的時(shí)候,就驗(yàn)證通過了。
事實(shí)上如果你引用了一堆你私有的庫而pod庫search不到,這步lint就會(huì)出現(xiàn)問題。
我試過很多辦法,仍舊是報(bào)錯(cuò),其實(shí),可以簡化這步,如果你能保證你的庫絕對沒有問題,不執(zhí)行l(wèi)int也可以的。
2.發(fā)布項(xiàng)目到私有庫中,此時(shí)切換公司內(nèi)網(wǎng)。
1.添加遠(yuǎn)程倉庫,就是之前我們在內(nèi)網(wǎng)建的庫
git remote add origin 你的倉庫地址.git
2.添加文件
git add .
3.提交本地,并且添加描述
git commit -m "第一次提交"
4.推送本地代碼到遠(yuǎn)程
git push origin master
5.打tag
git tag 1.0.0
6.推送tag到遠(yuǎn)程
git push origin 1.0.0
然后打開你的倉庫地址,就可以看到我們的代碼已經(jīng)提交上去了,如圖11。

由于我上面.podspec文件填寫的是branch是1.0.0,我又減了一個(gè)1.0.0分支。
3.創(chuàng)建Spec的管理庫。
創(chuàng)建本地執(zhí)行Spec命令
pod repo add XXXBaseIoTSocketManager(你的庫名稱) http://XXXX.git(你的庫地址)
接下來就可以發(fā)布了
將自己的私有庫添加到Spec管理中
pod repo push XXXBaseIoTSocketManager(你的庫名稱) XXXBaseIoTSocketManager.podspec
這步其實(shí)也不是必須的,因?yàn)槲沂菍it管理clone到本地,所以本步驟省略也無所謂。
4.檢驗(yàn)私有庫的發(fā)布跟使用
在私有庫引用了私有庫的情況下,在驗(yàn)證和推送私有庫的情況下都要加上所有的資源地址,不然pod會(huì)默認(rèn)從官方repo查詢。
pod spec lint --sources='私有倉庫repo地址,https://github.com/CocoaPods/Specs'
pod repo push 本地repo名 podspec名 --sources='私有倉庫repo地址,https://github.com/CocoaPods/Specs'
5.引用自己或第三方的framework或.a文件
在podsepc中應(yīng)該這樣寫:
s.ios.vendored_frameworks = "xxx/**/*.framework"
s.ios.vendored_libraries = "xxx/**/*.a”
6.私有庫中添加資源(圖片、音視頻等)
方法有三種:
- 第一種
spec.resources = ["Images/*.png", "XXX/*"]
但是這些資源會(huì)在打包的時(shí)候直接拷貝的app的Bundle中,這樣說不定會(huì)和其它資源產(chǎn)生命名沖突
- 第二種
spec.resource = "Resources/MYLibrary.bundle"
把資源都放在bundle中,然后打包時(shí)候這個(gè)bundle會(huì)直接拷貝進(jìn)app的mainBundle中。使用的時(shí)候在mainBundle中查找這個(gè)bundle然后再搜索具體資源
NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"XXXBundle" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
- 第三種
spec.resource_bundles = {
'xxxx' => ['Resources/*.png'],
'OtherResources' => ['OtherResources/*.png']
}
這種方法利用 framework 的命名空間,有效防止了資源沖突。
使用方法是先拿到最外面的 bundle,然后再去找下面指定名字 的 bundle 對象,再搜索具體資源
NSBundle *bundle = [NSBundle bundleForClass:[MYSomeClass class]];
NSURL *bundleURL = [bundle URLForResource:@"xxxx" withExtension:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
7.檢驗(yàn)私有庫的發(fā)布跟使用
在項(xiàng)目中的Podfile中添加
pod 'xxxBaseIoTSocketManager', :git => 'http://xxxx/XXXBaseIoTSocketManager.git', :branch =>'1.0.0'
如下圖12所示:

如果沒有索引庫,先新建一個(gè)
pod repo add [你的Specs] [你的私有庫Specs.git]
pod spec lint XXXX.podspec --verbose --allow-warnings --use-libraries --sources='公有庫Specs.git,私有庫Specs.git'
pod repo push XXXXSpecs XXXX.podspec --verbose --allow-warnings --use-libraries --sources='公有庫Specs.git,私有庫Specs.git'
工程如下13圖所示:

導(dǎo)入成功就可以使用了。
但是要注意的是,如果你要是在庫中引用了三方庫,那么你要提前在外網(wǎng)把三方庫的引入在你的工程中引入一遍,注釋后再切換到內(nèi)網(wǎng)。如果你這個(gè)庫引用了私有庫,也一并pod進(jìn)來就好了,注意是顯式pod。