一、简单介绍
什么是库
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
iOS中的静态库有 .a 和 .framework两种形式;动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。其中系统中.framework文件是动态库,自己打包出来的.framework是静态库,不然审核通不过
静态库与动态库的区别
静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。
二、Framework的打包
1、创建SDK工程以及测试用例代码
(1)创建一个文件夹,然后在里面添加工程组,便于测试SDK
创建一个工程组将其添加在新建的文件夹下
结果如上图所示
(2)在工作组中添加一个新的项目,用于测试打包好之后的SDK
添加新的项目工程,起完名字之后添加到相应的工程组 (3)创建一个新的framework工程,将其添加到相应的工程组 创建framework工程
(4)添加文件到工程,并且在相应的文件中导入接口文件
添加文件到工程
(5)创建完成之后对应的项目组成,一个用于测试,一个用于打包SDK
项目组成
(6)实现方法,并且记得将方法暴露在.h文件中
实现方法
(7)配置相关参数:
将其配置修改,Static Library 静态库
将其build active 都修改成NO,用于来适配所有的机型,如果选择了YES则只能适配部分机型
给Architectures项目中添加armv7s编译器
将需要暴露可以引用的头文件放在public下面,private放不需要暴露的头文件,其中对应的SDK的主头文件一定要放在public下面,不然无法引用
将需要暴露的头文件放在public下面
(8)进行打包
创建一个Aggregare
添加target
选择Aggregare
创建一个新的Run
下面把这段脚本复制进去(格式不要错,格式错编译不通过)
# 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}"
将对应代码赋值到相对应的位置
选择对应target工程,Com + B进行编译,注意不要选错
选择对应target进行编译
编译通过之后就成功了,然后通过Finder找到对应的打包好的SDK,然后将对应编译好的SDK直接使用就可以
(9)进行使用
FrameWork的使用,以及最后成功的结果
三、.a文件的打包
(1).a文件的创建 .a文件库选择并创建然后在创建的文件中进行实现方法,记得要将想调用的方法放在.h中暴露出来,否则无法调用
将需要暴露的头文件放在public中
这里需要注意的是暴露出来的头文件中import的其他类也得添加到public中暴露出来。
如果不想将import的类暴露出来,那么在头文件中用@class 然后在对应的.m文件中再import。
总之
1. 你再外面用到的类,一定要暴露出来;
2. 你暴露出来的类,头文件中导入的类也一定是暴露出来的
3. 如果提示导入头文件报错,找不到文件,找不到谁暴露谁就对了
设置适配的机型
打包前的准备
(2)进行打包操作
- 首先在真机情况下编译 (Generic iOS Device),并记录下.a文件的绝对路径 ,在下图中具有标示,未编译前.a文件是红色的,编译之后.a文件变成了黑色,表示编译成功。
- 选择一个模拟机进行编译,并记录下.a文件绝对路径 ,跟上面一步相同
- 用命令行合并1、2部记录的文件,到新的.a文件,名字最好取开始我们取的名字吧,命令行:lipo -create 文件1路径 文件2路径 -output 最终文件路径
-
把你要暴露的.h文件和你已经生成的.a文件搞到一个文件夹里,这个文件夹就可以直接拖到工程里用啦
选择真机进行编译,左下方的.a文件在编译过后会变黑色!其中右边大方框里面是其绝对路径,将其拷贝出来使用
5.最后将生成的.a静态库文件和需要暴露的.h放在一个新建的文件夹中,然后将这个新建的文件夹放在你需要使用的工程中,这样你就可以使用了
新建的文件目录,可以使用的静态库文件
6.最后将生成的新文件放在项目中进行测试使用
测试使用的结果
category是我们在开发中经常使用到的方法,如果在category打包成静态库之后放在项目中无法使用,则需要在使用静态库的工程配置中将other linker flags的值设置成-ObjC,这是因为在调用category中的方法时会有找不到该方法的运行时错误(selector not recognized)
一般在使用静态库的时候,都是在静态库的内部创建一个.h文件(一般起个的名字静态库名字相同),然后把所需要暴露的.h都集中的放在这个.h文件中,这样这些原本需要暴露的文件就不需要暴露了,只需要将这个新建的.h文件暴露出来就可以了
网友评论