背景
每一个build后只会得到单一指令集的framework,例如x86_64、arm64。
一般发布时只会用到arm64指令集(armv7太老可以不用考虑),但是提供framework给其他人用时,难免会用到混合指令集的framwork。
lipo 模拟器framework/包名 真机framework/包名 -create -output 混合framework/包名
脚本
#配置
CURRENT_DIR=`pwd`
#build后的真机、模拟器的framework路径
FRAMEWORK_NAME="${PROJECT_NAME}"
SMIULATOR_FAMEWORK_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework"
DEVICE_FAMEWORK_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework"
#universal为混合framework路径
UNIVERSAL_DIR="${CURRENT_DIR}/BuildUniversal"
UNIVERSAL_FAMEWORK_PATH="${UNIVERSAL_DIR}/${FRAMEWORK_NAME}.framework"
# ${CONFIGURATION} 表示的是配置的模式Debug或Release,这里我Xcode配置的是Debug
# CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator 指定build的生成路径,在这里指的是DerivedData的地址
xcodebuild -arch x86_64 -sdk iphonesimulator -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator
xcodebuild -sdk iphoneos -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos
#每次都需要删除旧的文件夹
rm -rf "${UNIVERSAL_DIR}"
mkdir "${UNIVERSAL_DIR}"
#这里创建的framework是空的,没有二进制文件
mkdir "${UNIVERSAL_FAMEWORK_PATH}"
#这里把真机的framework内容完全复制到universal中(也是模拟器,目的是让framework中有内容)
cp -r "${DEVICE_FAMEWORK_PATH}/." "${UNIVERSAL_FAMEWORK_PATH}"
#合并模拟器、真机framework中的二进制文件到universal的二进制文件
lipo "${SMIULATOR_FAMEWORK_PATH}/${FRAMEWORK_NAME}""${DEVICE_FAMEWORK_PATH}/${FRAMEWORK_NAME}" -create -output "${UNIVERSAL_FAMEWORK_PATH}/${FRAMEWORK_NAME}"
先设置模拟器包路径、真机包路径,还有混合包路径
分别编译模拟器、真机
先删除混合包路径,再创建,并且拷贝一个真机包到混合路径
执行lipo命令输出到混合路径
注意:
混合包输出路径在当前工程BuildUniversal
默认包名和工程名一致,不一致时手动修改FRAMEWORK_NAME
添加脚本
在这里粘贴脚本,选择刚才创建的target就可以build生成混合指令集的framework