一、a库封装
1.1 创建工程
1.2添加需要封装的代码文件
1.3 添加对外开放的头文件
选中Targets-Build phases-Copy Files
1.5 编译:
通过simulator编译,a库只能在simulator运行。通过真机编译,a库只能在真机运行。
查看库所支持的架构:lipo -info 库的绝对路径
手动合成:
simulator 库与真机库合成通用库:lipo -create simulator库 真机库 -output 存放合成库绝对路径-
编译时自动合成支持所有架构:
选择工程,添加targets-Aggregate
添加shell脚本区域:
添加shell脚本命令:
if [ "${ACTION}" = "build" ]
then#要build的target名 target_Name=${PROJECT_NAME} echo "target_Name=${target_Name}" #build之后的文件夹路径 build_DIR=${SRCROOT}/build echo "build_DIR=${build_DIR}" #真机build生成的头文件的文件夹路径 DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME} echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}" #真机build生成的.a文件路径 DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a echo "DEVICE_DIR_A=${DEVICE_DIR_A}" #模拟器build生成的.a文件路径 SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}" #目标文件夹路径 INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME} echo "INSTALL_DIR=${INSTALL_DIR}" #目标头文件文件夹路径 INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}" #目标.a路径 INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PR OJECT_NAME}.a echo "INSTALL_DIR_A=${INSTALL_DIR_A}" #判断build文件夹是否存在,存在则删除 if [ -d "${build_DIR}" ] then rm -rf "${build_DIR}" fi #判断目标文件夹是否存在,存在则删除该文件夹 if [ -d "${INSTALL_DIR}" ] then rm -rf "${INSTALL_DIR}" fi #创建目标文件夹 mkdir -p "${INSTALL_DIR}" #build之前clean一下 xcodebuild -target ${target_Name} clean #模拟器build xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator #真机build xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos #复制头文件到目标文件夹 cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}" #合成模拟器和真机.a包 lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}" #打开目标文件夹 open "${INSTALL_DIR}" fi
1.6 注意事项
- 选中Targets-Build Setting-Architectures-Build Active Architecture Only设置为NO,build所有架构
- Architectures 默认结构不包含armv7s(iphone5c),可在Architectures中添加
二、Framework(动态,静态)封装
1.创建Framework工程
2.添加封装代码文件
3.头文件归类
将对外开放的头文件导入与库名称相同的头文件中,此文件作为公共的头文件,使用者只需要将此头文件导入即可使用,无需导入多个,下图的头文件为:DynamicWebFramework.h
4.编译
编译原理与a库编译原理相同,但shell脚本有很多种写法,具体可以查询学习一下,在此不再详解,因为我还没搞懂啊~~
5.注意事项
- Build Setting——“Mach -O Type”默认为:Dynamic Library(iOS 8+支持动态库),可选择Static Library
6.对于三方库的处理
不建议将三方库封装进自己的库中,(貌似你也封装不进去~~)
6.1 正常导入三方已封装的库
6.2 封装代码中正常导入头文件,调用三方库相关方法
6.3 配置search path
- 其实,Framework Search Paths、Header Search Paths、Library Search Paths三个相对地址相同也可以(文件路径最大化)——》轻松愉快解决战斗
- 默认检索header search paths,User Header Search Paths只有Always Search User Paths为(o)/YES!时,才会去检索
6.4 删除三方库封装工程的关联,切记:物理地址中的三方库不要delete,否则会出人命的
7.Framework的使用
获取Framework 库中的资源文件:
iOS 8+:获取图片
[UIImage imageNamed:@"imageView" inBundle:[NSBundle bundleForClass:self.class]compatibleWithTraitCollection:nil];
获取XIB文件
//这个Class对应你工程所在的类名
[[NSBundle bundleForClass:self.class] loadNibNamed:@"ColorView" owner:self options:nil];
//这个对应你的FrameWork的Bundle Identifier
[[NSBundle bundleWithIdentifier:@"com.xxx.xx"] loadNibNamed:@"ColorView" owner:self options:nil];
- Framework(静态库)
- Framework(动态库)
三、bundle(资源包)封装
1.创建bundle工程
2.导入资源文件
- Create groups 只会根据导入的资源文件结构进行分组
- Create folder references 会对导入文件的物理结构进行关联