之前做过一个XCFramework,现在把过程记录下来。
一、XCFramework简介
在2019年,苹果官方提出的关于framework的一种先进格式。它可以很便捷地包括多个平台、多个架构。
与传统的Framework相比:
1.可以用单个.xcframework文件提供多个平台
(这里的平台是iOS,macOS,PadOS,WatchOS等平台)的分发二进制文件;
2.与Fat Header相比,可以按照平台划分,也可以包含相同架构的不同平台的文件;
3.在使用时,不需要再通过脚本去剥离不需要的架构体系。
支持条件:
1.Xcode11以上支持。
2.支持Mac Catalyst和ARM芯片的macOS系统。
二、创建XCFramework
首先需要制作一个Framework,同时支持设备(Device)和模拟器(Simulator)。
具体在Xcode中,按照如下图的流程,创造一个.framework。
然后Build出Device和Simulator两种架构。
构建好两种架构的.framework之后,
就执行以下命令,创建.xcframework。
xcodebuild -create-xcframework -framework {DeviceFileName} -framework {SimulatroFileName} -output {XCframeworkFileName}
具体的脚本如下:
#!/bin/bash
set -e
#动态库目录
path="/Users/$USER/Desktop/build/XCFrameworkDir"
echo "Which type do you Select? [1:Static Library] [others:framework]"
read sType
echo "input the Framework name"
read frameworkName
echo " the Frmework name is: "$frameworkName " and type: "$sType
if [ $sType == "1" ];then
#静态库目录(.a)
path="/Users/$USER/Desktop/build/XCFrameworkDir/XCFrameworkLibDir"
fi
#进入指定目录
cd $path
suffixFramework=".framework"
suffixXCFramework=".xcframework"
debugIPhoneosDir="/Debug-iphoneos"
debugSimulatorDir="/Debug-iphonesimulator"
xcframeworkFileName=$path"/"$frameworkName$suffixXCFramework
if [ -d $xcframeworkFileName ]
then
#存在就删除,清除历史数据
rm -rf $xcframeworkFileName
fi
if [ $sType == "1" ]
then
echo "create Static Library"
#(.a)
suffixFramework=".a"
xcodebuild -create-xcframework -library $path$debugIPhoneosDir"/"$frameworkName$suffixFramework -library $path$debugSimulatorDir"/"$frameworkName$suffixFramework -output $xcframeworkFileName
else
#创建.xcframework文件 (动态库方式)
xcodebuild -create-xcframework -framework $path$debugIPhoneosDir"/"$frameworkName$suffixFramework -framework $path$debugSimulatorDir"/"$frameworkName$suffixFramework -output $xcframeworkFileName
fi
echo "create [ $frameworkName$suffixXCFramework ] Success "
上面的代码,通过输入信息构建不同的.xcframework.
输入1,表示构建Static Library(.a文件)
输入其他值,就是构建.framework。
三、XCFramework的调用
.xcFramework创建好之后,如何调用呢?
首先,创建一个Demo工程,
把.xcframework引入进去。具体步骤如下图
完成以上4步,.xcframework就引入工程了,可以被Demo模块调用了。
然后,在测试Demo中直接调用,具体如下代码。
import firstFramework
struct ContentView: View{
var body: some View {
VStack {
Button {
let vc = FirtViewController()
vc.sayHello()
} label: {
Text("Hello")
}
}
.padding()
}
}
四、制作过程中遇到的问题
1.No ‘swiftinterface’ files found within ‘/Users/xxx/Debug-iphonesimulator/firstFramework.framework/Modules/firstFramework.swiftmodule’.
解决方法如下图:
2.查看.framework是动态库还是静态库
命令是 file {filePath}
file ./Debug-iphoneos/firstFramework.framework/firstFramework
output:./Debug-iphoneos/firstFramework.framework/firstFramework: Mach-O 64-bit dynamically linked shared library arm64
file ./Debug-iphoneos/secondFramework.framework/secondFramework
output: current ar archive random library
其中
shared library 表示动态库
random library 表示静态库
3.使用上面的脚本创建Static Library的.xcFramework时,必须是.a文件哟。
若是.framework文件,就会报如下的错误
Unknown library type with extension ” in library ‘ios-arm64’.
五、lipo知识介绍
了解了.xcframework,回忆下在此技术之前,我们都是使用lipo命令的。
其中 lipo -info {file} //查看.a /.framework的架构
例如:
lipo -info ./Debug-iphoneos/firstFramework.framework/firstFramework
//output(是Device)
Non-fat file: ./Debug-iphoneos/firstFramework.framework/firstFramework is architecture: arm64
lipo -info ./Debug-iphonesimulator/firstFramework.framework/firstFramework
//output(是Simulator)
Non-fat file: ./Debug-iphonesimulator/firstFramework.framework/firstFramework is architecture: x86_64
当然还有lipo -create.其含义就是把两个包合并成一个。即我们说的fat格式。
lipo -create ./Debug-iphoneos/firstFramework.framework/firstFramework ./Debug-iphonesimulator/firstFramework.framework/firstFramework -output ./firstFramework.framework/firstFramework
把arm64,x86_64两个架构合并成一个文件(Fat文件)
到此,XCFramework介绍完了.
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/421061.html