今天寫完了一個(gè)小框架瓤球,需要打包成framework供項(xiàng)目使用融欧,于是查閱了相關(guān)資料,終于完成了打包的工作卦羡,在這里記錄一下噪馏。
1.創(chuàng)建Workspace.
2.選擇創(chuàng)建一個(gè)Cocoa touch Framework
新建完一個(gè)工程之后發(fā)現(xiàn)只有一個(gè)頭文件,我們需要將所有對(duì)外暴露的方法都寫在里面绿饵,如果已經(jīng)寫了其他的頭文件欠肾,則把這個(gè)文件直接刪除。
3.接著我們將需要打包的類文件拖進(jìn)去拟赊。
這里記得選擇拷貝
將文件復(fù)制進(jìn)去以后刺桃,我們來到
Build Phases > Headers
這里可以看到我們把需要暴露的頭文件移動(dòng)到Public即可,直接拖過去就可以了吸祟。
這里如果又依賴需要先添加一下瑟慈,這里我們需要sqllite桃移,所以添加sqllite3.tbd
然后我們選擇模擬器,注意 葛碧,這里需要選擇模擬器才可以谴轮,后面我們會(huì)講到,然后build吹埠,如果沒出現(xiàn)錯(cuò)誤的話,這個(gè)時(shí)候我們就可以看到打包完成了疮装,framework靜靜的躺在Products的里面缘琅。
這時(shí)候我們可以新建一個(gè)工程然后將framework拖進(jìn)去就直接可以用了。但是事情并沒有結(jié)束廓推,如果我們嘗試在真機(jī)中跑的話刷袍,會(huì)出現(xiàn)錯(cuò)誤。因?yàn)槲覀兙幾g的時(shí)候用的是模擬器樊展,他是X86_64架構(gòu)的呻纹,而真機(jī)是arm架構(gòu)的,自然會(huì)出現(xiàn)錯(cuò)誤专缠,這里我們可以想到可以用真機(jī)再build一次那不就可以了嘛雷酪,確實(shí)可以,但是我們每次build都需要跑兩次涝婉,噢 不止兩次哥力,現(xiàn)在Apple的cpu架構(gòu)如下
- arm7: 在最老的支持iOS7的設(shè)備上使用
- arm7s: 在iPhone5和5C上使用
- arm64: 運(yùn)行于iPhone5S的64位 ARM 處理器 上
- i386: 32位模擬器上使用
- x86_64: 64為模擬器上使用
build完了還需要通過lipo命令把他們合起來,實(shí)在是非常麻煩墩弯。這時(shí)候就需要寫一個(gè)腳本來自動(dòng)化實(shí)現(xiàn)這個(gè)過程吩跋。
首先我把需要做的事列舉一下,
1.在所有架構(gòu)下都build一遍渔工。
2.使用lipo命令合成一個(gè)
3.將framework移動(dòng)到指定位置锌钮。
我們先添加一個(gè)腳本,然后在里面寫上
set -e
set +u
# Avoid recursively calling this script.
if [[ $SF_MASTER_SCRIPT_RUNNING ]]
then
exit 0
fi
set -u
export SF_MASTER_SCRIPT_RUNNING=1
# Constants
SF_TARGET_NAME=${PROJECT_NAME}
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
FRAMEWORK_TARGET=TBCrashKitFramework
# Take build target
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]
then
SF_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo "Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi
if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
then
echo "Please choose iPhone simulator as the build target."
exit 1
fi
IPHONE_DEVICE_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos
# 編譯非模擬器版本arm64
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/arm64" SYMROOT="${SYMROOT}" ARCHS='arm64' VALID_ARCHS='arm64' $ACTION
# 編譯非模擬器版本arm7
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/armv7" SYMROOT="${SYMROOT}" ARCHS='armv7 armv7s' VALID_ARCHS='armv7 armv7s' $ACTION
#復(fù)制到相應(yīng)為文件
rm -rf "${UNIVERSAL_OUTPUTFOLDER}"
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_TARGET}.framework" "${UNIVERSAL_OUTPUTFOLDER}/${FRAMEWORK_TARGET}.framework"
#通過lipo命令合并起來
lipo -create "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_TARGET}.framework/${FRAMEWORK_TARGET}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/arm64/${FRAMEWORK_TARGET}.framework/${FRAMEWORK_TARGET}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/armv7/${FRAMEWORK_TARGET}.framework/${FRAMEWORK_TARGET}" -output "${UNIVERSAL_OUTPUTFOLDER}/${FRAMEWORK_TARGET}.framework/${FRAMEWORK_TARGET}"
#這里我將文件復(fù)制到項(xiàng)目的位置引矩,順便打了個(gè)包梁丘。
folderpath="../Framework/${PROJECT_NAME}.framework"
if [ -d $folderpath ]
then
rm -R "../Framework/${PROJECT_NAME}.framework"
echo "exist"
fi
filepath="../Framework/${PROJECT_NAME}.framework.zip"
if [ -f $filepath ]
then
rm "../Framework/${PROJECT_NAME}.framework.zip"
fi
mv "${UNIVERSAL_OUTPUTFOLDER}/${FRAMEWORK_TARGET}.framework" "../Framework/${PROJECT_NAME}.framework"
zip -r "${PROJECT_NAME}.framework" "../Framework/${PROJECT_NAME}.framework"
rm -R "${PROJECT_NAME}.framework"
最后就大功告成了,這里用到了腳本旺韭,腳本其實(shí)在程序中能夠幫我們做很多事情兰吟,從而能實(shí)現(xiàn)自動(dòng)化。