最近因?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

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

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)入需要暴露給用戶的頭文件:

5.修改為靜態(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è)面

9.在DFAggregate下添加DFFramework.framework

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

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提交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)建

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

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