iOS SDK 开发 - 使用自动化打包脚本快速产出 SDK

2,857 阅读2分钟

开发 sdk 时经常遇到需要打包的情况,如果是多人开发的 sdk 自然是搭建自动化打包平台,利用自动化打包平台比较方便快捷,但单人开发的 sdk 还是配置打包脚本比较方便快捷,本文介绍两种常见的 sdk 开发方式下的打包方式。

1.使用 cocoapods 创建的库

  1. 使用 pod lib create MyLibrary 创建库

  2. 在本机安装 gem install cocoapods-packager

  3. 运行 pod package MyLibrary.podspec 输出 sdk

    异常处理:

    1.如果只是本地开发,未向 repo 提交该库,则需要将 MyLibrary.podspec 中的 s.source 指向本地库路径

    2.需要打动态库,静态库, framework 运行 pod package —help 查看相关命令

2. 通用方式,包含有 sdk target 的 Xcode 项目

脚本的原理及使用说明在 shell 脚本的注释中有详细说明

使用方式:

  1. 第一种:直接运行 shell 脚本

    脚本文件与工程文件处在同一路径下,命令行打开脚本所在目录执行 sh shellName.sh

  2. 第二种:在当前工程下创建一个新的 Aggregate target, 在该 target 的 Build Phases 里添加一个 new Run Script Phase,单独运行该 target 就会成产好 sdk

create_aggregate

  1. 第三种:在 target 的 Build Phases 里添加一个 new Run Script Phase, 运行该 tartget 时会运行该脚本,生成 sdk

    在新添加的 run script 中添加我们创建的脚本的路径 "${SRCROOT}/path/shellName.sh"

#!/bin/sh

# workspace 工程名,如果是单 target 项目则不需要
PROJECT_NAME='XXX_project'
# target 名
TARGET_NAME="XXX_target"
# 工程文件所在的根目录
SRCROOT='.'

# Sets the target folders and the final framework product.
FMK_NAME='sdk_name'

# 最终 sdk 输出的文件路径
# 在工程文件所在的根目录创建 sdk 输出路径,如果是 framework 形式则为 .framework
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# 在工程文件所在的根目录创建 sdk 输出路径,如果是 static lib 形式则为 .a
# INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.a


# sdk 编译过程的输出文件路径
WRK_DIR=./build
# framework 形式真机架构输出文件路径
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}/${FMK_NAME}.framework
# static lib 形式真机架构输出文件路径
# DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.a
# framework 形式模拟器架构输出文件路径
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}/${FMK_NAME}.framework
# static lib 形式模拟器架构输出文件路径
# SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.a

# -configuration ${CONFIGURATION}
# 清理编译生成真机和模拟器架构的 sdk

# 单 target 项目
# xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
# xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build

# 包含 workspace 的项目
xcodebuild -configuration Release -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${TARGET_NAME}" -sdk iphoneos clean  build SYMROOT="../${WRK_DIR}"
xcodebuild -configuration Release -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${TARGET_NAME}" -sdk iphonesimulator build SYMROOT="../${WRK_DIR}"

# 清理之前生成的 sdk
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

mkdir -p ${SRCROOT}/Products

cp -LR "${DEVICE_DIR}" "${INSTALL_DIR}"

echo "DEVICE_DIR: ${DEVICE_DIR}"
echo "INSTALL_DIR: ${INSTALL_DIR}"

# Uses the Lipo Tool to merge both binary files (i386/x86_64 + armv7/armv64) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"

rm -r "${WRK_DIR}"

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

if [ -f "${INSTALL_DIR}/Info.plist" ]
then
rm "${INSTALL_DIR}/Info.plist"
fi