環(huán)境配置(Xcode10.1 、Swift4.2 熔任、 2019年04月18日 )
一经备、靜態(tài)庫(.a兼雄、.framework)動態(tài)庫(.framework)參考
靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝占业。
動態(tài)庫:鏈接時不復(fù)制绒怨,程序運(yùn)行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用谦疾,系統(tǒng)只加載一次南蹂,多個程序共用,節(jié)省內(nèi)存念恍。目前打包上傳到AppStore不能包含i386 x86_64架構(gòu)
二六剥、創(chuàng)建Framework
2.1首先建立一個target(如圖2.1)
2.2導(dǎo)入或創(chuàng)建要打包的代碼,下面以Charts為例(如圖2.2)
圖中1位置為Charts完整庫
圖中2位置峰伙,如果要打包的代碼為OC代碼則按照#import <ChartFramework/PublicHeader.h>
格式導(dǎo)入疗疟,必須為尖括號和對應(yīng)格式,如例子ChartFramework為framework名PublicHeader為外部開放頭文件名瞳氓;如果為Swift代碼則只要在Swift的文件使用open修飾即可,不需要導(dǎo)入類似#import <ChartFramework/DataApproximator.h>
open修飾則不需要導(dǎo)入頭文件
open class DataApproximator: NSObject{
}
2.3 修改編譯運(yùn)行模式為release(如圖2.3)
2.4.1 運(yùn)行獲取framework
(1).選擇模擬器運(yùn)行策彤,選擇真機(jī)運(yùn)行,會在項(xiàng)目Products目錄下生成對應(yīng)的framework匣摘,打開文件位置即可得到在Release-iphoneos目錄下店诗、Release-simulator目錄下得到對應(yīng)的framework
(2).使用lipo -inof 文件path/ChartFramework.framework/ChartFramework
得到對應(yīng)的架構(gòu)信息
2.4.2 腳本獲取framework
(1)在當(dāng)前目錄下新建target(如圖2.4.2.1)
(2)新建腳本文件如圖(2.4.2.2)
腳本如下(已驗(yàn)證打包支持5中架構(gòu)i386,x86_64,armv7,armv7s,arm64),腳本實(shí)際為拷貝2.4.1生成的framework自動進(jìn)行合并二不需要手動進(jìn)行合并音榜,腳本運(yùn)行成功后會自動彈出合并后的framework目錄位置
#!/bin/sh
#要build的target名(若一個工程有多個target庞瘸,最好手動指定需要打包的目標(biāo),如TARGET_NAME="framework名")
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/Products/"
#創(chuàng)建輸出目錄囊咏,并刪除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"
#分別編譯模擬器和真機(jī)的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
#拷貝framework到univer目錄
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"
#合并framework恕洲,輸出最終的framework到build目錄
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"
#刪除編譯之后生成的無關(guān)的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done
#判斷build文件夾是否存在,存在則刪除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
#打開合并后的文件夾
open "${UNIVERSAL_OUTPUT_FOLDER}"
三梅割、靜態(tài)庫與動態(tài)庫配置
新建默認(rèn)為動態(tài)庫霜第,根據(jù)實(shí)際情況自由選擇
靜態(tài)庫Build Setting--> Mach-O Type-->Static Library
動態(tài)庫Build Setting--> Mach-O Type-->Dynamic Library
四、bitCode(推薦開啟)
簡單理解開啟bitCode可使生成的ipa包含中間代碼户辞,蘋果可以根據(jù)中間代碼進(jìn)行優(yōu)化泌类,上傳包比較大實(shí)際下載會較小。如主項(xiàng)目未開啟bitCode可選擇關(guān)閉底燎,如主項(xiàng)目開啟則推薦開啟刃榨。
第一步,DEPLOYMENT_POSTPROCESSING = YES双仍,
第二步枢希,設(shè)置 STRIP_STYLE 為 Debugging Symbols,
第三步朱沃,Build Settings -> Compiler Flags添加 -fembed-bitcode 參數(shù)
第四步苞轿,確認(rèn)Build Settings -> Enable Bitcode 為YES
上述操作完成之后,重新打一個framework出來(此處不贅述制作framework的方法)逗物,通過檢測方法去檢測搬卒,就可以了。
五翎卓、常用命令(其實(shí)就是lipo命令)
5.1 查看當(dāng)前framework架構(gòu) lipo -info
lipo -info 路徑/xxxx.framework/xxxx
5.2 查看是動態(tài)庫還是靜態(tài)庫 file,如果結(jié)果為dynamically linked shared library
為動態(tài)庫
如果結(jié)果為current ar archive
則為靜態(tài)庫
cd 路徑/xxxx.framework
file xxxx
5.3 合并不同架構(gòu)frameworklipo -create framework1 framework2 -output framework12
lipo -create 路徑/xxx1.framework/xxx1 路徑/xxx2.framework/xxx2 -output xxx12.framework/xxx12
5.4 抽出framework中某個架構(gòu)lipo framework12 -thin 架構(gòu) -output framework,第一個framework必須包含該架構(gòu)才能分離
lipo -create 路徑/xxx12.framework/xxx12 -thin x86_64 -output xxx1.framework/xxx1
5.5 刪除framework中某個架構(gòu)lipo framework12 -remove 架構(gòu) -output framework,第一個framework必須包含該架構(gòu)才能刪除
lipo -create 路徑/xxx12.framework/xxx12 -remove x86_64 -output xxx1.framework/xxx1
六契邀、cpu架構(gòu)
常見架構(gòu)有i386 ,x86_64
為模擬器架構(gòu),armv7, armv7s, arm64
為phone pad常見架構(gòu)失暴,arm64e
為ios體驗(yàn)版架構(gòu)
模擬器:
4s-5: i386
其余模擬器: x86_64
真機(jī)(iOS設(shè)備):
armv6: iPhone坯门、iPhone 2、iPhone 3G逗扒、iPod Touch(第一代)田盈、iPod Touch(第二代)
armv7: iPhone 3Gs、iPhone 4缴阎、iPhone 4s允瞧、iPad、iPad 2
armv7s: iPhone 5蛮拔、iPhone 5c (靜態(tài)庫只要支持了armv7,就可以在armv7s的架構(gòu)上運(yùn)行)
arm64: iPhone 5s述暂、iPhone 6、iPhone 6 Plus建炫、iPhone 6s畦韭、iPhone 6s Plus、iPad Air肛跌、iPad Air2艺配、iPad mini2察郁、iPad mini3
可以理解為從 iPhone 5s到iPhone xr 為止都是arm64
七、調(diào)試framework
新建Project 把之前建立framework工程拖入到改位置转唉,再拖入到新建的Project工程中
八皮钠、常見問題
- 1
Q:動態(tài)庫導(dǎo)無法導(dǎo)入到項(xiàng)目
A:需要在 項(xiàng)目Target-->Genneral-->Embedded Binaries中同步導(dǎo)入(只有動態(tài)庫才導(dǎo)入)
- 2
Q:使用5架構(gòu)(i386,x86_64,armv7,armv7s,arm64)模擬器赠法,真機(jī)運(yùn)行正常麦轰,上傳到AppStroe失敗
A: 動態(tài)庫目前上傳到AppStore不能包含 i386,x86_64砖织,所以可以在開發(fā)階段使用5架構(gòu)款侵,提交階段使用3架構(gòu)。為項(xiàng)目配置兩個framework侧纯;
(1)添加兩個庫(如圖8.2)
(2)在Build Setting-->Framework Search Paths新锈,Debug 、Release中添加對應(yīng)的路徑
- 3
Q:framework上傳AppStore提示簽名問題眶熬,支持最低版本問題
A:需要在framework中配置支持版本并把簽名置為none(如圖8.3)
到此整個framework 打包壕鹉、調(diào)試全部完成!口語化嚴(yán)重聋涨,希望路過的大佬們憋住別笑晾浴,也熱烈歡迎大家指正錯誤和不足,或者有更好的方式方法我們一起討論牍白!
[參考1]([https://blog.csdn.net/buyu03/article/details/86646445]