首页 文章

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

提问于
浏览
193

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

  • 错误ITMS-90087:"Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]'."

  • 错误ITMS-90209:"Invalid segment Alignment. The App Binary at SJAPP.app/Frameworks/Buy.framework/Buy does not have proper segment alignment. Try rebuilding the app with the latest xcode version."(我已经在使用最新版本 . )

  • 错误ITMS-90125:"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."

  • 警告ITMS-90080:"The Executable Payload/..../Buy.framework is not a Position Independent Executable. Please ensure that ur build settings are configured to create PIE executables."

15 回答

  • 0

    我有同样的问题 . 添加给定的运行脚本后,即使它无法正常工作 . 这是Xcode相关的问题 . 我使用的是Xcode版本9.0,但最新版本是9.2 .

    所以我安装了最新的Xcode(9.2)并且它有效 .

  • 81

    对我有用的简单解决方案是

    1-从嵌入式框架中删除框架 . 2-添加框架作为链接框架

    完成了!

  • 34

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

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

    Daniel Kennett想出了a nice solution and provides this 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
    

    我用过它并且效果很好 .

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

  • 9

    由pAkY88给出的Answer,但我在https://stackoverflow.com/a/35240555/5272316遇到了与Mario A Guzman相同的问题:一旦我们切断了未使用的架构,我们每次都可以重新嵌入二进制文件 . 想法是 - 在构建存档时只删除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”),这个脚本只是从胖二进制文件(如果存在)中删除i386和x86_64片 .

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

  • 2

    您的框架包含 ARMx86 代码,允许您在设备或模拟器中使用它 . 如果您打算将应用程序提交到App Store,请运行以下脚本以从二进制文件中删除非活动代码 .

    1.在Project Navigator中选择目标,然后单击项目编辑器顶部的Build Phases .

    2.从Editor菜单中,选择Add Build Phase,然后选择Add Run Script Build Phase(或单击Build Phases编辑器左上角的按钮) .

    3.展开刚刚添加的新Run Script构建阶段旁边的显示三角形 . 在脚本编辑器框中,粘贴以下内容:bash

    $ / $ /“YourframeworkName.framework”/strip-frameworks.sh

  • 0

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

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

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

    此操作将框架过滤为有效体系结构列表(code) .

    设置复制框架构建阶段

    来自Carthage building for iOS steps

    在应用程序目标的“构建阶段”设置选项卡上,单击“”图标并选择“新建运行脚本阶段” . 创建一个运行脚本,在其中指定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 .

  • 338

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

    enter image description here

  • 5

    如果您正在使用 Carthage ,请确保您的 Embed Frameworks Build StepCarthage copy-frameworks 之前


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

    • 您可以像往常一样在“链接库”中使用它 .

    • However 你必须 also 明确地将其添加到"Embed Frameworks"中(即使这看起来毫无意义,因为只有在"Embed Frameworks"时它才能完美地运行),

    • 并将其放在copy-frameworks中

    • 并确保复制框架为 after "Embed Frameworks"

  • 0

    我会在这里加上我的2美分(以不太可怕的方式:-) . 我遇到了很多来自供应商的胖库(出于某种原因)通过将它们添加到Apple记录的 Frameworks 目录中而无法正常工作 . 我们能够使它们工作的唯一方法是将 .framekwork 权限拉到项目目录中,并在Build Settings中手动链接 Embedded FrameworksLink Binary with Libraries . 这似乎没有任何问题,但是,与任何胖库一样,它们带有无关的模拟器架构 i386x86_64 以及 arm 架构 .

    检查胖库架构的快速方法是

    $ cd 'Project_dir/Project'
    $ lipo -info 'YourLibrary.framework/YourLibExec`
    

    哪个应该吐出像这样的输出

    Architectures in the fat file: YourLibrary.framework/YourLibExec are: i386 x86_64 armv7 arm64
    

    这确认您需要在iTunesConnect Archival上传之前从您的框架中获取"trim the fat"(即 i386x86_64 ),这不允许这些体系结构(因为它们不支持iOS) .

    现在,这里的所有答案(或至少一些答案)都提供了这些精彩的运行脚本,我确信它们运行得非常好,但前提是您的框架位于 Frameworks 目录 . 现在,除非你是一个shell脚本垃圾,那些没有修改的脚本将不适用于我上面解释的场景 . 但是,有一种非常简单的方法可以摆脱框架中的 i386x86_64 架构 .

    • 在项目目录中打开终端 .

    • 直接将目录更改为 .framekwork ,就像

    cd YourProjectDir/YourProject/YourLibrary.framework

    • 运行如下所示的一系列命令 -

    $ mv YourLibrary YourLibrary_all_archs

    $ lipo -remove x86_64 YourLibrary_all_archs -o YourLibrary_some_archs

    $ lipo -remove i386 YourLibrary_some_archs -o YourLibrary

    $ rm YourLibrary_all_archs YourLibrary_some_archs

    这里需要注意的一些事项 - 必须为每个要删除的体系结构执行一次 lipo -remove . lipo 不修改输入文件,它只生成一个文件,因此您必须为 x86_64i386 运行 lipo -remove 一次 . 上面的命令只是通过首先重命名可执行文件然后最终删除所需的arch,然后清理左边的文件来完成 . 就是这样,您现在应该看到Application Loader Archival上传到iTunesConnect的绿色复选标记 .

    Things to keep in mind :上述步骤只应在 生产环境 构建时完成,因为 .framework 将从模拟器架构中剥离,模拟器上的构建将停止工作(这是预期的) . 在开发环境中,不需要从 .framework 文件中删除体系结构,因为您希望能够在模拟器和物理设备上进行测试 . 如果您的胖库位于项目的 Frameworks 文件夹中,请查看接受的答案 .

  • 29

    即使在添加脚本并更新框架几次后,我也遇到了同样的问题 .

    确保在xCode中,在嵌入之后添加脚本 . 我想我在嵌入式框架之前不小心移动了脚本 .

    enter image description here

    注意:我有xCode 9.1

  • 2

    我从Build Settings - Valid Architectures - Release中删除了架构i386和x64_86,一切正常 .

    enter image description here

    现在唯一的问题是,您无法在 SIMULATOR 上运行 RELEASE 构建以进行测试 . 但是,就像移除拱门一样容易,如果需要,可以将它们添加回去 .

  • 106

    通过从pAky88的答案稍微修改运行脚本并在嵌入框架后执行,我解决了这个问题 . 另外,请务必取消选中“仅在安装时运行脚本”框 .

    /usr/local/bin/carthage copy-frameworks
    
    #!/usr/bin/env bash
    
    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"
    
    if [ ! -f "${FRAMEWORK_EXECUTABLE_PATH}" ]; then
    continue
    fi
    
    if xcrun lipo -info "${FRAMEWORK_EXECUTABLE_PATH}" | grep --silent "Non-fat"; then
    echo "Framework non-fat, skipping: $FRAMEWORK_EXECUTABLE_NAME"
    continue
    fi
    
    echo "Thinning framework $FRAMEWORK_EXECUTABLE_NAME"
    
    EXTRACTED_ARCHS=()
    
    for ARCH in $ARCHS
    do
    echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
    xcrun lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
    EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
    done
    
    echo "Merging extracted architectures: ${ARCHS}"
    xcrun 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
    
  • 0

    使用以下步骤从框架中删除 [x86_64, i386] . [x86_64, i386] 用于模拟器 .

    • 打开 Terminal

    • 打开你的项目拖拽相应框架到终端的路径

    示例: cd /Users/MAC/Desktop/MyProject/Alamofire.framework

    • 在下面的命令中设置您的Framework名称并运行

    lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire

    • 现在再次打开您的项目,清理,构建和运行以及创建存档...
  • 0

    此错误(ITMS-90240)也可能由静态(.a)库引起 . 下面是一个剥离多余架构的脚本 . 在Xcode中,将其添加到Target> BuildPhases>单击并选择Run Script . 然后将其粘贴到脚本框中 .

    该脚本搜索.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
    
  • 3

    感谢以上所有答案 . 这是使用swift 4.2的脚本

    APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
    FRAMEWORK_NAME="Your_Framework_Name.framework"
    # Check if Framework is present.
    FRAMEWORK_LOCATION=$(find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d)
    if [ -z $FRAMEWORK_LOCATION ]; then
    echo "Couldn't find Your_Framework_Name.framework in $APP_PATH. Make sure 'Embed Frameworks' build phase is listed before the 'Strip Unused Architectures' build phase."
    exit 1
    fi
    # This script strips unused architectures
    find "$APP_PATH" -name "$FRAMEWORK_NAME" -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
    

相关问题