先說一下XCFramework的好處吧:
1.多架構(gòu)合并打掘,模擬器,真機可以通用隨便跑
2.上架AppStore,不需要將xcframework中的真機架構(gòu)分離啰挪,.framework還需要用腳本分離呐矾,這點太香了
Framework簡單解析
拿百度OCR中的舉例吧苔埋,其實.framework就是個文件夾里面裝著封裝好的可執(zhí)行文件,頭文件蜒犯,Modules文件 info.plist
Framework中的靈魂就是可執(zhí)行文件:通過lipo -info
查看.framework中的可執(zhí)行文件中包含的架構(gòu):
.xcframework構(gòu)造
.xcframework是由兩個文件夾和一個配置文件組成组橄。
兩個文件夾分別代表的是
arm64 以及 armv7的真機支持
i386 以及 x86_64的模擬器支持
在編譯過程中荞膘,編譯器通過識別設(shè)備的架構(gòu)不同架構(gòu)的設(shè)備,去xcframework中取對應的支持執(zhí)行文件玉工,
xcframework只是封裝了真機和模擬器的.framework.
Framework架構(gòu)的分離以及合并:
xcframework的結(jié)構(gòu)了解明白了羽资,我們就需要按照上邊的規(guī)則進行拆解:
核心思路:
1.將多架構(gòu)的.framework 中的所有架構(gòu)的執(zhí)行文件全部分離出來(arm64,armv7遵班,x86_64,i386)
2.拆解后屠升,真機架構(gòu)(arm64)和真機架構(gòu)(armv7)合并
3.拆解后,模擬器架構(gòu)(x86_64)和模擬器架構(gòu)(i386)合并
4.兩個執(zhí)行文件創(chuàng)建好后费奸,手動生成兩個.framework 格式文件
5.將原來的.framework中除了執(zhí)行文件弥激,原封不動的拷貝到我們手動創(chuàng)建的.framework(如果不拷貝會出編譯時會各種奇怪的問題)
6.在終端通指令xcodebuild -create-xcframework指令生成xcframework
核心的關(guān)鍵指令如下:
分離指令:
將i386的架構(gòu)從原來的AipOcrSdk 分離出來并且命名為AipOcrSdk-id386
4個獨立架構(gòu)的執(zhí)行文件如圖:
合并指令:
將分離好的模擬器架構(gòu)執(zhí)行文件合并:將x86_64和i386合并命名為AIPOcrSdkX86
真機和模擬器合并后的執(zhí)行文件:
手動制作.framework流程:切記執(zhí)行文件
和生成.framework命名
:
要一致
要一致
要一致
將原來.framework中除執(zhí)行文件以外的文件
,全部拷貝到我們自己生成的.framework
最后生成xcramework:
生成成功后的xcframework
這塊復制路徑
切記不要加入空格
否則會導致生成失敗
將xcframework導入項目:
最后說幾個生成XCFramework 踩的坑:
1.如果我們導入的庫是動態(tài)庫:一定要在Embed Frameworks
導入:
2.模擬器架構(gòu)配置問題:Could not find module 'xxxxxxx' for target 'arm64-apple-ios-simulator';
按照如下配置:
1.Architectures選項愿阐,設(shè)置他的值為Standard architectures - $(ARCHS_STANDARD)
2.xcode里面的Build Active Architectures Only選項微服,debug為Yes,release為No
3.xcode里面的Excluded Architectures選項缨历,保留為空(網(wǎng)上不斷在這里加arm64的以蕴,其實不用)
4.xcode里面的VALID_ARCHS選項,設(shè)置他的值為arm64 arm64e x86_64
3.如果一個.framework只有真機庫辛孵,需要在模擬器中運行丛肮,此時加載庫的時候會報錯。
解決方法:在Excluded Source File Names中配置
只有在模擬器環(huán)境下魄缚,不使用的庫:(如果在代碼中還要加上#if TARGET_OS_SIMULATOR
進行模擬器的邏輯判斷宝与。)
4.Podfile中配置架構(gòu)模式:
在我們Podfile 尾部復制以下代碼中加入模擬器的配置:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name == 'Debug'
config.build_settings["VALID_ARCHS"] = "arm64 arm64e x86_64 i386"
else
config.build_settings["VALID_ARCHS"] = "arm64 arm64e"
end
end
end
end
添加完畢后,從新執(zhí)行pod install冶匹。
執(zhí)行clean习劫,從新運行即可
前4項都是模擬器編譯可能出現(xiàn)的問題。
5.最后如果想要使用xcframework 嚼隘,在File -> workspcaeSetting 中只用new Buil System
先說到這把诽里,有問題歡迎留言。