1. 库的分类
- 开源库:公开源代码,能看到具体实现
- ** 闭源库**:不公开源代码,是经过编译后的二进制文件,看不到具体实现;其中包括:静态库和动态库
2. 开源库的制作
我了解的开源库的制作,就是将代码上传到cocopods上,提供其他人下载使用。
优点:制作简单
缺点:暴露源码
cocopods上传的步骤:
将代码上传到cocopods
3. 静态私有库framework的制作
3.1 用xcode创建一个framework工程:
创建后的工程如下:
3.2 添加代码
将准备好的代码添加到工程里
添加对应的代码文件目录如下:
3.3 配置工程文件
设置兼容最低的iOS系统
设置Build Active Architecture Only 值 为NO。如下图(适配所有版本的模拟器和真机)
设置Mach-O Type值为Static Library(静态库)。如下图
设置Excluded Architectures下的 Any ios Simulator SDK 值为 arm64。(模拟器生成的.framework, 不需要arm64架构)。如下图 切记taget不要看错了。
3.4 设置暴露的头文件
将需要别人引用的头文件设置public。默认在project(不可见,私有)。
在自动生成的IGLiveSDK的.h 文件中,加入需要暴露的头文件, 格式应该是用"<>“
注意:设置public的文件,与在LGLiveSDK 设置的头文件要保持一致,不然编译不通过。
3.5 引用到其他的三方库时的操作
如果代码中引用到了其他的三方库,例如AFN, Masonry等等,那么也需要在framework的工程中集成过来,保证能编译成功。
用命令行进入项目文件下:
执行”pod init“
在Podfile 中,添加对应的其他三方库
回到命令行,执行“pod install”
3.6 设置编译模式 release
3.7 编译
先选择真机编译 ,command+b 生成真机.framework,如果不成功,看看是什么问题
选择模拟器,command+b 生成模拟器.framework
3.8 真机和模拟器都编译成功后,合并生成对应的framework
在project下的新建一个run script, 执行后自动生成合并后的framework
Project --> TARGETS --> Build Phases -> + --> New Run Script Phases 如下:
在新建的run script 下添加如下的代码:
# Type a script or drag a script file from your workspace to insert its path.
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
# 如果真机包或模拟包不存在,则退出合并
if [ ! -d "${DEVICE_DIR}" ] || [ ! -d "${SIMULATOR_DIR}" ]
then
exit 0
fi
# 如果合并包已经存在,则替换
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# 使用lipo命令将其合并成一个通用framework
# 最后将生成的通用framework放置在工程根目录下新建的Products目录下
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#合并完成后打开目录
open "${SRCROOT}/Products"
fi
添加后的效果如下:
在真机 和 模拟器 都各编译完一次后,才能执行这段代码,执行步骤,就是common + B, 编译完后,会在工程目录下生成对应的framework,如下图:
3.9 使用framework
将framework拖到需要使用的工程目录下,为了方便管理添加的framework库,我在工程目录下创建了一个“Library”文件夹,我添加的路径,如下图
打开工程,添加对应的framework
添加后的样子
在 target下的general 的Framework 、libraries 下 点击" + " 选择 “ Add file” 将 对应的Framework添加进来,并将值设置为“Do Not Embed”
在需要的地方添加引用逻辑即可。
4. Framework中需要用到资源的添加
回到制作Framework的工程中,在生成的framework 目录即 Product 下,与 framework平级下添加一个.bundle, 如下图
将图片资源放到进去,然后在使用Framework的工程中,也添加这个bundle文件,如下图:
Framework中 图片的获取,注意需要区分@2x.png 和 @3x.png , 图片的名称必须写全,否则会找不到图片的。
- (UIImage *)getImageWithName:(NSString *)imageName {
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
//IGLiveSDK 需要修改成创建的对应的bundle名
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"IGLiveSDK.bundle/%@@2x.png",imageName] inBundle:bundle compatibleWithTraitCollection:nil];
if (image == nil) {
image = [UIImage imageNamed:imageName];
}
return image;
}
—结束—
参考文档:
iOS制作framework
iOS Framework合并