系統(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修飾供外面使用
1.4 設(shè)置
-
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 Setting
搜索linking 設(shè)置Dead Code Stripping
為NO
是編譯選項(xiàng)優(yōu)化,包瘦身,(可不改) 似枕。
Mach-O Type
選中StaticLibrary (靜態(tài)庫)
Xcode默認(rèn)是Dynamic Library(動(dòng)態(tài)庫)
。
-
設(shè)置framework最低支持的版本
-
TARGETS —> Build Phases
將需要呈現(xiàn)給來的頭文件,直接從工程目錄
拖到Public
中年柠。對(duì)于OC文件凿歼,不想呈現(xiàn)出來的.h文件
不建議拖到Private中, 放在Project
中即可冗恨。 -
編譯為release模式
-
在真機(jī)和模擬器分別運(yùn)行一次答憔。Success狀態(tài)如下,右鍵
Show in Finder
掀抹。
分為Debug版本和Release版本虐拓,以-iphoneos
的為真機(jī)版本,以-iphonesimulator
的為模擬器framework
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
處理合并失敗的問題
-
回到工程中瞻润,
Build Settings -> Excluded Architectures
里按照這樣設(shè)置一下喘垂,再重新編譯合并就不會(huì)報(bào)錯(cuò)了。
如果手里只有.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