目錄
一扒接、XCFramework簡介
XCFramework:是2019蘋果官方提出的Framework的另一種先進(jìn)格式,可以更方便的表示多個平臺和架構(gòu)的分發(fā)二進(jìn)制庫的格式袍啡。
需要Xcode11
以上支持踩官。
是為更好的支持Mac Catalyst
和ARM
芯片的macOS
。
和傳統(tǒng)的Framework相比:
- 可以用單個.xcframework文件提供多個平臺的分發(fā)二進(jìn)制文件;
- 與Fat Header相比境输,可以按照平臺劃分蔗牡,可以包含相同架構(gòu)的不同平臺的文件;
- 在使用時,不需要再通過腳本去剝離不需要的架構(gòu)體系嗅剖。
lipo指令和XCFramework
iOS lipo使用
swift framework工程下調(diào)用Objective-C或C類庫
Swift framework 與 OC 混編
iOS 靜態(tài)庫和動態(tài)庫打包framework流程(純swift版/swift辩越、OC混編版)
二、創(chuàng)建XCFramework
準(zhǔn)備如下代碼(創(chuàng)建Framework Project):
添加代碼后編譯
模擬器編譯失敗信粮,真機編譯成功創(chuàng)建的XCFramework也可以在模擬器和真機上運行
1区匣、創(chuàng)建模擬器和真機平臺下的Framework
build.sh
中的命令如下:
xcodebuild archive -project 'SYTimer.xcodeproj' \
-scheme 'SYTimer' \
-configuration Release \
-destination 'generic/platform=iOS Simulator' \
-archivePath '../archives/SYTimer.framework-iphonesimulator.xcarchive' \
SKIP_INSTALL=NO
xcodebuild archive -project 'SYTimer.xcodeproj' \
-scheme 'SYTimer' \
-configuration Release \
-destination 'generic/platform=iOS' \
-archivePath '../archives/SYTimer.framework-iphoneos.xcarchive' \
SKIP_INSTALL=NO
引入Pod依賴時修改如下:
xcodebuild archive -workspace MyFramework.xcworkspace \
-scheme MyFramework \
-configuration Release \
-destination 'generic/platform=iOS' \
-archivePath '../archives/MyFramework.framework-iphoneos.xcarchive' \
SKIP_INSTALL=NO
三方庫不支持x86_86架構(gòu)時修改如下:
xcodebuild archive -project 'FFTGStickerView.xcodeproj' \
-scheme 'FFTGStickerView' \
-configuration Release \
-sdk iphonesimulator \
-arch arm64 \
-archivePath '../archives/FFTGStickerView.framework-iphonesimulator.xcarchive' \
SKIP_INSTALL=NO
執(zhí)行build.sh
腳本:
2、創(chuàng)建XCFramework
創(chuàng)建xcframework文件夾
cd xcframework文件夾路徑
xcodebuild -create-xcframework \
-framework '../archives/SYTimer.framework-iphoneos.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-framework '../archives/SYTimer.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-output 'SYTimer.xcframework'
一般XCFramework需要包含BitCode(Xcode Build Settings開啟)和dSYMs方便崩潰時恢復(fù)調(diào)用棧蒋院,那么修改創(chuàng)建XCFramework的命令如下:
xcodebuild -create-xcframework \
-framework '../archives/SYTimer.framework-iphoneos.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-debug-symbols '/Users/ztkj/Desktop/創(chuàng)建XCFramework/archives/SYTimer.framework-iphoneos.xcarchive/BCSymbolMaps/1F3E7957-8302-390B-AE49-34E61B49E11E.bcsymbolmap' \
-debug-symbols '/Users/ztkj/Desktop/創(chuàng)建XCFramework/archives/SYTimer.framework-iphoneos.xcarchive/BCSymbolMaps/5C6DD85F-0EFE-3551-B330-5AC4A91D32ED.bcsymbolmap' \
-debug-symbols '/Users/ztkj/Desktop/創(chuàng)建XCFramework/archives/SYTimer.framework-iphoneos.xcarchive/dSYMs/SYTimer.framework.dSYM' \
-framework '../archives/SYTimer.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-debug-symbols '/Users/ztkj/Desktop/創(chuàng)建XCFramework/archives/SYTimer.framework-iphonesimulator.xcarchive/dSYMs/SYTimer.framework.dSYM' \
-output 'SYTimer.xcframework'
?注意:1亏钩、只有真機才有BitCode。2欺旧、BitCode和dSYMs的文件路徑必須傳絕對路徑
3姑丑、lipo合并不同平臺的Framework要求Framework之間不能有相同的架構(gòu)
3、使用XCFramework
Xcode
會根據(jù)不同的編譯平臺拷貝XCFramework
中相應(yīng)平臺架構(gòu)下的二進(jìn)制代碼
4辞友、使用報錯
dyld[6111]: Library not loaded: @rpath/MyFramework.framework/MyFramework
Targets->General->Frameworks, Libraries, and Embedded Content
將添加的MyFramework.framework
刪除后重新加一次——> Clean->Run
三栅哀、其他問題
1、自己制作的XCFrameworkA引用自己制作的XCFrameworkB:
#if canImport(FFImageEditor)
import FFImageEditor
#endif
代碼中也進(jìn)行同樣的判斷
2称龙、自己制作的XCFrameworkA通過Pod引入三方庫
報錯: no such module
Build Setting-> Framework Search Ppaths中添加路徑
eg: "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit"
3留拾、通過命令行生成,XCFramework: xcodebuild -create-xcframework 報錯
在Build Settings ~> Build Library for Distribution
設(shè)為YES
鲫尊。否則在生成 xcframework時會報錯No 'swiftinterface' files found within xx.swiftmodule
參考
Session視頻地址
iOS制作framework技術(shù)總結(jié)(內(nèi)部及外部引用第三方庫)
developer.apple.com/videos/play…
文檔說明
devstreaming-cdn.apple.com/videos/wwdc…