一直認(rèn)為搞Pods庫(kù)都是一件很高大上的事情,一直有這方面的想法,但是因?yàn)楸救送涎影┩砥诰鸵恢睌R置了。這次正好有需求索性就搞一下并記錄下來(lái)。
簡(jiǎn)述一下創(chuàng)建流程:
1.創(chuàng)建.podspec
2.編輯.podspec
3.將代碼上傳至:碼云/Github
4.驗(yàn)證podspec合法性
5.注冊(cè)CocoaPods
6.發(fā)布
再上一個(gè)我自己制作的圖,根據(jù)我的理解標(biāo)出來(lái)關(guān)系指向圖:云端Pods庫(kù)、本地倉(cāng)庫(kù)、碼云/Github代碼庫(kù)的關(guān)系。他們之間主要關(guān)聯(lián)的媒介就是.podspec文件,按照度娘來(lái)說(shuō),它叫做:第三方代碼庫(kù)的配置索引文件,雖然名字很長(zhǎng),但是很貼切。

1.創(chuàng)建.podspec
終端操作進(jìn)入你的項(xiàng)目文件夾,然后執(zhí)行:pod spec create XXX。你的項(xiàng)目文件夾中就會(huì)多出來(lái)一個(gè)XXX.podspec文件。
bogon:XLpjsip xiaolu$ cd /Users/xiaolu/Desktop/XLpjsip
bogon:XLpjsip xiaolu$ pod spec create XLpjsip
Specification created at XLpjsip.podspec
2.編輯.podspec
現(xiàn)在可以打開(kāi)你的podspec文件,我是直接將我的.podspec文件拷貝在下面了。
Pod::Spec.new do |s|
//框架名稱,注意這里要和.podspec文件的名稱一致
s.name = "XLpjsip"
s.version = "0.0.1"
//框架簡(jiǎn)介,會(huì)在pod search后顯示在終端上的簡(jiǎn)介
s.summary = "基于pjsip 2.8.0版集成"
//框架主頁(yè)地址
s.homepage = "https://gitee.com/TheLazyCoder"
//作者名稱或聯(lián)系方式,全憑自己喜好
s.author = '32510112@qq.com'
//框架代碼地址,很重要
s.source = { :git => "https://gitee.com/TheLazyCoder/XLpjsip.git", :tag => "#{s.version}" }
//框架支持的最低平臺(tái)版本
s.platform = :ios, '8.0'
//框架簡(jiǎn)介
s.description = <<-DESC
DESC
//框架遵守的開(kāi)源協(xié)議
s.license = {
:type => 'Dual-License',
:text => <<-LICENSE
PJSIP source code ("The Software") is licensed under both General Public License (GPL) version 2 or later and a proprietary license that can be arranged with us. In practical sense, this means:
if you are developing Open Source Software (OSS) based on PJSIP, chances are you will be able to use PJSIP freely under GPL. But please double check here for OSS license compatibility with GPL.
Alternatively, if you are unable to release your application as Open Source Software, you may arrange alternative licensing with us. Just send your inquiry to licensing@teluu.com to discuss this option.
PJSIP may include third party software in its source code distribution. Third Party Software does not comprise part of "The Software". Please make sure that you comply with the licensing term of each software.
LICENSE
}
//框架需要包含的源代碼文件
//1.*表示匹配所有文件。2.{.h,.m} 表示匹配所有以.h和.m結(jié)尾的文件。3.** 表示匹配所有子目錄,以及遞歸子目錄
//例子中的build文件夾與XLpjsip.podspec處于同級(jí)目錄中
s.source_files =[
'build/pjproject/src/pjlib/include/**/*.h',
'build/pjproject/src/pjlib-util/include/**/*.h']
//框架需要的資源文件
s.resources: =[
'build/pjproject/src/pjlib/include/**/*.h',
'build/pjproject/src/pjlib-util/include/**/*.h']
//框架公開(kāi)的頭文件,能夠使用<>方法
s.public_header_files =[
'build/pjproject/src/pjlib/include/**/*.h',
'build/pjproject/src/pjlib-util/include/**/*.h']
//框架install 或者 update之后不會(huì)更新的文件路徑
s.preserve_paths =['build/pjproject/src/pjlib/include/**/*',
'build/pjproject/src/pjlib-util/include/**/*']
//框架第三方.a文件
s.vendored_libraries =['build/openh264/lib/*.a',
'build/pjproject/src/pjlib-util/lib/*.a']
header_search_paths =['"$(PODS_ROOT)/Headers/Public/XLpjsip/pjlib/include"',
'"$(PODS_ROOT)/Headers/Public/XLpjsip/pjlib-util/include"']
//框架需要配置參數(shù)環(huán)境
s.xcconfig = {
'HEADER_SEARCH_PATHS' => header_search_paths.join(' '),
'GCC_PREPROCESSOR_DEFINITIONS' => 'PJ_AUTOCONF=1'
}
//框架依賴庫(kù)
s.dependency 'AFNetworking', '~> 2.3'
s.dependency 'OpenSSL-Universal'
//框架依賴的frameworks
s.frameworks = 'CFNetwork', 'AudioToolbox', 'AVFoundation', 'CoreMedia'
//框架依賴的libraries
s.libraries = 'stdc++'
//保護(hù)目錄結(jié)構(gòu)不變,如果不設(shè)置,所有頭文件都將被放到同一個(gè)目錄下
s.header_mappings_dir = 'build/pjproject/src'
//框架是否支持ARC
s.requires_arc = false
end
3.將代碼上傳至碼云/Github
在碼云創(chuàng)建公開(kāi)庫(kù),隨后將代碼上傳(注意:代碼上傳時(shí)必須打tag,跟.podspec的版本相同)。具體git庫(kù)的創(chuàng)建,還有代碼的上傳我就不在發(fā)流程了。簡(jiǎn)單列一下終端操作順序:
git add .
git commit -m ''
git remote add origin https://gitee.com/TheLazyCoder/XLpjsip
// 第一次push如果報(bào)錯(cuò)的話可以加上-f
// git push -f origin master
git push origin master
git tag "0.0.1"
//將tag推送到遠(yuǎn)程倉(cāng)庫(kù)
git push --tags


