嗯,没错,小豆我学习了一下封装framework,为啥要学这个?当然是我自私,我狭隘,我自己写的代码不想让别人看到啊,怕大佬鄙视我啊,哈哈哈!开玩笑啦,是因为有多个项目用到同一批工具类的时候,几十个文件粘来粘去的实在是烦躁得很,而且改完这个项目的文件的工具类,别的项目对应的工具类也要改,我这么懒的人,实在是忍不了了!!!
废话不多说,开始撸!
创建项目
和平时创建项目有所不同,这次我们创建的项目不是Single View App,而是Cocoa Touch Framework,没错,就是它!然后给项目随便起一个名字哈
导入需要封装的代码
在你的项目文件夹下导入或者开始撸你需要封装的代码:
相关配置
-
Build Active Architecture Only 设置为NO,即当前打包的.framework支持所有的设备,否则打包时只能用当前版本的模拟器或真机运行
-
设置Dead Code Stripping 为NO
-
Mach-O Type选中StaticLibrary,即静态库,Xcode默认是动态库
-
设置framework最低支持的版本
-
设置外部需要调用的头文件:将需要给外部呈现的文件从Project拖到Public中
- File -> Project Setting -> Build System ->Legacy Build System
至此,我们想要封装的framework的相关配置基本完毕。
Add Target:Aggregate
File ->New ->Target,随便起一个名字
添加脚本代码
在你刚才新建的target下,点击BuildPhases下面的“+”号,选择New Run Script Phase,把以下脚本复制过去
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"
最后在你刚才创建的Aggregate的Target下Command+B,然后你会发现在Project下会有一个.framework的文件。
验证
为了检测我们这个framework是否正确,我们再创建一个Target
-
创建测试Target
-
添加已经封装好的framework
在需要的地方添加需要测试的功能代码,在测试Target下运行程序,验证framework是否成功封装,当然,你也可以通过在Build Phases下的Compile Sources添加未封装之前的.m代码文件后的运行结果与添加framework的运行结果进行对比验证。
终于写完了,全是图,截图甚是乏累呢!