iOS 靜態(tài)庫和動(dòng)態(tài)庫打包framework流程(純swift版/swift拼弃、OC混編版)

系統(tǒng)及Xcode版本

macOS Big Sur 版本11.6
Xcode Version 13.0

1. 靜態(tài)庫打包流程

1.1 新建工程

選擇iOS -- Framework&Library, 點(diǎn)擊next

新建工程

1.2 Pod三方庫

如果打包文件中使用了第三方庫鲸阻,建議pod管理,并告知用戶使用pod安裝,避免用戶重復(fù)導(dǎo)入啊央。跟平時(shí)開發(fā)邏輯一樣拯坟,打開.xcworkspace工程但金。

pod init
open Podfile 編輯framework依賴的第三方(不要指定iOS版本 # platform :ios, '9.0')
pod install

操作完之后工程目錄顯示


工程目錄
1.3 添加文件

把打包需要的文件添加到項(xiàng)目中。如果想要這個(gè)類或類里面的方法被外面使用郁季,需要配合pubic修飾供外面使用

添加打包文件

public設(shè)置

1.4 設(shè)置
  1. TARGETS —> Build Settings 中設(shè)置相關(guān)項(xiàng) Build Active Architecture Only 設(shè)置為NO冷溃。意思是當(dāng)前打包的.framework支持所有的設(shè)備,否則打包時(shí)只能用當(dāng)前版本的模擬器或真機(jī)運(yùn)行梦裂。

    Build Active Architecture Only設(shè)置

  2. Build Setting 搜索linking 設(shè)置Dead Code StrippingNO是編譯選項(xiàng)優(yōu)化,包瘦身,(可不改) 似枕。
    Mach-O Type 選中StaticLibrary (靜態(tài)庫)Xcode默認(rèn)是Dynamic Library(動(dòng)態(tài)庫)

    Build Setting設(shè)置

  3. 設(shè)置framework最低支持的版本


    Build Setting設(shè)置
  4. TARGETS —> Build Phases 將需要呈現(xiàn)給來的頭文件,直接從工程目錄拖到Public中年柠。對(duì)于OC文件凿歼,不想呈現(xiàn)出來的.h文件不建議拖到Private中, 放在Project中即可冗恨。

  5. 編譯為release模式


    Release模式設(shè)置
  6. 在真機(jī)和模擬器分別運(yùn)行一次答憔。Success狀態(tài)如下,右鍵Show in Finder掀抹。


    分為Debug版本和Release版本虐拓,以-iphoneos的為真機(jī)版本,以-iphonesimulator的為模擬器framework
    文件目錄

  7. framework真機(jī)模擬器合并
    使用lipo -info 查看framework支持的架構(gòu)信息傲武,tip: 查看的文件是上圖的①AILLSDK文件

真機(jī)版本
lipo -info /Users/wangjia/Library/Developer/Xcode/DerivedData/AILLSDK-cpbbnoggikwgjhbjflmuxtaeedig/Build/Products/Release-iphoneos/AILLSDK.framework/AILLSDK
結(jié)果:
Architectures in the fat file: /Users/wangjia/Library/Developer/Xcode/DerivedData/AILLSDK-cpbbnoggikwgjhbjflmuxtaeedig/Build/Products/Release-iphoneos/AILLSDK.framework/AILLSDK are: arm64 armv7

模擬器版本
lipo -info /Users/wangjia/Library/Developer/Xcode/DerivedData/AILLSDK-cpbbnoggikwgjhbjflmuxtaeedig/Build/Products/Release-iphonesimulator/AILLSDK.framework/AILLSDK
結(jié)果:
Architectures in the fat file: /Users/wangjia/Library/Developer/Xcode/DerivedData/AILLSDK-cpbbnoggikwgjhbjflmuxtaeedig/Build/Products/Release-iphonesimulator/AILLSDK.framework/AILLSDK are: arm64 x86_64 i386

由于以上獲取的framework只能在對(duì)應(yīng)的版本上運(yùn)行(即真機(jī)只能在設(shè)備上運(yùn)行模擬器版本只能在模擬器上面運(yùn)行使用)蓉驹,所以需要合并framework版本城榛。
合并framework版本:
sudo lipo -create (此處請(qǐng)?zhí)顚懻鏅C(jī)AppVest文件路徑) (此處填寫模擬器AILLSDK文件路徑) -output 自定義合成文件存儲(chǔ)路徑(合成文件的名字AILLSDK)

sudo lipo -create/Users/wangjia/Library/Developer/Xcode/DerivedData/AILLSDK-cpbbnoggikwgjhbjflmuxtaeedig/Build/Products/Release-iphonesimulator/AILLSDK.framework/AILLSDK /Users/wangjia/Library/Developer/Xcode/DerivedData/AILLSDK-cpbbnoggikwgjhbjflmuxtaeedig/Build/Products/Release-iphoneos/AILLSDK.framework/AILLSDK -output ~/Desktop/AILLSDK

