先说一下XCFramework的好处吧:
- 多架构合并,模拟器,真机可以通用随便跑
- 上架AppStore,不需要将
.xcframework
中的真机架构分离,.framework
还需要用脚本分离,这实在太棒了
Framework简单解析
拿腾讯IM的举例吧,其实.framework
就是个文件夹里面装着封装好的文件。
% cd path/ImSDK.framework # path 为 framework 路径
ImSDK.framework % tree -L 1
.
├── Headers # 头文件夹
├── ImSDK # 可执行文件
├── Info.plist
└── Modules # Modules 文件夹
2 directories, 2 files
通过lipo -info
查看.framework
中的可执行文件中包含的架构:
ImSDK.framework % lipo -info ImSDK
Architectures in the fat file: ImSDK are: x86_64 armv7 arm64
XCFramework简单解析
.xcframework
是由两个文件夹和一个配置文件组成:
ImSDK.xcframework % tree -L 1
.
├── Info.plist
├── ios-arm64_armv7 # arm64 以及 armv7的真机支持
└── ios-x86_64-simulator # i386 以及 x86_64的模拟器支持
2 directories, 1 file
在编译过程中,编译器通过识别设备的架构不同架构的设备,去.xcframework
中取对应的支持执行文件。
.xcframework
只是封装了真机和模拟器的.framework
Framework架构的分离以及合并
- 将多架构的
.framework
中的所有架构的执行文件全部分离出来(arm64
,armv7
,x86_64
,i386
)(不一定全部有
ImSDK.framework % lipo ImSDK -thin x86_64 -output ImSDK-x86_64
依次分离出所有架构:
.
├── ImSDK-arm64
├── ImSDK-armv7
├── ImSDK-x86_64
├── ImSDK-i386
- 拆解后,真机架构(arm64)和真机架构(armv7)合并
% mkdir -p ImSDK-arm/ImSDK.framework
% lipo -create ImSDK-arm64 ImSDK-armv7 -output ImSDK-arm/ImSDK.framework/ImSDK
- 拆解后,模拟器架构(x86_64)和模拟器架构(i386)合并。(有几个合并几个
% mkdir -p ImSDK-simulator/ImSDK.framework
% lipo -create ImSDK-x86_64 ImSDK-i386 -output ImSDK-simulator/ImSDK.framework/ImSDK
- 将原来的
.framework
中除了可执行文件,原封不动的拷贝到我们手动创建的.framework
。(如果不拷贝会出编译时会各种奇怪的问题)
# 真机
ImSDK.framework % tree -L 2 ImSDK-arm
ImSDK-arm
└── ImSDK.framework
├── Headers
├── ImSDK
├── Info.plist
└── Modules
3 directories, 2 files
# 模拟器
ImSDK.framework % tree -L 2 ImSDK-simulator
ImSDK-simulator
└── ImSDK.framework
├── Headers
├── ImSDK
├── Info.plist
└── Modules
3 directories, 2 files
- 在终端通指令
xcodebuild -create-xcframework
指令生成xcframework
xcodebuild -create-xcframework -framework ImSDK-arm/ImSDK.framework -framework ImSDK-simulator/ImSDK.framework -output ImSDK.xcframework
提示 xcframework successfully written out to: path/ImSDK.framework/ImSDK.xcframework
即合并成功
完成以上步骤后即可生成XCFramework,用法和Framework一样
最后如果想要使用xcframework ,在File -> workspcaeSetting
中只用new Build System