提交到App Store问题:不受支持的体系结构x86

所以我正在尝试使用shopify API。 当我存档应用程序并validation它时,则没有问题,但是当我将其提交给应用程序商店时,它给了我以下问题。

  1. 错误ITMS-90087:“不支持的体系结构。您的可执行文件包含不受支持的体系结构”[x86_64,i386]“。
  2. 错误ITMS-90209:“无效的段alignment,SJAPP.app/Frameworks/Buy.framework/Buy的应用程序二进制文件没有正确的段alignment,请尝试使用最新的xcode版本重新构build应用程序。 (我已经在使用最新版本了。)
  3. 错误ITMS-90125:“二进制文件无效,LC_ENCRYPTION_INFO加载命令中的encryption信息缺失或无效,或者二进制文件已经被encryption,这个二进制文件似乎没有用苹果公司的链接程序编译。
  4. 警告ITMS-90080:“可执行的有效载荷/…./ Buy.framework不是位置独立的可执行文件,请确保您的编译设置被configuration为创buildPIE可执行文件。

如果使用迦太基 ,注意2017年,你只是忘了点击复制框架,和/或你不小心把它留在embedded框架。

问题是Buy框架包含模拟器(x86_64)和实际设备(ARM)的内部版本。

当然,不允许你向App Store提交一个不支持的体系结构的二进制文件,所以解决的办法是在提交之前手动从最终的二进制文件中删除不需要的体系结构。

Daniel Kennett提出了一个很好的解决scheme,并提供了这个脚本来添加到构build阶段:

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 

我用它,它完美的工作。

编辑:确保你看看由Varry发布的修改后的脚本,因为这个有一些小问题。

如果你使用迦太基,那么你可能会遇到这个问题,因为该项目是:

  • 缺lesscarthage copy-frameworks构build阶段。
  • 或者构build阶段不包括所有的框架(不完整的列表)。

此操作将框架过滤为有效体系结构(代码)的列表。

设置复制框架构build阶段

从迦太基大厦的iOS步骤 :

在应用程序目标的“构build阶段”设置选项卡上,单击“+”图标并select“新build运行脚本阶段”。 创build一个运行脚本,在其中指定您的shell(例如:bin / sh),将以下内容添加到shell下面的脚本区域:

/usr/local/bin/carthage copy-frameworks

并将path添加到您要在“input文件”下使用的框架,例如:

$(SRCROOT)/Carthage/Build/iOS/Box.framework $(SRCROOT)/Carthage/Build/iOS/Result.framework $(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework

此脚本解决了由通用二进制文件触发的App Store提交错误,并确保在归档时复制必要的与位码相关的文件和dSYM。

由pAkY88给出的答案是有效的,但是我遇到了与https://stackoverflow.com/a/35240555/5272316中的; Mario A Guzman相同的问题:一旦我们切断了未使用的体系结构,我们就不能再运行脚本,因为它试图删除不存在切片,因为xcode不会每次都重新embedded二进制。 想法是 – build立档案,只是删除i386和x86_64切片,所以我修改脚本:

 echo "Target architectures: $ARCHS" APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" 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" 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 

如果不运行模拟器(这意味着目标文件夹不像“Debug-iphonesimulator”),这个脚本简单地从fat二进制(如果它们存在的话)删除i386和x86_64切片。

对不起,我对shell脚本不熟悉,所以可能有人可以把它写得更优雅一些。 但是它工作)

我通过从embedded式二进制文件部分(Xcode目标 – >常规选项卡)中删除一个框架(优秀的SVProgressHUD)来解决ITMS-90080错误。

在这里输入图像说明

如果您使用的是Carthage确保您的Embed Frameworks Build StepCarthage copy-frameworks


在一些不寻常的情况下(例如:Lottie-iOS框架):

  • 像往常一样,你只需在“链接库”中就可以得到它。

  • 然而,你也必须明确地将它添加到“embedded框架”(即使这看起来没有意义,因为只有在“embedded框架”中才有效)

  • 把它放在复制框架中

  • 确保复制框架 “embedded框架”之后

这个错误(ITMS-90240)也可能由静态库(.a)引起。 inheritance人删除多余的体系结构的脚本。 在Xcode中将此添加到Target> BuildPhases>单击+并selectRun Script。 然后将其粘贴到脚本框中。

该脚本search.a文件,检查它是否包含违规的体系结构,然后如果它确实生成没有该体系结构的新的.a文件。

对于macOS:

 APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" STRIPARCHS="armv7 armv7s arm64" for t in $STRIPARCHS do if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ; fi done exit 0 

对于iOS:

 APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" STRIPARCHS="x86_64 i386" for t in $STRIPARCHS do if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ; fi done exit 0