ios從開(kāi)發(fā)Framework到提交Cocoapods


最近因?yàn)楣卷?xiàng)目需求,需要提供靜態(tài)庫(kù)給其他公司使用;這個(gè)項(xiàng)目做完了發(fā)現(xiàn)遇到很多坑,因?yàn)榫W(wǎng)上太多這樣的教程,本文只是在此梳理一下整個(gè)開(kāi)發(fā)流程。

一、靜態(tài)庫(kù)的簡(jiǎn)單介紹

ios靜態(tài)庫(kù)分為 .a和.framework;同樣有靜態(tài)庫(kù)就有動(dòng)態(tài)庫(kù),動(dòng)態(tài)庫(kù)在ios中是 .dylib和.framework;系統(tǒng)提供的.framework都是動(dòng)態(tài)庫(kù),我們自己寫的.framework都是靜態(tài)庫(kù)(我們提供動(dòng)態(tài)庫(kù)是不能通過(guò)審核的)。為什么我在項(xiàng)目中選擇framework開(kāi)發(fā),主要因?yàn)?a文件必須手動(dòng)提供對(duì)應(yīng)的.h文件,而framework包括了.h文件和.a文件。

二、Framework的開(kāi)發(fā)

1.創(chuàng)建一個(gè)project選擇framework

創(chuàng)建Framework

2.創(chuàng)建名為:DFFramework的工程

DFFramework項(xiàng)目

3.本文主要意圖在意整個(gè)流程,所以功能隨意一點(diǎn),創(chuàng)建一個(gè)簡(jiǎn)單的加法運(yùn)算類DFAdditionOperation,實(shí)現(xiàn)一個(gè)additionOneNum的類方法,另:靜態(tài)庫(kù)中也可以使用cocoapods管理自己用到的第三方庫(kù),當(dāng)然第三方庫(kù)在最后生成的文件中不會(huì)包含其中,所以當(dāng)別人用到你的庫(kù)的時(shí)候,也必須要加載你所使用的第三方庫(kù)來(lái)支持你的庫(kù)。

功能

4.在DFFramework中導(dǎo)入需要暴露給用戶的頭文件:

導(dǎo)入頭文件

5.修改為靜態(tài)庫(kù)

靜態(tài)庫(kù)

6.把我們需要暴露給用戶的頭文件移動(dòng)到public中

暴露頭文件

7.到目前為止基本的創(chuàng)建framework工作已經(jīng)完成,那么如何提供給其他人用呢?目前為止我們可以通過(guò)選擇虛擬器或者真機(jī)生成framework,這種方式生成的framework是分開(kāi)使用對(duì)應(yīng)的虛擬器和真機(jī)。這種方式很復(fù)雜,下面我們用腳本來(lái)生成虛擬器和真機(jī)通用的framework。另:用到aggregate,關(guān)于aggregate具體介紹可以Google學(xué)習(xí)。

8.創(chuàng)建Aggregate名為:DFAggregate

file->new->target->進(jìn)入下圖頁(yè)面

創(chuàng)建Aggregate

9.在DFAggregate下添加DFFramework.framework

添加.framework

10.創(chuàng)建可執(zhí)行的腳本文件

創(chuàng)建腳本文件

11.填入腳本

# 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}"


腳本文件

12.大功告成,編譯DFAggregate自動(dòng)彈出.framework文件

生成的framework

三、將Framework提交Cocoapods

cocoapods默認(rèn)只能基于git的代碼管理,所以以下操作基于mac環(huán)境安裝了cocoapods、并且熟悉git操作,本文是在github和cocoa pods聯(lián)合使用,當(dāng)然也可以用其他git平臺(tái)或者自己搭建的git平臺(tái)。

1.安裝cocoapods的打包插件

sudo gem install cocoapods-packager

2.創(chuàng)建git代碼管理倉(cāng)庫(kù)

本文基于github開(kāi)源平臺(tái)作為代碼管理。在新建倉(cāng)庫(kù)時(shí)候按照以下配置創(chuàng)建

github倉(cāng)庫(kù)

3.將上面生成的Framework整個(gè)push到github服務(wù)器上面去


push該.framework

4.給穩(wěn)定的代碼打上版本tag,一般以版本號(hào)作為tag名字

git tag -a

5.將tag推送到git服務(wù)器

git push --tags

6.注冊(cè)trunk

//注冊(cè)郵箱和用戶名:pod trunk register XXX@XXX.com '名字' --verbose

//查看注冊(cè)信息:pod trunk me

成功后顯示信息

7.配置自己的podspec文件

這一步是至關(guān)重要的一步,也是坑最多的一步,發(fā)現(xiàn)網(wǎng)上有很多關(guān)于pod源碼的文章,很少有framework的文章,如果和我一樣遇到很多坑的同學(xué),能自己慢慢的去填坑,本文也只是記錄成功上傳的流程。大家可以在網(wǎng)上找找.podspec文件自己改改,自己寫反而容易出錯(cuò)。

Pod::Spec.new do |s|

s.name ? ? ? ? = 'DFFramework'

s.version ? ? ?= "1.0.1"

s.summary ? ? ?= 'DFFramework is test.'

s.license ? ? ?= 'MIT'

s.author ? ? ? = { "注冊(cè)的名字" => "注冊(cè)的郵件" }

s.homepage ? ? = 'https://github.com/xxx/DFFramework'

s.source ? ? ? = { :git => "https://github.com/xxx/DFFramework.git", :tag => s.version}

s.platform ? ? = :ios

s.ios.deployment_target = "7.0"

s.frameworks = 'Foundation'

s.vendored_frameworks = 'DFFramework.framework'

s.requires_arc = true

end

上面就是.podspec的配置,其他字段沒(méi)什么可說(shuō)的了,網(wǎng)上一大把介紹,這里主要介紹與網(wǎng)上不同的地方是:s.vendored_frameworks = 'DFFramework.framework' 因?yàn)槲覀円峤坏絚ocoa pods的是.framework靜態(tài)庫(kù),所以這個(gè)字段必不可少,如果用到了第三方可以比如:AFNetworking,就要在s.dependency 'AFNetworking', '~> 2.6.1'

8.驗(yàn)證podspec文件

編輯完podspec文件后,需要驗(yàn)證一下這個(gè)文件是否可用,如果有任何WARNING或者ERROR都是不可以的,需要修改錯(cuò)誤,知道驗(yàn)證通過(guò)podspec文件才可用,以下命令驗(yàn)證:

pod lib lint

9.提交cocoa pods

pod trunk push DFFramework.podspec

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容