实战 制作XCFramework

之前做过一个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/bashset -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 $xcframeworkFileNamefi
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 $xcframeworkFileNameelse #创建.xcframework文件 (动态库方式) xcodebuild -create-xcframework -framework $path$debugIPhoneosDir"/"$frameworkName$suffixFramework -framework $path$debugSimulatorDir"/"$frameworkName$suffixFramework -output $xcframeworkFileNamefi
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/secondFrameworkoutput: 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

(0)
联系我们
联系我们
分享本页
返回顶部