iOS .a與framework打包以及shell自動合并

這兩天一直被問到靜態(tài)庫打包的流程,為了偷個懶,就寫這篇簡書,就不做一一回答,有問題,還望指出改正

靜態(tài)庫打包

.a打包

.a生成

將提前準備的項目文件及項目資源導(dǎo)入到SDK制作工程中

導(dǎo)出文件

添加New Header Phase

頭文件處理

將制作靜態(tài)庫需要的.h文件添加到Project中而涉,將靜態(tài)庫調(diào)用的頭文件添加到Public中


頭文件暴露

靜態(tài)庫打包bundle文件>由于演示制作的靜態(tài)庫包含圖片和xib文件呐芥,因此為了規(guī)范,我們需要把圖片和xib文件添加到bundle中所踊,如圖添加給靜態(tài)庫添加bundle資源包


bundle文件

創(chuàng)建好之后,將圖片和xib文件添加到Copy Bundle Resources中


導(dǎo)入圖片和xib

由于.bundle文件屬于macOX類型好唯,所以我們需要改一些配置來適配iOS,如圖所示
TARGETS ->選擇bundle -> Build Settings ->Base SDK ->選擇Latest iOS (iOS 11.2)


bundle配置

設(shè)置Build Setting 中的COMBINE_HIDPI_IMAEGS 為NO,否則Bundle中的圖片就是tiff格式了该押。

設(shè)置格式

作為資源包,僅僅需要編譯就好尽狠,無需安裝相關(guān)配置,設(shè)置Skip Install為YES,同樣需要刪除安裝路徑Installation Dirctory的值


路徑設(shè)置1

路徑2

到此為止bundle文件的設(shè)置完成

打包工程和資源文件


打包工程和資源文件1.png

打包工程和資源文件2.png

打包工程和資源文件3.png

找到源文件路徑叶圃,如下圖所示袄膏,到此靜態(tài)庫制作完成,將.libStaticSDK.a和source.bundle和頭文件StaticSDK.h導(dǎo)入到項目中即可使用


找到源文件路徑.png

3掺冠、合并靜態(tài)庫真機和模擬器文件

我們在制作靜態(tài)庫的時候沉馆,編譯會產(chǎn)兩個.a文件,一個適用于模擬器的德崭,一個是用于真機的斥黑,為了開發(fā)方便我們可以使用終端命令將.a文件進行合并

lipo -create XXX/模擬器.a路徑 XXX/真機.a路徑 -output 合并后的文件名稱.a

4、注意點眉厨,由于資源文件在Bundle文件中因此在使用時需注意锌奴,以下我舉兩個例子,一個是加載圖片憾股,一個是加載xib文件

使用注意1
使用注意2

framework打包

頭文件的處理

對于使用了Cocoapod導(dǎo)入第三方的xcode工程來講 需要在Podfile中 做如下修改 之后 pod install
需要同時對住工程target 和Framework的target 配置pod環(huán)境

pod文件1
pod文件2

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)全包含

架構(gòu)配置
頭文件引入

分別編譯
show in finder 如下
Debug-iphoneos 為Debug模式下真機使用的
Debug-iphonesimulator 為Debug模式下模擬器使用的
Release -iphoneos 為Release模式下真機使用的
Release-iphonesimulator 為Release模式下模擬器使用的


編譯結(jié)果

下面的合并和.a一樣操作

下面介紹自動shell腳本合并

1:生成腳本target

生成腳本target

2.target設(shè)置

1.添加target依賴
Target Dependencies 選中需要打包的framework + 選擇New Run Script Phase 出現(xiàn) Run Scirpt


添加target依賴

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}"
運行腳本結(jié)果
自動合并

就這樣完美實現(xiàn),,,,很舒服,很安逸

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梢睛,一起剝皮案震驚了整個濱河市肥印,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绝葡,老刑警劉巖深碱,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挤牛,居然都是意外死亡莹痢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門墓赴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竞膳,“玉大人,你說我怎么就攤上這事诫硕√贡伲” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵章办,是天一觀的道長锉走。 經(jīng)常有香客問我,道長藕届,這世上最難降的妖魔是什么挪蹭? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮休偶,結(jié)果婚禮上梁厉,老公的妹妹穿的比我還像新娘。我一直安慰自己踏兜,他們只是感情好词顾,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碱妆,像睡著了一般肉盹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疹尾,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天上忍,我揣著相機與錄音骤肛,去河邊找鬼。 笑死窍蓝,一個胖子當(dāng)著我的面吹牛萌衬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播它抱,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼秕豫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了观蓄?” 一聲冷哼從身側(cè)響起混移,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侮穿,沒想到半個月后歌径,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡亲茅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年回铛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片克锣。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡茵肃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袭祟,到底是詐尸還是另有隱情验残,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布巾乳,位于F島的核電站您没,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胆绊。R本人自食惡果不足惜氨鹏,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望压状。 院中可真熱鬧仆抵,春花似錦、人聲如沸何缓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碌廓。三九已至,卻和暖如春剩盒,著一層夾襖步出監(jiān)牢的瞬間谷婆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纪挎,地道東北人期贫。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像异袄,于是被迫代替她去往敵國和親通砍。 傳聞我的和親對象是個殘疾皇子凤覆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350