先说手动打包:
lipo -create 真机路径 虚拟机路径 -output 真机或虚拟机路径
真机路径和虚拟机路径指的是真机生成的framework中的这个黑色图标的东西。create的输出结果会覆盖掉 output的这个黑丝图标的文件。-output输出的framework就是合并之后的包。
再说自动化脚本
1.新建一个.sh文件,文件名叫啥都行,此处叫xcodebuild,新建一个空白文件,改后缀为.sh就行了。没啥快捷键。文件存放路径一般和即将打包的项目的.xcodeproj同级
2.在需要打包的xcode项目的build Phases中 new run script phase
3.在新建的run script中添加脚本运行。这里写了之后,每次build都会运行,很浪费时间,不打包的时候这里可以注释掉(前面加#)
4,真机build一次,虚拟机build一次,就成功了
第一个就是真机的包,第二个是真机假虚拟机的包,如果有把pod打成zip的需求,可以添加如下命令,
zip -r 压缩后的zip名字.zip Pod
另外:.虚拟机打包不应包含arm64架构,因此在项目中应该手动去掉。我的项目中还需要去掉i386架构,你的项目如果如果不需要可以去掉。如果有如下报错信息,说明xxx.a不支持某个架构,这里是不支持i386,就需要去掉对应的框架:
xxx.xcodeproj The linked library 'xxx.a' is missing one or more architectures required by this target: i386.
.sh的脚本代码如下:
#!/bin/sh
# 取得build的target名(get project name)
FRAMEWORK_NAME="项目名"
#或者用下面的这个自动获取项目名
#FRAMEWORK_NAME=${PROJECT_NAME}
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/Pod"
#UNIVERSAL_PRODUCT_PATH="${UNIVERSAL_OUTPUT_FOLDER}/framework名.framework"
#创建输出目录,并删除之前的framework文件
if [ ! -d "${UNIVERSAL_OUTPUT_FOLDER}" ];then
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
fi
if [ ! -d "${UNIVERSAL_OUTPUT_FOLDER}/Library" ];then
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}/Library"
fi
if [ ! -d "${UNIVERSAL_OUTPUT_FOLDER}/Library-Universal" ];then
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}/Library-Universal"
fi
#删除旧的framework
if [ -d "${UNIVERSAL_OUTPUT_FOLDER}/Library/framework名.framework" ];then
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/Library/framework名.framework"
fi
if [ -d "${UNIVERSAL_OUTPUT_FOLDER}/Library-Universal/framework名.framework" ];then
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/Library-Universal/framework名.framework"
fi
#xcodebuild clean
#rm -rf ${BUILD_DIR}
# 设置真机和模拟器生成的静态库路径 (set devcie framework and simulator framework path) ${TARGET_NAME}
DEVICE_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneos/framework名.framework"
SIMULATOR_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/framework名.framework"
#拷贝framework到Library和Library-Universal目录
cp -rf "${DEVICE_DIR}" "${UNIVERSAL_OUTPUT_FOLDER}/Library"
cp -rf "${SIMULATOR_DIR}" "${UNIVERSAL_OUTPUT_FOLDER}/Library-Universal"
#合并framework,输出最终的framework到build目录
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/Library-Universal/framework名.framework/framework名" "${DEVICE_DIR}/framework名" "${SIMULATOR_DIR}/framework名"
#判断build文件夹是否存在,存在则删除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
#打开合并后的文件夹
open "${UNIVERSAL_OUTPUT_FOLDER}"