iOS开发 删除framework里支持模拟器的架构
2019-11-19 本文已影响0人
夜凉听风雨
app上架时如果SDK里是支持模拟器架构的,苹果是不让上架的。甚至于,打包成功后,导出为测试包都会报错。为了正常上架和测试,我们需要将SDK里的模拟器架构给删除。
方法一: xcode里添加脚本,打包自动删除模拟器架构
这种方法不会删除SDK源文件的架构,只有打的包被删除,不会影响我们平时在模拟器上调试,所以推荐这种方式。
![](https://img.haomeiwen.com/i2541004/b2b3bdfe9afdfbd4.png)
选择添加 New Run Script Phase
![](https://img.haomeiwen.com/i2541004/778032a98808ef2e.png)
然后添加一段脚本,这样我们打包的时候就会自动将SDK里的支持模拟器架构删除掉了。
![](https://img.haomeiwen.com/i2541004/b8c81ad302a856cb.png)
#!/bin/sh
# Strip invalid architectures
strip_invalid_archs() {
binary="$1"
echo "current binary ${binary}"
# Get architectures for current file
archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)"
stripped=""
for arch in $archs; do
if ! [[ "${ARCHS}" == *"$arch"* ]]; then
if [ -f "$binary" ]; then
# Strip non-valid architectures in-place
lipo -remove "$arch" -output "$binary" "$binary" || exit 1
stripped="$stripped $arch"
fi
fi
done
if [[ "$stripped" ]]; then
echo "Stripped $binary of architectures:$stripped"
fi
}
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# 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"
strip_invalid_archs "$FRAMEWORK_EXECUTABLE_PATH"
done
方法二:终端运行脚本,删除指定文件夹内的SDK模拟器架构
这种方式会删除原SDK的架构,所以适合用在对此SDK做二次封装,提供给如跨平台的前端使用。
我下载了一个网易云信的SDK
![](https://img.haomeiwen.com/i2541004/864e0f4b72e66eb5.png)
打开终端
cd /Users/apple/Downloads/NIMSDK/NIMSDK.framework
切换到该SDK目录下
lipo -info NIMSDK
查询这个framework支持的CPU架构
可以看到支持i386 x86_64 armv7 arm64这四种架构
模拟器32位处理器测试需要i386架构,
模拟器64位处理器测试需要x86_64架构,
真机32位处理器需要armv7,或者armv7s架构,
真机64位处理器需要arm64架构。
![](https://img.haomeiwen.com/i2541004/e5f34c92582f6dc9.png)
在终端里 cd 到这个framework的上一层文件夹路径下,回车。
![](https://img.haomeiwen.com/i2541004/acf137e0150c8584.png)
粘贴下面这段脚本到终端里执行。
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find . -name '*.framework' -type d | while read -r FRAMEWORK
do
if ( "$FRAMEWORK"="/Users/builder/workspace/PIVOT-iOS-5.0-Build-backup/OneSource-CommonLib/iOS/CommonLibrary/ThirdParty/TSLAsciiCommands.framework" )
then
echo $FRAMEWORK
else
#FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_NAME=$(/usr/libexec/PlistBuddy -c "Print :CFBundleExecutable" "$FRAMEWORK/Info.plist")
echo $FRAMEWORK_EXECUTABLE_NAME
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")
FRAMEWORK_TMP_PATH="$FRAMEWORK_EXECUTABLE_PATH-tmp"
fi
# remove simulator's archs if location is not simulator's directory
case "${TARGET_BUILD_DIR}" in
*"iphonesimulator")
echo "No need to remove archs"
;;
*)
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "i386") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "i386" "$FRAMEWORK_EXECUTABLE_PATH"
echo "i386 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "x86_64") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "x86_64" "$FRAMEWORK_EXECUTABLE_PATH"
echo "x86_64 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
;;
esac
echo "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")
done
执行后终端显示如下则表示删除成功
![](https://img.haomeiwen.com/i2541004/8f5f9aacdaa045da.png)
此时再查询framework支持的架构,只剩下armv7和arm64了。
![](https://img.haomeiwen.com/i2541004/4481809e1241dc16.png)