XCode6以前因为不支持.framework自定义静态库的制作,使用最多的是.a静态库,但是.a静态库制作完成之后,我们还必须保存工程的.h文件,看起来有些不伦不类的,封装的不够彻底,而.framework则不需要,本篇主要介绍.framework静态库的制作和使用。
制作步骤
首先新建一个项目,选择Framework&Library中的Cocoa Touch Framework。
创建完成之后开始编写我们需要封装的代码,为了演示我新建了三个类。
配置参数,这里制作的是静态库,需要将
Mach-O Type
设置为Static Library
。和.a类似,生成的静态库需要进行合并才能适应不同的平台,为了方便,我们可以向Xcode添加脚本来解决这个繁琐的问题。
新建target
选择Aggregate
我们在target的Build Phases中点击加号
添加一个Run Script
在里面添加脚本,脚本代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FMK_NAME=${PROJECT_NAME}
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"
代码编写完成以后,我们需要设置哪些文件是暴露给开发者的,哪些是需要隐藏的,如下图,我们将需要暴露的文件移到Public下即可,Project中的文件是隐藏的,Private中的文件跟Public一样也是暴露的,博主暂时也不清楚Private文件的用意。
使用方法
使用方式如下图,直接将.framework拖入工程即可。
注意事项
Category错误
错误描述:静态库中如果包含了Category(分类),有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)。
具体原因:参见编译参数-objc说明
解决方案:在使用静态库的工程中配置
Other Linker Flags
为-ObjC制作成动态库
错误描述:在使用静态库时,运行报错(Reason: Image Not Found)
具体原因:可能由于没有设置
Mach-O Type
,做的是动态库,在使用的时候需要额外加一个步骤,要把Framework同时添加到General --> Embedded Binaries
中。解决方案:将
Mach-O Type
设置为Static Library