iOS Framework打包

環(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.1.png

2.2導(dǎo)入或創(chuàng)建要打包的代碼,下面以Charts為例(如圖2.2)


2.2.png

圖中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.3.png

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.4.2.1.png

(2)新建腳本文件如圖(2.4.2.2)


2.4.2.2.png

腳本如下(已驗(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實(shí)際用處參考

簡單理解開啟bitCode可使生成的ipa包含中間代碼户辞,蘋果可以根據(jù)中間代碼進(jìn)行優(yōu)化泌类,上傳包比較大實(shí)際下載會較小。如主項(xiàng)目未開啟bitCode可選擇關(guān)閉底燎,如主項(xiàng)目開啟則推薦開啟刃榨。

第一步,DEPLOYMENT_POSTPROCESSING = YES双仍,


4.1.png

第二步枢希,設(shè)置 STRIP_STYLE 為 Debugging Symbols,


4.2.png

第三步朱沃,Build Settings -> Compiler Flags添加 -fembed-bitcode 參數(shù)


4.3.png

第四步苞轿,確認(rèn)Build Settings -> Enable Bitcode 為YES


4.4.png

上述操作完成之后,重新打一個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)的路徑


8.2.png
  • 3

Q:framework上傳AppStore提示簽名問題眶熬,支持最低版本問題

A:需要在framework中配置支持版本并把簽名置為none(如圖8.3)


8.3.png

demo地址

到此整個framework 打包壕鹉、調(diào)試全部完成!口語化嚴(yán)重聋涨,希望路過的大佬們憋住別笑晾浴,也熱烈歡迎大家指正錯誤和不足,或者有更好的方式方法我們一起討論牍白!
[參考1]([https://blog.csdn.net/buyu03/article/details/86646445]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脊凰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茂腥,更是在濱河造成了極大的恐慌狸涌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件最岗,死亡現(xiàn)場離奇詭異帕胆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)般渡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門懒豹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驯用,你說我怎么就攤上這事脸秽。” “怎么了蝴乔?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵记餐,是天一觀的道長。 經(jīng)常有香客問我薇正,道長片酝,這世上最難降的妖魔是什么囚衔? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任筷凤,我火速辦了婚禮知允,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罚屋。我一直安慰自己晦炊,他們只是感情好鞠鲜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布宁脊。 她就那樣靜靜地躺著断国,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榆苞。 梳的紋絲不亂的頭發(fā)上稳衬,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機(jī)與錄音坐漏,去河邊找鬼薄疚。 笑死,一個胖子當(dāng)著我的面吹牛赊琳,可吹牛的內(nèi)容都是我干的街夭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼躏筏,長吁一口氣:“原來是場噩夢啊……” “哼板丽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趁尼,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤埃碱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酥泞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砚殿,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年芝囤,在試婚紗的時候發(fā)現(xiàn)自己被綠了似炎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡悯姊,死狀恐怖名党,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挠轴,我是刑警寧澤传睹,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站岸晦,受9級特大地震影響欧啤,放射性物質(zhì)發(fā)生泄漏睛藻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一邢隧、第九天 我趴在偏房一處隱蔽的房頂上張望店印。 院中可真熱鬧,春花似錦倒慧、人聲如沸按摘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炫贤。三九已至,卻和暖如春付秕,著一層夾襖步出監(jiān)牢的瞬間兰珍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工询吴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掠河,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓猛计,卻偏偏與公主長得像唠摹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奉瘤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 這幾天公司有一個新的需求勾拉,就是要將我們開發(fā)的某些東西都抽取出來,打個比方我們開發(fā)了A項(xiàng)目毛好,可以以后B項(xiàng)目要包含A項(xiàng)...
    黃魚兒啦啦啦閱讀 6,172評論 2 16
  • 1望艺、新建一個Framework 默認(rèn)創(chuàng)建一個與項(xiàng)目名稱一樣的頭文件 2、創(chuàng)建一個測試項(xiàng)目來測試Framewor...
    簡單的一個人閱讀 1,136評論 0 0
  • 一肌访、靜態(tài)庫簡介 1.1找默、庫:是程序代碼的集合,是共享程序代碼的一種方式吼驶。 1.2惩激、根據(jù)源代碼的公開情況,庫可以分為...
    IIronMan閱讀 5,632評論 18 29
  • 原文鏈接在上一篇教程(中譯版)中蟹演,你學(xué)到了怎么樣創(chuàng)建一個可復(fù)用的圓形旋鈕控件风钻。然而你可能不清楚怎樣讓其他開發(fā)者更方...
    _冷憶閱讀 2,453評論 9 5
  • 這本書我只是看題干骡技,并沒有每個字都讀。感覺書中描述的達(dá)到他人心目中理想的狀態(tài),我認(rèn)為是不可能的布朦。不止現(xiàn)實(shí)中難以做到...
    李宇_7792閱讀 187評論 0 1