前言
1.什么是CocoaPods
當(dāng)你開發(fā)iOS應(yīng)用時(shí),會(huì)經(jīng)常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個(gè)類庫又用到其他類庫,所以要使用它,必須得另外下載其他類庫,而其他類庫又用到其他類庫,“子子孫孫無窮盡也”,這也許是比較特殊的情況。總之小編的意思就是,手動(dòng)一個(gè)個(gè)去下載所需類庫十分麻煩。另外一種常見情況是,你項(xiàng)目中用到的類庫有更新,你必須得重新下載新版本,重新加入到項(xiàng)目中,十分麻煩。如果能有什么工具能解決這些惱人的問題,那將“善莫大焉”。所以,你需要 CocoaPods。
CocoaPods應(yīng)該是iOS最常用最有名的類庫管理工具了,上述兩個(gè)煩人的問題,通過cocoaPods,只需要一行命令就可以完全解決,當(dāng)然前提是你必須正確設(shè)置它。重要的是,絕大部分有名的開源類庫,都支持CocoaPods。所以,作為iOS程序員的我們,掌握CocoaPods的使用是必不可少的基本技能了。
2.CocoaPods的原理
CocoaPods的原理是將所有的依賴庫都放到另一個(gè)名為Pods的項(xiàng)目中,然后讓主項(xiàng)目依賴Pods項(xiàng)目,這樣,源碼管理工作都從主項(xiàng)目移到了Pods項(xiàng)目中。Pods項(xiàng)目最終會(huì)編譯成一個(gè)名為libPods.a的文件,主項(xiàng)目只需要依賴這個(gè).a文件即可。
3.CocoaPods安裝和使用可以參考下面鏈接
https://www.cnblogs.com/YangFuShun/p/7976811.html
4.framework制作
4.1創(chuàng)建一個(gè)workspace項(xiàng)目:
①在桌面創(chuàng)建文件夾ZCBLSDK
②打開Xcode,創(chuàng)建一個(gè)workspace,Xcode--->File--->New--->Workspace
③把創(chuàng)建好的workspace放在桌面上文件夾ZCBLSDK中
4.2創(chuàng)建一個(gè)project項(xiàng)目:
①打開ZCBLSDK.workspace文件,Xcode--->File--->New--->Project--->iOS--->Cocoa Touch Framework--->Next--->Product Name (ZCBLSDK)--->Next---Add to和Group 選擇ZCBLSDK--->Create
4.3創(chuàng)建一個(gè)測(cè)試Demo項(xiàng)目:
①打開ZCBLSDK.workspace文件,Xcode--->File--->New--->Project--->iOS--->Single View Application--->Next--->Product Name (ZCBLSDKDemo)--->Next---Add to和Group 選擇ZCBLSDK--->Create
4.4創(chuàng)建一個(gè)測(cè)試類:
①在ZCBLSDK.project下創(chuàng)建一個(gè)ZCBLSDKTest類,繼承于NSObject,打印一條日志信息,在ZCBLSDKTest的.h文件中聲明一個(gè)方法+(void)test;在ZCBLSDKTest的.m文件中實(shí)現(xiàn)+(void)test{NSLog(@"Hello Wold !!!");}
②設(shè)置Build Setting參數(shù),將Build Active Architecture only設(shè)置為NO
③根據(jù)SDK需要支持的ARM處理器配置Architecture
④設(shè)置Headers,將要公開的頭文件拖到Public下,要隱藏的放到Private或者Project下,隱藏的頭文件不能被引用,選擇ZCBLSDK--->Build Phases--->Headers
⑤在ZCBLSDK.h中將所有要公開的.h引入#import<ZCBLSDK/ZCBLSDKTest.h>
4.5導(dǎo)出.framwork文件:這里提供兩種導(dǎo)出方式,一種手動(dòng)導(dǎo)出,一種腳本導(dǎo)出
①手動(dòng)導(dǎo)出:選擇ZCBLSDK.project--->Edit Scheme--->Run--->Build Configuration--->Release--->然后分別用真機(jī)和模擬器進(jìn)行編譯,編譯成功后選擇Products下面的ZCBLSDK.framework然后右鍵Show in Finder,拷貝Release-iphoneos和Release-iphonesimulator文件下放在桌面新建文件夾ZCBLFramework(自己命名)文件下,然后打開終端命令合并庫文件:cd?ZCBLFramework下面,執(zhí)行l(wèi)ipo -create?Release-iphoneos/ZCBLSDK.framework/ZCBLSDK?Release-iphonesimulator/ZCBLSDK.framework/ZCBLSDK -output?ZCBLSDK,查看framework支持的架構(gòu):lipo -info?ZCBLSDK
補(bǔ)充:
arm7: 在最老的支持iOS7的設(shè)備上使用
arm7s: 在iPhone5和5C上使用
arm64: 運(yùn)行于iPhone5S的64位 ARM 處理器 上
i386: 32位模擬器上使用
x86_64: 64為模擬器上使用
注意: 高位兼容地位(32位兼容16位),arm7版本可以在arm7s上運(yùn)行
需要在對(duì)應(yīng)架構(gòu)設(shè)備上運(yùn)行,才能生成對(duì)應(yīng)架構(gòu)的包
②腳本導(dǎo)出:創(chuàng)建一個(gè)Aggregare,Xcode--->Editor--->Add Target--->Cross-platform--->Aggregate--->Next--->Product Name(ZCBLSDKAG)--->finish--->嵌入腳本,選中剛創(chuàng)建的Aggregate,然后選中右側(cè)的Build Phases,點(diǎn)擊左邊的+號(hào),選擇New Run Script Phases,把下面的腳本復(fù)制進(jìn)去:
# Sets the target folders and the final framework product.
#如果工程名稱和Framework的Target名稱不一樣的話,要自定義FMKNAME
#例如: FMK_NAME ="MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root
folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration"Release"-target"${FMK_NAME}"-sdk iphoneos clean build
xcodebuild -configuration"Release"-target"${FMK_NAME}"-sdk iphonesimulator clean build
# Cleaning the oldest.
if[ -d"${INSTALL_DIR}"]
then
rm -rf"${INSTALL_DIR}"
fi
mkdir -p"${INSTALL_DIR}"
cp -R"${DEVICE_DIR}/""${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" - output"${INSTALL_DIR}/${FMK_NAME}"
rm -r"${WRK_DIR}"
open"${INSTALL_DIR}"
③編譯,選中剛創(chuàng)建的Aggregare,command+B,編譯通過在finder中找到framework,拷貝出來。
④測(cè)試framework,把剛生成的framework添加到ZCBLSDKDemo中,導(dǎo)入頭文件#import<ZCBLSDK/ZCBLSDK.h>,使用[ZCBLSDKTest test],發(fā)現(xiàn)控制臺(tái)打印Hello Wold !!!說明framework和ZCBLSDKDemo關(guān)聯(lián)成功,修改framework中ZCBLSDKTest類中test的代碼,+(void)test{NSLog(@"Hello Framework !!!");},再次運(yùn)行發(fā)現(xiàn)控制臺(tái)打印Hello Framework !!!,這時(shí)候說明framework已經(jīng)制作成功。
5.發(fā)布framework到CocoaPods
5.1創(chuàng)建GitHub倉庫并上傳framework到GitHub倉庫
5.1.1打開https://github.com,沒有賬號(hào)先注冊(cè)賬號(hào),然后登陸。
5.1.2登陸完成之后點(diǎn)擊Start a project,然后根據(jù)自己的實(shí)際情況配置項(xiàng)目。
5.1.3創(chuàng)建成功后clone遠(yuǎn)程倉庫到本地:
①cd Documents ?你希望存放的地址?
②執(zhí)行g(shù)it clone ?倉庫地址
③然后將剛剛生成的ZCBLSDK.framework放在一個(gè)命名為Frameworks的文件夾中,然后將Frameworks文件夾放在clone下來的文件夾中。
5.1.4提交到GitHub:
①git add --all
②git commit -m'init framework'
③git push
5.1.5設(shè)置Tag:
①git tag 1.0.0
②git push origin --tags
5.2創(chuàng)建Trunk賬戶
5.2.1注冊(cè)Trunk賬戶:
①pod trunk register郵箱地址 ‘用戶名’ –verbose,注冊(cè)命令執(zhí)行完之后,對(duì)應(yīng)的郵箱地址會(huì)收到一封郵件,去郵箱確認(rèn)注冊(cè)。
5.2.2查看自己的注冊(cè)信息:
①pod trunk me
5.3創(chuàng)建.podspec文件
5.3.1.podspec文件的作用是為了讓CocoaPods搜索引擎知道該代碼的作者、版本號(hào)、概要、描述、源代碼地址、部署版本、依賴的框架等描述信息。
5.3.2創(chuàng)建.podspec文件:
①cd?Documents 從GitHub上面clone下來文件夾目錄執(zhí)行pod spec create?ZCBLSDK
②雙擊打開ZCBLSDK.podspec文件進(jìn)行編輯
Pod::Spec.new do |s|
#名稱
? s.name? ? ? ? = "ZCBLSDK"
#版本號(hào)
? s.version? ? ? = "1.0.0"
#簡(jiǎn)介
? s.summary? ? ? = "ZCBLSDK is about test framework"
#描述
? s.description? = "ZCBLSDK is about test framework!!!"
#項(xiàng)目主頁地址
? s.homepage? ? = "https://github.com/cheerharry90/TestGitHub.git"
#許可證
? s.license? ? ? = { :type => "MIT", :file => "LICENSE" }
#作者
? s.author? ? ? ? ? ? = { "cheer_harry" => "cheer_harry@163.com" }
#支持最小系統(tǒng)版本
? s.platform? ? = :ios, "8.0"
#項(xiàng)目的地址 (注意這里的tag位置,可以自己寫也可以直接用s.version,但是與s.version一定要統(tǒng)一)
? s.source = { :git => "https://github.com/cheerharry90/TestGitHub.git", :tag => s.version}
#你的資源路徑
? s.resources = "Frameworks/ZCBLSDK.bundle"
#你的SDK路徑
? s.vendored_frameworks = "Frameworks/ZCBLSDK.framework"
?# s.dependency "WilddogVideoRoom" //?framework中依賴第三方SDK
# ?s.dependency "Wilddog/Sync" // framework中依賴第三方SDK
end
注意此處的.podspec文件不需要上傳GitHub
5.4上傳CocoaPods
5.4.1驗(yàn)證.podspec文件是否合法
pod spec lint?ZCBLSDK.podspec
5.4.2提交.podspec文件到Trunk中
pod trunk push?ZCBLSDK.podspec
提示successfully published則表示上傳成功
注意:驗(yàn)證過程中失敗可以添加--verbose查看原因,
①如果s.dependency包含了.a靜態(tài)庫造成錯(cuò)誤,雖然這并不影響Pod的使用,但是驗(yàn)證是無法通過的,可以通過 --use-libraries 來讓驗(yàn)證通過。
②使用 --use-libraries 雖然不會(huì)出現(xiàn)錯(cuò)誤(error),但是有時(shí)候會(huì)帶來一些警告(waring),警告同樣是無法通過驗(yàn)證的,這時(shí)可以用 --allow-warnings 來允許警告。
pod spec lint ZCBLSDK.podspec --verbose --use-libraries --allow-warnings
5.5使用CocoaPods集成ZCBLSDK
5.5.1打開Xcode創(chuàng)建一個(gè)測(cè)試Demo,在工程目錄下面添加podfile文件,雙擊點(diǎn)開podfile文件添加
platform :ios,'8.0'
target 'TestPodDemo' do
pod 'ZCBLSDK'
end
然后執(zhí)行pod install
注意如果直接執(zhí)行pod search ZCBLSDK出現(xiàn)找不到的情況可以采用以下三種方案解決:
①執(zhí)行pod repo update master
②前往--->前往文件夾--->資源庫--->Caches--->CocoaPods--->刪除search_index.json文件,然后再執(zhí)行pod search ZCBLSDK
③在工程目錄下面添加podfile文件,雙擊點(diǎn)開podfile文件添加
platform :ios,'8.0'
target 'TestPodDemo' do
pod 'ZCBLSDK'
end
然后執(zhí)行pod update