为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

qq_花开花谢_0 2019-08-06 13:08:19

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

所以我想尝试使用shopify API。当我存档应用程序并验证它然后没有问题但是当我将它提交到应用商店时它会给我以下问题。

  1. 错误ITMS-90087:“不支持的体系结构。您的可执行文件包含不受支持的体系结构'[x86_64,i386]'。”

  2. ERROR ITMS-90209:“无效的段对齐.SJAPP.app/Frameworks/Buy.framework/Buy上的应用程序二进制文件没有正确的段对齐。尝试使用最新的xcode版本重建应用程序。” (我已经在使用最新版本了。)

  3. 错误ITMS-90125:“二进制文件无效.LC_ENCRYPTION_INFO加载命令中的加密信息丢失或无效,或者二进制文件已加密。此二进制文件似乎不是使用Apple的链接器构建的。”

  4. 警告ITMS-90080:“可执行的有效负载/ $ / Buy.framework不是位置无关的可执行文件。请确保将您的构建设置配置为创建PIE可执行文件。”


查看完整描述

3 回答

?
萧十郎

问题是Buy框架包含模拟器(x86_64)和实际设备(ARM)的构建。

当然,您不允许向App Store提交不支持的体系结构的二进制文件,因此解决方案是在提交之前“手动”从最终二进制文件中删除不需要的体系结构。

Daniel Kennett提出了一个很好的解决方案,并提供此脚本以添加到构建阶段:

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 FRAMEWORKdo
    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

我用过它并且效果很好。

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


查看完整回答
反对 回复 2019-08-06
?
慕森王

一旦我们切断了,我们不能运行任何脚本更因为它会尝试删除未使用的架构不是现有的切片,因为xcode每次都不会重新嵌入二进制文件。想法是 - 在构建存档时只删除i386和x86_64切片,所以我修改了脚本:

echo "Target architectures: $ARCHS"APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORKdoFRAMEWORK_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 directorycase "${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
    ;;esacecho "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")done

如果不是为模拟器运行(这意味着目标文件夹不像“Debug-iphonesimulator”),这个脚本只是从胖二进制文件(如果存在)中删除i386和x86_64片。

对不起,我不熟悉shell脚本,所以可能有人可以用更优雅的方式编写它。但它有效)


查看完整回答
反对 回复 2019-08-06
?
墨色风雨

如果您使用的是Carthage,那么您可能会遇到此问题,因为该项目是:

  • 缺少carthage copy-frameworks构建阶段。

  • 或者构建阶段不包括所有框架(不完整列表)。

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

设置复制框架构建阶段

来自Carthage建筑的iOS步骤

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


/usr/local/bin/carthage copy-frameworks


并在“输入文件”下添加要使用的框架的路径,例如:


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


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


查看完整回答
反对 回复 2019-08-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信