iOS ipa validate 不通过之Unsupported
2018-08-13 本文已影响123人
Steven_2016
有时第三方提供的framework即支持真机调试,也支持模拟器调试,然而打包提交appStore时,苹果不允许包含有模拟器架构ipa过审。validate ipa时,会出现如下提示:
![](https://img.haomeiwen.com/i1706821/ffe793b24f8c1253.png)
- Unsupported Architectures. The executable for xxx/Frameworks/xxx.framework contains unsupported architectures '[x86_64, i386]'.
An unknown error occurred.
Invalid Segment Alignment. The app binary at 'xxx.app/Frameworks/xxx.framework/GizWifiSDK' does not have proper segment alignment. Try rebuilding the app with the latest Xcode version.
An unknown error occurred.
The binary is invalid. The encryption info in the LC_ENCRYPTION_INFO load command is either missing or invalid, or the binary is already encrypted. This binary does not seem to have been built with Apple's linker.
An unknown error occurred.
解决办法有两种:
- 方案一、向提供framework的第三方反馈,要求剔除掉模拟器架构[[x86_64, i386]
- 方案二、向自己想办法剔除。
如果方案一可以行的通,那就很省事。但万一行不通,那就需要用方法2,亲自处理了。
方案二 也有两种方式
方式一:直接对framework处理,使用lipo命令剔除掉模拟器架构,然后重新link一个新的framework替换项目中的framework;
方式二:使用脚本在项目打包过程中自动剔除模拟器架构,生成不含有模拟器架构的ipa。
方式一的使用是有一个前提:这个framework必须是静态库,具体的方法,请参考 这篇博文。
方式二显然是最好的,即方便在开发过程中使用模拟器调试,也可以控制打包时剔除模拟器架构。建议使用此方法。
如何在工程中添加脚本文件,请参考这篇博文。
脚本内容如下:
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