app上架时如果SDK里是支持模拟器架构的,苹果是不让上架的。甚至于,打包成功后,导出为测试包都会报错。为了正常上架和测试,我们需要将SDK里的模拟器架构给删除。
方法一: xcode里添加脚本,打包自动删除模拟器架构
这种方法不会删除SDK源文件的架构,只有打的包被删除,不会影响我们平时在模拟器上调试,所以推荐这种方式。
选择添加 New Run Script Phase
然后添加一段脚本,这样我们打包的时候就会自动将SDK里的支持模拟器架构删除掉了。
#!/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
打开终端
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架构。
在终端里 cd 到这个framework的上一层文件夹路径下,回车。
粘贴下面这段脚本到终端里执行。
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find . -name '*.framework' -type d | while read -r FRAMEWORK
do
#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"
# 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
执行后终端显示如下则表示删除成功
此时再查询framework支持的架构,只剩下armv7和arm64了。
可能出现的问题:
在实际操作中,有可能出现有些framework不能执行成功。
就拿AlipaySDK举例,在对AlipaySDK执行这段脚本时发生了错误。
浏览一下错误输出,大致意思为找不到Info.plist文件,也找不到可执行文件路径。我们来看一下它的文件,发现问题出在了plist文件名上,脚本里是查找名为Info.plist的文件,但是AlipaySDK的plist名称为AlipaySDK-inside-Info.plist
我们先将AlipaySDK-inside-Info.plist文件拷贝出来,完成操作后再拿回来。
下面先将AlipaySDK-inside-Info.plist改名为Info.plist
打开这个Info.plist文件
此时文件里的 Executable file 对应的值为 ${EXECUTABLE_NAME} ,我们需要把它改为真正的可执行文件名称,也就是下图中的AlipaySDK
修改完毕如下图:
再次执行脚本成功!