iOS-开发进阶06:XCFramework

iOS 开发进阶 文章汇总

目录


一、XCFramework简介

XCFramework:是2019苹果官方提出的Framework的另一种先进格式,可以更方便的表示多个平台和架构的分发二进制库的格式。
需要Xcode11以上支持。
是为更好的支持Mac CatalystARM芯片的macOS

和传统的Framework相比:

  1. 可以用单个.xcframework文件提供多个平台的分发二进制文件;
  2. 与Fat Header相比,可以按照平台划分,可以包含相同架构的不同平台的文件;
  3. 在使用时,不需要再通过脚本去剥离不需要的架构体系。

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

List of destinations

执行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…

其他第三方的资料

appspector.com/blog/xcfram…

github.com/bielikb/xcf…

juejin.im/post/684490…

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容