欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS打包SDK生成Framework

程序员文章站 2022-04-30 10:00:05
...

最近打包了一个SDK,记录一下~

创建Framework

1、创建工程

iOS打包SDK生成Framework

2、配置环境

Build Setting -> Dead Code Stripping 改为NO

Build Setting -> Mach-O Type改为 Static Library

Build Setting -> Build Active Architecture Only 改为 NO

Build Setting -> Architectures 添加armv7s架构

Build Setting -> Other C flags 添加-fembed-bitcode (使SDK支持bitcode)

Build Phases -> Headers 将公开的头文件从Project中拖入Public

3、暴露出想要被引用的头文件,需要暴露的头文件都拖到public下面,不需要的都放在private或者project下面

iOS打包SDK生成Framework

4、配置脚本保证模拟器真机都能使用 Build Phases -> Run Script 点击+号,添加一个Run Script,

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

++_前面一大部分是申明一些目录路径,最后使用lipo命令进行合并操作。
在修改这个代码过程中,也许要学习下Xcode的全局变量,代码中那些${}值,都是Xcode自带的变量,详情请参考:Xcode环境变量_++

5、找到工程中Products 文件夹,右键show in finder,目标文件即为合并之后的Framework

iOS打包SDK生成Framework

++可以验证一下:打开终端:输入: lipo -info 然后把生成的framework下的二进制文件拖入终端,获得路径,回车,得到我们想要的信息:++
得到的framework支持的架构如下:
iOS打包SDK生成Framework

真机架构:armv7 arm64

模拟器架构:x86_64

6、集成过程

出现selector not recognized问题,解决方法:

Build Setting -> Other Linker Flags -> -ObjC
它的作用就是将静态库中所有的和对象相关的文件都加载进来。

64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。变通方法是使用-all_load 或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具体的文件,他们加载的位置也是在Xcode的Build Settings下Other Linker Flags里面
相关标签: sdk