代碼碼云地址
4.驗(yàn)證podspec合法性
驗(yàn)證podspec時(shí)有兩步驗(yàn)證,第一步是驗(yàn)證你本地索引庫(kù)的podspec文件是否正確,第二步是驗(yàn)證你遠(yuǎn)程索引庫(kù)的podspec文件是否正確。
//本地驗(yàn)證索引,或:pod lib lint --allow-warnings 忽略警告
pod lib lint
// 遠(yuǎn)程驗(yàn)證索引,或:pod spec lint --allow-warnings 忽略警告
pod spec lint
//兩種驗(yàn)證成功后都會(huì)提示:
XLpjsip.podspec passed validation.
我遇到的坑
我在驗(yàn)證時(shí)一直提示有五個(gè)錯(cuò)誤,提示:source_files、preserve_paths、vendored_libraries、public_header_files、header_mappings_dir這五個(gè)參數(shù)設(shè)置的資源文件路徑都是錯(cuò)誤的,全部都找不到文件。我前前后后修改過(guò)N遍,每次本地驗(yàn)證都可以通過(guò),但是遠(yuǎn)程驗(yàn)證就報(bào)錯(cuò)?。『髞?lái)度娘了很久查到一個(gè)方法:就是換一個(gè)tag,將碼云上的代碼庫(kù)及podspec文件的版本同時(shí)換一個(gè)版本。隨后完美解決,個(gè)人認(rèn)為是什么地方存在緩存所導(dǎo)致的,但是沒(méi)有去分析定位bug點(diǎn),索性改一個(gè)版本算了,被bug卡一天還是比較崩潰的。
我出現(xiàn)錯(cuò)誤的截圖.png
5.注冊(cè)CocoaPods
接下來(lái)就是注冊(cè)CocoaPods了,別吃驚,我本來(lái)也不知道CocoaPods需要注冊(cè)…… CocoaPods注冊(cè)還是比較簡(jiǎn)單的,終端注冊(cè),隨后等郵件,確認(rèn)一下就好了。
pod trunk register '郵箱' '用戶名'
//查看注冊(cè)信息
pod trunk me
- Name: XXXXX
- Email: **********@qq.com
- Since: April 19th, 02:23
- Pods:
- XLpjsip
- Sessions:
-Description: Test1
6.發(fā)布
pod trunk push --allow-warnings
//這個(gè)過(guò)程比較久,還會(huì)有很多驗(yàn)證信息,耐心等待即可。
//出現(xiàn)如下提示就可以試著搜索pod search一下了
--------------------------------------------------------------------------------
?? Congrats
?? XLpjsip (2.8.1) successfully published
?? April 21st, 20:30
?? https://cocoapods.org/pods/XLpjsip
?? Tell your friends!
到此你的遠(yuǎn)程公開(kāi)庫(kù)就創(chuàng)建成功了,但是現(xiàn)在你大概率是search不到的,因?yàn)槟阈枰獎(jiǎng)h除本地的索引庫(kù),再刪除本地的pod搜索記錄,有的還需要你更新本地索引庫(kù)才行。
前往路徑:~/.cocoapods/repos 刪除除了master文件夾的多余文件夾。

隨后終端執(zhí)行:
//刪除搜索記錄
rm ~/Library/Caches/CocoaPods/search_index.json
//再試著搜索一下
pod search XLpjsip
-> XLpjsip (0.0.1)
基于pjsip 2.8.0版集成
pod 'XLpjsip', '~> 0.0.1'
- Homepage: https://gitee.com/TheLazyCoder
- Source: https://gitee.com/TheLazyCoder/XLpjsip.git
- Versions: 0.0.1 [master repo]
到現(xiàn)在就證明你的遠(yuǎn)程公開(kāi)庫(kù)已經(jīng)發(fā)布成功了,這個(gè)時(shí)候就需要點(diǎn)個(gè)紅心嗨皮一下了??????
