前言
如果你想将你开发好的公用方法和空间与别人分享,一种方法是直接提供源代码文件。然而,这种方法会暴露所有的实现细节,而这些实现你可能并不想开源出来。最重要的是,有些开发者可能并不想看到你的所有代码,因为他们可能仅仅希望将你的这份漂亮代码的一部分植入自己的应用中。另一种方法是将你的代码编译成静态库,让其他开发者添加到自己的项目中。然而,这需要你一并公布所有的公开的头文件,实在是非常不方便。
你需要一种简单的方法来编译你的代码,这种方法应该使得你的代码易分享,并且可以在多个工程中复用。你需要的是一种方法来打包你的静态库,将所有的头文件放到一个单元中,这样你就可以立刻将其加入到你的项目中并使用。
非常幸运,因为Xcode就提供了一个项目模板,包含着默认构建目标(target)和可以容纳类似于图片、声音、字体等资源的文件,你可以为iOS创建Framework。
怎么制作framework?
1.File --->New--->Project 选择Cocoa Touch Framework,如下图所示: 这里我们将Project命名为KityCommonUI
2.先看一下效果,注意下图标红部分
3.将想要添加到framework中的内容拖进该Project,如下图所示:
4.将自己想要公开出来的头文件添加成public,如图所示:
5.做以下修改,基本都在Build Settings中
a.在Architectures中添加armv7s,armv7s主要针对于5和5c;
b.将Buuld Active Architecture Only 改成No
c.将mach-o type 改成Static Library
d.Dead Code Stripping 设置成No
e.Strip Styple 设置成No-Global Symbols
6.分别选择任一模拟器和真机进行编译(common+b),两次编译完成后我们再对比步骤2中的图看下图,会发现本来是缺失的framework已经存在了,这说明我们已经制作成功了,但是这时我们要注意以下,这个framework是包含两种(真机和模拟器)类型的,这样就不便于管理了,所以制作framework还没有真正的结束。
7.接下来我们要把两种类型的framework合成一种通用的,有两种方式,我个人觉得还是用脚本比较简单,所以这里只介绍脚本合成。创建一个新的tagret,类型为Aggregate,如下图所示:
8.选择Aggregate类型的target中,我们添加一项为Run Script Phase的东东。
9.将以下脚本复制进shell中,将Aggregate类型的target分别用真机和模拟器再次进行编译,这时候我们就得到了我们想要的framework(编译完成之后它会自动打开finder显示你需要的framework)。
a.脚本如下:
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework" ${PROJECT_NAME}
FMK_NAME=${PROJECT_NAME}
BUNDLE_NAME=${PROJECT_NAME}
#bundle
BUILD_FW_DIR_OS=${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FMK_NAME}.framework
BUILD_FW_DIR_SM=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FMK_NAME}.framework
BUILD_BUNDLE_DIR=${BUILD_DIR}/${CONFIGURATION}/${BUNDLE_NAME}.bundle
INSTALL_FW_DIR=${SRCROOT}/build/${FMK_NAME}.framework
INSTALL_BUNDLE_DIR=${SRCROOT}/build/${BUNDLE_NAME}.bundle
mkdir -p "${SRCROOT}/build"
# Cleaning the oldest.
if [ -d "${INSTALL_FW_DIR}" ]
then
rm -rf "${INSTALL_FW_DIR}"
fi
if [ -d "${INSTALL_BUNDLE_DIR}" ]
then
rm -rf "${INSTALL_BUNDLE_DIR}"
fi
if [ -d "${BUILD_BUNDLE_DIR}" ]
then
cp -R "${BUILD_BUNDLE_DIR}" "${INSTALL_BUNDLE_DIR}"
rm -rf "${INSTALL_BUNDLE_DIR}/Contents/_CodeSignature"
rm -rf "${INSTALL_BUNDLE_DIR}/Contents/Info.plist"
rm -rf "${INSTALL_BUNDLE_DIR}/Contents/MacOS"
rm -rf "${INSTALL_BUNDLE_DIR}/Info.plist"
rm -rf "${INSTALL_BUNDLE_DIR}/${BUNDLE_NAME}"
fi
if [[ -d "${BUILD_FW_DIR_OS}" ]] && [[ -d "${BUILD_FW_DIR_SM}" ]]
then
mkdir -p "${INSTALL_FW_DIR}"
cp -R "${BUILD_FW_DIR_OS}/" "${INSTALL_FW_DIR}/"
lipo -create "${BUILD_FW_DIR_OS}/${FMK_NAME}" "${BUILD_FW_DIR_SM}/${FMK_NAME}" -output "${INSTALL_FW_DIR}/${FMK_NAME}"
fi
if [ -d "${INSTALL_FW_DIR}" ]
then
rm -rf "${INSTALL_FW_DIR}/_CodeSignature"
rm -rf "${INSTALL_FW_DIR}/Modules"
rm -rf "${INSTALL_FW_DIR}/Info.plist"
fi
open "${SRCROOT}/build"
b.选择scheme