這兩天一直被問到靜態(tài)庫打包的流程,為了偷個懶,就寫這篇簡書,就不做一一回答,有問題,還望指出改正
.a打包
將提前準備的項目文件及項目資源導(dǎo)入到SDK制作工程中
添加New Header Phase
將制作靜態(tài)庫需要的.h文件添加到Project中而涉,將靜態(tài)庫調(diào)用的頭文件添加到Public中
靜態(tài)庫打包bundle文件>由于演示制作的靜態(tài)庫包含圖片和xib文件呐芥,因此為了規(guī)范,我們需要把圖片和xib文件添加到bundle中所踊,如圖添加給靜態(tài)庫添加bundle資源包
創(chuàng)建好之后,將圖片和xib文件添加到Copy Bundle Resources中
由于.bundle文件屬于macOX類型好唯,所以我們需要改一些配置來適配iOS,如圖所示
TARGETS ->選擇bundle -> Build Settings ->Base SDK ->選擇Latest iOS (iOS 11.2)
設(shè)置Build Setting 中的COMBINE_HIDPI_IMAEGS 為NO,否則Bundle中的圖片就是tiff格式了该押。
作為資源包,僅僅需要編譯就好尽狠,無需安裝相關(guān)配置,設(shè)置Skip Install為YES,同樣需要刪除安裝路徑Installation Dirctory的值
到此為止bundle文件的設(shè)置完成
打包工程和資源文件
找到源文件路徑叶圃,如下圖所示袄膏,到此靜態(tài)庫制作完成,將.libStaticSDK.a和source.bundle和頭文件StaticSDK.h導(dǎo)入到項目中即可使用
3掺冠、合并靜態(tài)庫真機和模擬器文件
我們在制作靜態(tài)庫的時候沉馆,編譯會產(chǎn)兩個.a文件,一個適用于模擬器的德崭,一個是用于真機的斥黑,為了開發(fā)方便我們可以使用終端命令將.a文件進行合并
lipo -create XXX/模擬器.a路徑 XXX/真機.a路徑 -output 合并后的文件名稱.a
4、注意點眉厨,由于資源文件在Bundle文件中因此在使用時需注意锌奴,以下我舉兩個例子,一個是加載圖片憾股,一個是加載xib文件
framework打包
對于使用了Cocoapod導(dǎo)入第三方的xcode工程來講 需要在Podfile中 做如下修改 之后 pod install
需要同時對住工程target 和Framework的target 配置pod環(huán)境
2.build Setting 設(shè)置
選擇工程文件>target第一項>Build Setting>搜索linking鹿蜀,然后幾個需要設(shè)置的選項都顯現(xiàn)出來,首先是Dead Code Stripping設(shè)置為NO荔燎,網(wǎng)上對此項的解釋如下耻姥,大致意思是如果開啟此項就會對代碼中的”dead”销钝、”unreachable”的代碼過濾有咨,不過這個開關(guān)是否關(guān)閉,似乎沒有多大影響蒸健,不過為了完整還原framework中的代碼座享,將此項關(guān)閉也未曾不可。
The resulting executable will not include any “dead” or unreachable code
然后將Link With Standard Libraries關(guān)閉似忧,我想可能是為了避免重復(fù)鏈接
最后將Mach-O Type設(shè)為Static Library渣叛,framework可以是動態(tài)庫也可以是靜態(tài)庫,對于系統(tǒng)的framework是動態(tài)庫盯捌,而用戶制作的framework只能是靜態(tài)庫淳衙。
開始將下圖中的build Active Architecture only選項設(shè)為YES,導(dǎo)致其編譯時只生成當(dāng)前機器的框架,將其設(shè)置為NO后箫攀,發(fā)現(xiàn)用模擬器編譯后生成的framework同時包含x86_64和i386架構(gòu)肠牲。不過這個無所謂,我們之后會使用編譯腳本靴跛,腳本會將所有的架構(gòu)全包含
分別編譯
show in finder 如下
Debug-iphoneos 為Debug模式下真機使用的
Debug-iphonesimulator 為Debug模式下模擬器使用的
Release -iphoneos 為Release模式下真機使用的
Release-iphonesimulator 為Release模式下模擬器使用的
下面的合并和.a一樣操作
下面介紹自動shell腳本合并
1:生成腳本target
2.target設(shè)置
1.添加target依賴
Target Dependencies 選中需要打包的framework + 選擇New Run Script Phase 出現(xiàn) Run Scirpt
2.設(shè)置腳本路徑
可以在命令行里設(shè)置
也可以直接將腳本粘貼在這里
# 取得項目名字(get project name)
FMK_NAME=${PROJECT_NAME}
# 取得生成的靜態(tài)庫文件路徑 (get framework path)
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# 設(shè)置真機和模擬器生成的靜態(tài)庫路徑 (set devcie framework and simulator framework path)
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# 模擬器和真機編譯 (device and simulator build)
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# 刪除臨時文件 (delete temp file)
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
# 拷貝真機framework文件到生成路徑下 (copy device file to product path)
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# 合并生成缀雳,替換真機framework里面的二進制文件,并且打開 (merger and open)
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
echo "${DEVICE_DIR}/${FMK_NAME}"
echo "${SIMULATOR_DIR}/${FMK_NAME}"
rm -rf "${WRK_DIR}"
open "${INSTALL_DIR}"
就這樣完美實現(xiàn),,,,很舒服,很安逸