白酒清茶无别事
我在等风也等你

iOS打包自己的Framework,包含第三方Framework(静态,动态都可以),开启bitcode

公司最近在开发基于开源Open WebRTC Toolkit的直播架构,有幸参与编译iOS端源码,刚好记录下其中遇到的坑。

Open WebRTC Toolkit 项目地址:https://software.intel.com/en-us/webrtc-sdk

编译OWT源码

按照官方的教程,编译就可以了。编译完成之后,会获得两个Framework。

这里我需要说下,其实这个WebRTC.Framework 是动态库类型,不是静态库。至于最终编译获得Framework,能不能上架,目前还没测试,我个人觉得应该没啥问题,毕竟现在App的Extension的也可以和宿主app共享动态库。

查看二进制文件信息命令:

file 二进制文件

OWT是一个静态库,支持arm64(64位手机),和模拟器

WebRTC是一个动态库,支持arm64(64位手机),和模拟器

修改下第三方Framework结构

其实Framework仅仅是打包资源的一种方式,我们将其改成.a文件引入,这样可以避免编译失败,或者其他BUG。

将二进制文件,改成.a格式,再拖到头文件Headers里面,修改文件夹名字。

将两个Framework修改完成之后,保存好,可以备份下。

创建Framework工程

创建Framework,TARGETS->项目->Build Settings 设置Mach-O Type 为 Static Library

设置好之后,拖拽之前准备好的第三方库,记得勾选Add to targets

设置好第三方库需要的依赖。

然后简单写个头文件,引入下第三方的头文件,测试下

不出意外,找不到头文件了,当时这里困扰很久,我Google啊,各种改Build Settings里面的Header Search Paths,各种不行,网上也没找到方法。后面转念一想,这个路径引入的是Framework的结构啊,现在Framework都没了,头文件肯定也得修改了,好在OWT.Framework的头文件不多。

类似#import <OWT/OWTErrors.h>

修改成#import <OWTErrors.h> 即可解决问题

修改后的头文件,其他的类头文件,也需要修改,以下是部分头文件展示

设置bitcode

开启bitcode的前提,第三方库,支持bitcode编译才行。

TARGETS->项目->Build Settings 搜索 other c flags 添加-fembed-bitcode

如果第三方库支持bitcode,这里编译是不会报错的。

暴露头文件

TARGETS->项目->Build Phases 将供别人使用的头文件转移到Public

 

测试Framework

随便写点测试代码,走一遍试试

我是真机测试的,所以这里我编译arm64的包

右键选择编译好的Framework,Show in Finder,将编译好的包,拖拽到新的测试Demo,编译试试。

运行结果,日志输出正常。接下来,就是进行日常开发,接口丰富了。

合并x64和Arm64自动化脚本

自己编译好的Framework,肯定是要打包给别人用的,用这个脚本,可以合并两种架构,方便别人调试。

回到编写的Framework项目,新建一个TARGETS,添加编译脚本Run Script

脚本来源网络,测试可行

#!/bin/sh
#要build的target名
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}/"

#创建输出目录,并删除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"

#分别编译模拟器和真机的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

#拷贝framework到univer目录
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"

#合并framework,输出最终的framework到build目录
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"

#删除编译之后生成的无关的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"

for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done

#判断build文件夹是否存在,存在则删除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"

#打开合并后的文件夹
open "${UNIVERSAL_OUTPUT_FOLDER}"

编译下脚本,自动打包完成,切记别选错了。

赞(0) 打赏
未经允许不得转载:吾日三省吾身 » iOS打包自己的Framework,包含第三方Framework(静态,动态都可以),开启bitcode
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