因?yàn)檎鏅C(jī)版本和模擬器版本的framework都存在arm64架構(gòu),導(dǎo)致架構(gòu)重復(fù)态兴,不出意外狠持,會(huì)提示合并失敗。如下

fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /Users/wangjia/Library/Developer/Xcode/DerivedData/AILLSDK-cpbbnoggikwgjhbjflmuxtaeedig/Build/Products/Release-iphonesimulator/AILLSDK.framework/AILLSDK and /Users/wangjia/Library/Developer/Xcode/DerivedData/AILLSDK-cpbbnoggikwgjhbjflmuxtaeedig/Build/Products/Release-iphoneos/AILLSDK.framework/AILLSDK have the same architectures (arm64) and can't be in the same fat output file

處理合并失敗的問題

  1. 回到工程中瞻润,Build Settings -> Excluded Architectures里按照這樣設(shè)置一下喘垂,再重新編譯合并就不會(huì)報(bào)錯(cuò)了。

    Excluded Architectures設(shè)置

  2. 如果手里只有.a或.framework文件
    使用lipo remove命令將模擬器庫的arm64架構(gòu)移除

lipo XXX.a -remove arm64 -output XXX.a
(XXX.a 換成本文的AILLSDK)

最后敢订,將XX.framework(真機(jī)或者模擬器framework都可)文件夾拷貝出來王污,替換AILLSDK(本文使用的)為剛才合并的新文件。
查看替換后的framework支持全部真機(jī)模擬器架構(gòu)楚午。

lipo -info ~/Desktop/mm/AILLSDK.framework/AILLSDK
結(jié)果:
Architectures in the fat file: /Users/wangjia/Desktop/mm/AILLSDK.framework/AILLSDK are: i386 armv7 x86_64 arm64

使用

我在合并binary文件之后昭齐,僅拷貝出Release-iphoneos文件夾下的XXX.framework,并替換掉AILLSDK二進(jìn)制文件矾柜。導(dǎo)入項(xiàng)目中使用模擬器運(yùn)行阱驾,報(bào)錯(cuò),顯示找不到架構(gòu)怪蔑。

Could not find module 'AILLSDK' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios

解決方案

模擬器的framework
XXX-iphonesimulatar.framework/Modules/XXX.swiftmodule/

拷貝所有的modules到

XXX-iphoneos.framework/Modules/XXX.swiftmodule/

再替換掉AILLSDK二進(jìn)制文件里覆,導(dǎo)入項(xiàng)目,如果framework中內(nèi)含第三方庫缆瓣,需要在所在的工程中使用pod加載喧枷,否則會(huì)提示編譯失敗。
至此弓坞,編譯成功隧甚。??????????

OC 和Swift混編的Framework

不管是在framework封裝的內(nèi)部,內(nèi)部swift類調(diào)用內(nèi)部的OC類渡冻,還是內(nèi)部的OC類使用內(nèi)部的swift類戚扳,還是外部工程swift類使用framework內(nèi)部OC類,還是外部工程OC類使用framework內(nèi)部swift類族吻。原理是一致的帽借,以下來介紹下:

swift中調(diào)用oc

AILLSDK.h(你自己創(chuàng)建framework時(shí)候生成的.h文件)中添加import導(dǎo)入
#import <AILLSDK/OC類名.h>

oc中調(diào)用swift代碼。

在oc的.m.h文件中超歌,導(dǎo)入#import <AILLSDK/AILLSDK-Swift.h>, 也就是你自己framework名-Swift.h

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砍艾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子握础,更是在濱河造成了極大的恐慌辐董,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禀综,死亡現(xiàn)場(chǎng)離奇詭異简烘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)定枷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門孤澎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欠窒,你說我怎么就攤上這事覆旭。” “怎么了岖妄?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵型将,是天一觀的道長。 經(jīng)常有香客問我荐虐,道長七兜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任福扬,我火速辦了婚禮腕铸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铛碑。我一直安慰自己狠裹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布汽烦。 她就那樣靜靜地躺著涛菠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撇吞。 梳的紋絲不亂的頭發(fā)上俗冻,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音梢夯,去河邊找鬼言疗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颂砸,可吹牛的內(nèi)容都是我干的噪奄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼人乓,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼勤篮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起色罚,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤碰缔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后戳护,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體金抡,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瀑焦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梗肝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榛瓮。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巫击,靈堂內(nèi)的尸體忽然破棺而出禀晓,到底是詐尸還是另有隱情,我是刑警寧澤坝锰,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布粹懒,位于F島的核電站,受9級(jí)特大地震影響顷级,放射性物質(zhì)發(fā)生泄漏凫乖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一愕把、第九天 我趴在偏房一處隱蔽的房頂上張望拣凹。 院中可真熱鬧,春花似錦恨豁、人聲如沸嚣镜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菊匿。三九已至,卻和暖如春计福,著一層夾襖步出監(jiān)牢的瞬間跌捆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工象颖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佩厚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓说订,卻偏偏與公主長得像抄瓦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陶冷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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