创建一个自己的 SDK

862 阅读1分钟

目标

  1. 构建一个 SDK
  2. 构建一个 App
  3. App 集成 SDK
  4. 修改 SDK,在 App 中调试
  5. 输出 SDK

步骤

1. 创建一个本地工作文件夹

工作目录下包含 SDK + App 工程

2. 创建一个 workspace

新建一个空白的 workspace

3. 创建一个 Framework

在工作目录下创建 SDK 的 framework

4. 创建一个 Demo App

在工作目录下创建 Demo

5. 链接 Demo 跟 SDK

  1. 打开 workspace 添加 Add Files to 'xxx.workspace' 找到 SDK 和 Demo 的 xcodeproj 添加进来
  2. 选中 SDK 工程,找到 Build Settings 搜索 mach-o type 修改为 Static Library 静态库
  3. 选中 Build Phases 添加脚本 New Run Script Phase,导出编译 SDK 后的产物(包含真机以及模拟器),如下
# Framework库合并脚本

# 进入到项目主目录的前一级目录下,../ 表示往前返回一级目录。
cd ${PROJECT_DIR}/../
# 创建一个 '/Frameworks' 的文件夹,用来存放 SDK
mkdir -p Frameworks
cd Frameworks
# 创建一个 '/output' 的文件夹来存放 SDK
mkdir -p output
cd output

# 下面是找到模拟器合真机的打包路径,使用lipo -create命令进行合并。
cp -rf ${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/${PRODUCT_NAME}.framework ./
iphoneosFile=${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PRODUCT_NAME}.framework/${PRODUCT_NAME}
iphonesimulatorFile=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PRODUCT_NAME}.framework/${PRODUCT_NAME}
if [ -f "$iphoneosFile" ] && [ -f "$iphonesimulatorFile" ]; then
lipo -create "$iphoneosFile" "$iphonesimulatorFile" -output ./${PRODUCT_NAME}.framework/${PRODUCT_NAME}
fi

rm -rf ./${PRODUCT_NAME}.framework/_CodeSignature

  1. Xcode 编译目标选择 SDK,build 生成 framework
  2. 在 Demo 工程下添加 SDK: Add Files to 'Demo',找到 /Framework/output 路径,选中导出的 SDK 产物
  3. 在 Demo 打包时去掉模拟器库(可做可不做),选中 Demo 添加脚本 New Run Script Phase
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
if [[ $APP_PATH != *ArchiveIntermediates* ]]; then
    exit 0
fi
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
 
EXTRACTED_ARCHS=()
 
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
 
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
 
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
 
done

6. 调试

  1. 构建出 SDK 后默认对外开放 xxx.h (SDK名),我们可以在 Demo 中直接导入 #import <SDK/SDK.h>
  2. 如果需要 SDK 对宿主提供额外的 .h:选中 SDK 工程,找到 Build Phases -> Headers -> Public 把需要公开的类都拉到 public 中即可
  3. Xcode 在编译 Demo 时会优先检查依赖库的状态,如果 SDK 发生变化,会重新编译 SDK 输出产物,链接后再编译 Demo