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

创建Framework

1、创建工程

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下面

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

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

得到的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里面