目录
一、XCFramework简介
XCFramework:是2019苹果官方提出的Framework的另一种先进格式,可以更方便的表示多个平台和架构的分发二进制库的格式。
需要Xcode11
以上支持。
是为更好的支持Mac Catalyst
和ARM
芯片的macOS
。
和传统的Framework相比:
- 可以用单个.xcframework文件提供多个平台的分发二进制文件;
- 与Fat Header相比,可以按照平台划分,可以包含相同架构的不同平台的文件;
- 在使用时,不需要再通过脚本去剥离不需要的架构体系。
lipo指令和XCFramework
iOS lipo使用
swift framework工程下调用Objective-C或C类库
Swift framework 与 OC 混编
iOS 静态库和动态库打包framework流程(纯swift版/swift、OC混编版)
二、创建XCFramework
准备如下代码(创建Framework Project):
添加代码后编译
模拟器编译失败,真机编译成功创建的XCFramework也可以在模拟器和真机上运行
1、创建模拟器和真机平台下的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架构时修改如下:
xcodebuild archive -project 'FFTGStickerView.xcodeproj' \
-scheme 'FFTGStickerView' \
-configuration Release \
-sdk iphonesimulator \
-arch arm64 \
-archivePath '../archives/FFTGStickerView.framework-iphonesimulator.xcarchive' \
SKIP_INSTALL=NO
执行build.sh
脚本:
2、创建XCFramework
创建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方便崩溃时恢复调用栈,那么修改创建XCFramework的命令如下:
xcodebuild -create-xcframework \
-framework '../archives/SYTimer.framework-iphoneos.xcarchive/Products/Library/Frameworks/SYTimer.framework' \
-debug-symbols '/Users/ztkj/Desktop/创建XCFramework/archives/SYTimer.framework-iphoneos.xcarchive/BCSymbolMaps/1F3E7957-8302-390B-AE49-34E61B49E11E.bcsymbolmap' \
-debug-symbols '/Users/ztkj/Desktop/创建XCFramework/archives/SYTimer.framework-iphoneos.xcarchive/BCSymbolMaps/5C6DD85F-0EFE-3551-B330-5AC4A91D32ED.bcsymbolmap' \
-debug-symbols '/Users/ztkj/Desktop/创建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/创建XCFramework/archives/SYTimer.framework-iphonesimulator.xcarchive/dSYMs/SYTimer.framework.dSYM' \
-output 'SYTimer.xcframework'
️注意:1、只有真机才有BitCode。2、BitCode和dSYMs的文件路径必须传绝对路径
3、lipo合并不同平台的Framework要求Framework之间不能有相同的架构
3、使用XCFramework
Xcode
会根据不同的编译平台拷贝XCFramework
中相应平台架构下的二进制代码
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
代码中也进行同样的判断
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
设为YES
。否则在生成 xcframework时会报错No 'swiftinterface' files found within xx.swiftmodule
参考
Session视频地址
iOS制作framework技术总结(内部及外部引用第三方库)
developer.apple.com/videos/play…
文档说明
devstreaming-cdn.apple.com/videos/wwdc…