封装 .framework 静态库

为什么要封装静态库

像工作中使用的第三方SDK基本上都是闭源的,因为公司不能把自己的机密泄露出去。所以当需要给别人提供SDK但不让他们知道代码的实现时就需要封装成静态库。

静态库有.a库和.framework库,苹果官方更建议我们使用.framework库,因为其更加强大。

.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework。

步骤

参考这篇博客: iOS开发——创建你自己的Framework 讲解的非常详细。

总结一下步骤:

  1. 创建工程,最好是起名为xxxDemo例如AXKitDemo,然后新建一个target名为AXKit,并把原来的工程改名为AXKit。(为了方便在demo中调试静态库)
  2. 新建一个target,选择类型为framework。
  3. 在framework中创建需要封装的类,写好代码。
  4. Build Setting里更改参数,Math-O TypeStatic Library
  5. Build Phases -> Headers里将需要暴露出来的头文件从Project移动到Public
  6. 添加一个Aggregate的target,并添加运行脚本。目的是把编译出来的真机版和模拟器版的framework合并。
  7. 模拟器编译一下,真机编译一下,然后Aggregate编译一下,然后在项目的Products文件夹里就有了最终生成的静态库。

Aggregate的Run Script脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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