在上传App至App Store前,通常会使用Xcode的Validate App功能初步验证一下App是否存在异常。
validate 按钮
最近在审核前验证的时候遇到如下错误:
错误截图
错误提示的大致意思是使用的静态库中含有不支持的x86_64,i386架构。根据提示,应当使用最新版本的Xcode重新打包该静态库,由于各种原因,无法拿到静态库的源码,因此使用Xcode重新打包这条路就GG了,只能另寻他法。度娘一下,大多数人实测有效的方法如下:
在项目Target-Build Phases中新增Run Script,添加以下内容:
# Without further ado, here’s the script. Add a Run Script step to your build steps, put it after your step to embed frameworks, set it to use /bin/sh and enter the following script:
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"
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
这段脚本的大致意思呢,首先查找编译文件夹下的所有framework文件,即我们使用的各种静态库,针对每一个静态库,分离支持的架构的静态库文件,最后合并。
需要注意的是要将该Run Script放置在Embed Frameworks后,否则不会起作用。
顺序截图
重新Archive,再次Validate,成功通过(validate success的绿色大图标呢?)!
SUCCESS!