iOS制作framework

前言:因为公司业务需求最近要开发一版蓝牙SDK供下游使用,说来惭愧iOS开发这么久,对于如何打包framework倒是知之甚少,所以写下这篇文章作为记录。

1. 新建Framework

1.1 新建iOS Project,如下图所示选择iOS-Framework,名字可以随便取,我新建项目的名称为LTTestKit
image-20230602140353401

如果上面不是选择iOS系统,而是macOS或者其它的系统,可在Xcode中【Targets】->【Build Settings】->【Base SDK】中切换为iOS系统,如下图所示。

image-20230602140816108

接下修改Mach-O Type为Static Library,如下图所示:

image-20230602141019415

2.公开头文件

新建一个测试类,随便什么都行,我这边新建了一个打印的log的类,内容如下:

image-20230602141717450

然后选择Target-BuildPhases,将需要公开的头文件拖到public中,此处我将LTPrintLog.h从Private拖到Public中。

image-20230602142257748

另外公开头文件还有另外一种方法,选中头文件在右边栏中选择Public,如下图所示:

image-20230602143049697

3. 修改项目头文件

找到项目的同名的头文件,把Public中的头文件导入到项目头文件里(项目同名的头文件,系统自动生成)

image-20230602143200829

4.创建Aggregate Target

新建target,步骤如下图所示:

截屏2023-06-02 14.46.44

接下来选择Other -> Aggregate,名字也随便起。

image-20230602152613079

选中生成的Aggregate,为其添加依赖:

image-20230602152914250

点击Target Dependencies下方的“+”,选中最开始创建的Framework对应的Target,点击“add”即可。

image-20230602152955367

5.修改Target的Scheme

如下图操作,选择EditScheme:

image-20230602153056002

分别把两个Target的Run模式的Build Configuration改为Release。

image-20230602153223699

image-20230602153246777

6.创建打包脚本

选择聚合Target,点击左上角的+号,选中New Run Script Phase

截屏2023-06-02 15.35.09

在Run Script中添加如下脚本。脚本的作用是将模拟器包和真机包合并成一个聚合包,并将聚合包放在项目根目录下的Products文件夹中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework

DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework

SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework


if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"

lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"

#open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi

image-20230602153705194

7.生成framework

先选择Framework对应的Target分别在模拟器跟真机上都run一遍。这里分别选择了iPhone 14 Pro跟Any iOS Device(也可选择自己的真机)。

image-20230602154013756

然后切换LTTestKitAggregate也运行一遍

image-20230602154132268

之后会自动弹出Finder,打好的framework就已经生成成功

image-20230602154302178

8.检查Framework有效性。

打开终端,进入到LTTestKit.framework所在目录。利用lipo命令输出.framework下的LTTestKit文件信息。如下所示:lipo -info LTTestKit,显示为fat file,则表明是模拟器和真机的聚合包。fat file,顾名思义,胖文件。相应的,非聚合包就是瘦文件,则输出Non-fat file: LMBaseKit is architecture: arm64之类的

image-20230602154629949

结语

做完这些步骤,Framework的生成工作就告一段落了,如何测试生成的Framework是否能用,只需要新建一个项目将生成的Framework拖入项目,导入头文件,调用Framework中的方法,查看是否执行。如果成功执行说明执行反之则出了问题。这里就不延时Framework的测试了。


iOS制作framework
https://ilittle.fun/2023/06/02/iOS制作Framework/
作者
Leelt
发布于
2023年6月2日
许可协议