书接上文:iOS Framework你的想法
Xcode版本:Version 11.4.1 (11E503a)
1. 工程设置
- Mach-O Type -> Static Library (我用的是这个)
- Deployment Postprocessing -> YES
- Strip Style -> Debugging Symbols
- Other C Flags -> -fembed-bitcode
- Edit Scheme -> Run -> Release
- Enable Bitcode -> YES (脑补重复三遍)
2. 编译库
2.1 编译两步走:
1. Generic iOS Device
2. 随便一个模拟器
2.2 合并库
两个编译完成后,合并两个framework为一个,网上可以搜一下编译带合并的脚本,这里给大家提供一个拙劣的合并脚本,将下面内容保存为.sh文件:
#!/bin/bash
#真机编译的framework路径粘贴到这里(「show in finder」你懂得)如:xx/xx/Build/Products/Release-iphoneos
I_FMK_DIR=(替换-1)
#模拟器编译的framework路径粘贴到这里(「show in finder」你懂得)如:xx/xx/Build/Products/Release-iphonesimulator
S_FMK_DIR=(替换-2)
#framework的名字没有后缀,举个栗子:Shit.framework 这里写:Shit
FMK_NAME=(替换-3)
#顾名思义全名,Shit.framework
FMK_FULL_NAME=${FMK_NAME}.framework
#用于真机的库Fat文件
I_FMK_OBJ=${I_FMK_DIR}/${FMK_FULL_NAME}/${FMK_NAME}
#用于模拟器的库Fat文件
S_FMK_OBJ=${S_FMK_DIR}/${FMK_FULL_NAME}/${FMK_NAME}
echo ">>> Start...."
# 删除当前目录中的framework
echo ">>> delete current framework"
rm -rf ./${FMK_FULL_NAME}
sleep 2
#拷贝一个份,作为最终使用的 xx.framework
echo ">>> copy framework..."
cp -R ${I_FMK_DIR}/* ./${FMK_FULL_NAME}
sleep 1
#查看支持的架构
echo ">>> lookup framework archs:"
lipo -info ${I_FMK_OBJ}
lipo -info ${S_FMK_OBJ}
# 2020-10-23,XCode12编译模拟的静态库会支持 arm64,合并时会出错,可以移除模拟器编译的arm64
lipo ${S_FMK_OBJ} -remove arm64 ${S_FMK_OBJ}
#开始合并,将最终Fat文件输出到当前目录的 xx.framework目录下
echo ">>> merge ${FMK_FULL_NAME}..."
lipo -create ${I_FMK_OBJ} ${S_FMK_OBJ} -output ./${FMK_FULL_NAME}/${FMK_NAME}
sleep 1
#查看合并后的架构
echo ">>> lookup the final framework archs:"
lipo -info ./${FMK_FULL_NAME}/${FMK_NAME}
echo ">>> Done"
- 将三处要替换的地方换成真实数据
- 可以将多余的注释空行删掉,这里是为了方便查看
- 最开始的「#!/bin/bash」不要删掉
- 将脚本保存到桌面的某个文件夹,然后进入该文件夹执行:
sh ./xx.sh
3.怎么看是否支持了Bitcode
可以使用以下任意一种,有统计行数则说明ok了:
1. otool -arch i386 -l xx | grep __LLVM | wc -l
2. otool -arch i386 -l xx | grep __bitcode | wc -l
-arch:用来指定cpu架构,i386、x86_64、armv7、arm64等
-l:用来指定你的库的Fat文件,就是xx.framework目录下的同名文件xx
4. 使用framework
鼠标拖进去到工程即可,其中在Target -> General -> Framewoks, Libraries, and Embedded Content下找到你的framework右边会有三个选项:
1. Do Not Embed
2. Embed & Sign
3. Embed Without Signing
通常如果你是静态framework,即:Mach-O Type -> Static Library使用「Do Not Embed」就可以了,如果使用Embed打包时会有如下错误:
Found an unexpected Mach-O header code: 0x72613c21
stackoverflow有关于这个的讨论,意思是说:
- 是否「Embed」
(静态库无需「Embed」)运行:file xxx.framework/xxx
,如果输出:
- current ar archive -> Do Not Embed
- Mach-O dynamically linked shared library -> 「Embed」
- 签名
「Embed」的情况下,运行:codesign -dv xxx.framework
,如果输出:
- code object is not signed at all -> Embed & Sign
- anything else: already signed -> Embed Without Signin