使用CocoaPods開發(fā)Framework

前言

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,165評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,435評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,943評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,175評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,713評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,599評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,788評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,034評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評(píng)論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,408評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,747評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容