iOS Framework 的制作
最近需要将自己项目的公共代码打包成Framework来使用,但是在打包过程中遇到一个问题,就是提取的公共代码中用到了一些第三方的库,比如AFNetworking等,网上找了很久,让我走了不少坑,现在就分享一下在打包Framework时怎样使用CocoaPods引入第三方库。
创建 Framework 工程
1. 创建打包工程
打开Xcode新建一个工程,选择Framework & Libray选项中的Cocoa Touch Framework,这里说一下我的Xcode版本是Version 11.2.1 。

创建工程
假设我的代码中要用到MBProgressHUD这个第三方库(比较好演示),然后使用CocoaPods在工程中集成MBProgressHUD,集成方法和普通项目一模一样。

CocoaPods
然后选择工程下的.xcworkspace重新打开工程。

添加公开头文件
1、删除项目创建,生成的.h文件(如果不删除,用默认的,把所有需要暴露的 .h 文件都用 #import <*****/PublicHeader.h>引入)

2、选中Target,选择Build Phases-Headers,可以看出有三个选项,分别是Public 、Private 、Project,把需要公开给别人的.h文件拖到Public中,把不想公开的,即为隐藏的.h文件拖到Project中。(Public中的头文件,打包之后才能用到)

3、更改设置参数
(1)选中Target,选择Build Settings,在Architectures下增加armv7s。

(2)选中Target,选择Build Settings,在搜索栏搜索Mach-O Type,将Mach-O Type修改为Static Library。

(3)修改支持系统版本

4、增加所需依赖包

模拟器编译所有文件
按照下图将Release模式下编译,选择为随便一个模拟器编译一次,然后真机编译一次,然后按下Command + B开始编译,编译成功后右键Products文件夹下的.framework文件,点击show in Finder。

编译模拟器
打开后可以看到打包完成的模拟器Framework包。

Framework
3. 将两个 Framework 合成
上面有两个Framework, 一个是Release-iphoneos(真机)下的,一个是Release-iphonesimulator(模拟器)下的,需要通过终端命令将两个Framework合为一个模拟器和真机都可使用的Framework。
打开终端先输入lipo -create,然后输入空格。

Framework 合成
接着将Debug-iphoneos(真机)下的TestFramework也就是上面框出来的空白文件直接拖到终端,终端会自动显示路径。

Framework 合成
然后直接将Debug-iphonesimulator(模拟器)下的TestFramework也拖到终端。

Framework 合成
接着输入-output,然后输入空格。

Framework 合成
然后输入~/Desktop/NewTestFramework后直接回车。

Framework 合成
这时候桌面上会多一个新的文件为NewTestFramework,这时候将真机下的.framework包文件复制出来,然后将NewTestFramework重命名为TestFramework也就是.framework包中那个空白文件的名字,如果有.lipo后缀就去掉,接着替换.framework包中的那个空白文件。

Framework 合成
最终替换完成后的.framework包就是我们最后所需要的包了,但是可以发现打包完后的.framework包里面是没有CocoaPods集成的第三方库的,所以在使用.framework包时,工程中必须也要集成.framework包中用到的第三方库,否则会找不到文件而报错。
* Framework合成简便方法

# 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
直接Command + B ,真机就会生成framework。