iOS SDK开发之使用脚本合并模拟器和真机的库

背景

制作SDK的时候,分别使用模拟器合真机编译SDK工程后,Xcode会在Products这个虚拟目录下分别生成模拟器的库和真机的库。
一般的我们会将库进行合并,支持模拟器同时支持真机调试。
合并静态库和动态库的方法的脚本有一些区别,但是区别不大。

合并静态库(xxx.a)

# .a库合并脚本

# 进入到项目主目录的前一级目录下,../ 表示往前返回一级目录。
cd ${PROJECT_DIR}/../
# 创建一个Frameworks的文件夹,用来存放SDK
mkdir -p Frameworks
cd Frameworks
# 创建一个WeSDK的文件夹来存放WeSDK
mkdir -p WeSDK
cd WeSDK

cp ${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/lib${PRODUCT_NAME}.a ./
iphoneosFile=${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PRODUCT_NAME}.a
iphonesimulatorFile=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PRODUCT_NAME}.a
if [ -f "$iphoneosFile" ] && [ -f "$iphonesimulatorFile" ]; then
lipo -create "$iphoneosFile" "$iphonesimulatorFile" -output ./lib${PRODUCT_NAME}.a
fi
cp ${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/include/${PRODUCT_NAME}/*.* ./

合并Framework

直接在制作Framework的工程下,TARGET->Building Phase->"+",添加Run Script,将如下脚本添加到里面。这个脚本里面的路径根据自己的项目可能需要改改路径,文件夹名字什么的。

# Framework库合并脚本

# 进入到项目主目录的前一级目录下,../ 表示往前返回一级目录。
cd ${PROJECT_DIR}/../
# 创建一个Frameworks的文件夹,用来存放SDK
mkdir -p Frameworks
cd Frameworks
# 创建一个WeSDK的文件夹来存放WeSDK
mkdir -p WeSDK
cd WeSDK

# 下面是找到模拟器合真机的打包路径,使用lipo -create命令进行合并。
cp -rf ${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/${PRODUCT_NAME}.framework ./
iphoneosFile=${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PRODUCT_NAME}.framework/${PRODUCT_NAME}
iphonesimulatorFile=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PRODUCT_NAME}.framework/${PRODUCT_NAME}
if [ -f "$iphoneosFile" ] && [ -f "$iphonesimulatorFile" ]; then
lipo -create "$iphoneosFile" "$iphonesimulatorFile" -output ./${PRODUCT_NAME}.framework/${PRODUCT_NAME}
fi

rm -rf ./${PRODUCT_NAME}.framework/_CodeSignature

# 编译完后,在Workspace所在的目录下,有一个Frameworks,存放所有的SDK。

打包ipa去除模拟器的库

模拟器的库是DEBUG环境下使用的,如果上线,值需要真机的库就可以了,模拟器的库就多余了,毕竟线上都是真机使用。包含模拟器的库打包ipa的话会爆粗不允许上传应用市场。

有些第三方的SDK发布的SDK为了兼容模拟器合真机的通用,将模拟器合真机的库可能会合并发布,这样的话上线打包时候需要我们自己将模拟器的库去掉。我们需要在项目里添加一个Run Script脚本来去除所有的模拟器的库:

解决办法:TARGETS->Build Phases->点击加号选择New Run Script Phase->然后复制粘贴下面代码

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
if [[ $APP_PATH != *ArchiveIntermediates* ]]; then
    exit 0
fi
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
 
EXTRACTED_ARCHS=()
 
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
 
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
 
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
 
done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值