在我们的项目开发过程中,我们并不想外部知道某些功能的实现细节,或者有一些重复使用的功能模块,我们会封装成SDK,iOS中有动态库和静态库,framework既可以是动态库也可以是静态库,但我们如何调试我们的framework,不能每次调试都要打包然后嵌到别的项目里运行,这样是很不友好的,现在我们来说一下如何创建一个复合的工程,既包含framework源代码,还可以对源代码进行调试,还有自动打包的功能。
创建示例demo
首先我们创建一个示例demo,该demo可以是framework的使用说明,还可对framework的源码进行调试。
1、创建Single View App,命名为TestFrameworkDemo
创建Framework工程
1、创建一个Framework工程,命名TestFramework
2、在选择存储目录的时候,一定要选择添加到哪个工程目录下,如下图选择TestFrameworkDemo,前提TestFrameworkDemo一定要打开的状态,不然不会显示。
3、修改TestFramework的工程配置
加入armv7s的Architectures修改Mach-O Type为静态库(根据你的要求选择静态库还是动态库)
修改Build Active Architecture为NO
4、修改TestFrameworkDemo的工程配置
在Target Dependencies添加刚才的SDK
在Link Binary With Libraries添加SDK
在Header Search Paths中添加SDK的目录,将两个目录都添加进去
创建Aggeregate打包target
1、在TestFramework的工程下创建Aggregate的target2、修改Target配置
在Target Dependentcies中添加SDK添加armv7s的Architectures
修改Build Active Architecture Only为NO
3、添加打包和合并SDK的shell脚本
在Build Phases中添加Script
将shell脚本添加到输入框,在编译这个TestFrameworkAggregate的Target后,会在TestFramework目录下生成一个product文件夹,里面包含了Release和Debug版本的Framework,这个Framework是将真机和模拟器合并好之后的Framework。
自动打包SDK的shell脚本
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
if [ "${ACTION}" = "build" ]
then
# 设置Configuration,为Debug和Release
COF_NAME_DEBUG=Debug
COF_NAME_RELEASE=Release
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
# 最后生成Debug和Release版本的framework的路径
INSTALL_DIR_DEBUG=${SRCROOT}/Products/${COF_NAME_DEBUG}/${FMK_NAME}.framework
INSTALL_DIR_RELEASE=${SRCROOT}/Products/${COF_NAME_RELEASE}/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
# 编译之后的framework路径
WRK_DIR=build
DEVICE_DIR_DEBUG=${WRK_DIR}/${COF_NAME_DEBUG}-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR_DEBUG=${WRK_DIR}/${COF_NAME_DEBUG}-iphonesimulator/${FMK_NAME}.framework
DEVICE_DIR_RELEASE=${WRK_DIR}/${COF_NAME_RELEASE}-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR_RELEASE=${WRK_DIR}/${COF_NAME_RELEASE}-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
# 编译各个版本的framework
xcodebuild -configuration ${COF_NAME_DEBUG} -target "${FMK_NAME}" ONLY_ACTIVE_ARCH=NO -sdk iphoneos clean build
xcodebuild -configuration ${COF_NAME_DEBUG} -target "${FMK_NAME}" ONLY_ACTIVE_ARCH=NO -sdk iphonesimulator clean build
xcodebuild -configuration ${COF_NAME_RELEASE} -target "${FMK_NAME}" ONLY_ACTIVE_ARCH=NO -sdk iphoneos clean build
xcodebuild -configuration ${COF_NAME_RELEASE} -target "${FMK_NAME}" ONLY_ACTIVE_ARCH=NO -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR_DEBUG}" ]
then
rm -rf "${INSTALL_DIR_DEBUG}"
fi
mkdir -p "${INSTALL_DIR_DEBUG}"
cp -R "${DEVICE_DIR_DEBUG}/" "${INSTALL_DIR_DEBUG}/"
# 合并Debug版本的framework
lipo -create "${DEVICE_DIR_DEBUG}/${FMK_NAME}" "${SIMULATOR_DIR_DEBUG}/${FMK_NAME}" -output "${INSTALL_DIR_DEBUG}/${FMK_NAME}"
# Cleaning the oldest.
if [ -d "${INSTALL_DIR_RELEASE}" ]
then
rm -rf "${INSTALL_DIR_RELEASE}"
fi
mkdir -p "${INSTALL_DIR_RELEASE}"
cp -R "${DEVICE_DIR_RELEASE}/" "${INSTALL_DIR_RELEASE}/"
# 合并Release版本的framework
lipo -create "${DEVICE_DIR_RELEASE}/${FMK_NAME}" "${SIMULATOR_DIR_RELEASE}/${FMK_NAME}" -output "${INSTALL_DIR_RELEASE}/${FMK_NAME}"
# 删除build路径
rm -r "${WRK_DIR}"
open "${INSTALL_DIR_RELEASE}"
fi