ios开发疑难杂症

iOS开发 删除framework里支持模拟器的架构

2019-11-19  本文已影响0人  夜凉听风雨

app上架时如果SDK里是支持模拟器架构的,苹果是不让上架的。甚至于,打包成功后,导出为测试包都会报错。为了正常上架和测试,我们需要将SDK里的模拟器架构给删除。

方法一: xcode里添加脚本,打包自动删除模拟器架构

这种方法不会删除SDK源文件的架构,只有打的包被删除,不会影响我们平时在模拟器上调试,所以推荐这种方式。

图片.png

选择添加 New Run Script Phase


图片.png

然后添加一段脚本,这样我们打包的时候就会自动将SDK里的支持模拟器架构删除掉了。

图片.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

图片.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架构。

图片.png

在终端里 cd 到这个framework的上一层文件夹路径下,回车。


图片.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

执行后终端显示如下则表示删除成功


图片.png

此时再查询framework支持的架构,只剩下armv7和arm64了。

图片.png
上一篇下一篇

猜你喜欢

热点阅读