错误 ITMS-90085:“二进制文件中没有架构。 Lipo 未能检测到捆绑可执行文件中的任何架构。”

ERROR ITMS-90085: “No architectures in the binary. Lipo failed to detect any architectures in the bundle executable.”

我们已经构建了一个 Xamarin 应用程序(iOS,Android),其中包含多个本机绑定。该应用程序在设备和模拟器上运行良好,我们能够毫无问题地构建存档(显然)。

问题是当我们想要将构建上传到应用商店时(使用应用加载器或 xcode 7.3.1),我们收到以下错误:

ERROR ITMS-90085: “No architectures in the binary. Lipo failed to detect any architectures in the bundle executable.”

运行 lipo -info 在应用程序上产生以下响应:

Architectures in the fat file: NameOfMyApp.iOS.app/NameOfMyApp.iOS are: armv7 arm64

在发布此问题之前,我们已经彻底搜索了答案并确保了以下内容:

如果有人有想法,我们将不胜感激!

谢谢, A.

原来我们在项目中做了一些原生绑定。 在其中一个绑定中,我们在项目的根目录中包含了一个框架,该框架是一个文件夹,其中包含包含 lib.a 的子文件夹。 事实证明,在编译时,整个框架文件夹结构被复制到生成的 IPA 中,这导致了问题。 解决方案是简单地提取 lib.a 并将其移动到项目的根目录并删除框架文件夹。 生成的 IPA 不再有框架文件夹,提交顺利通过。

当您匆忙而忘记将 Build Environment 更改为 Generic iOS Device for Archiving 时,有时可能会出现此错误!

Find image here!

我最近 运行 出于完全不同的原因陷入此错误。在提交应用商店之前,我们使用此 从我们的应用中删除未使用的架构。

问题是,如果您包含手表应用程序并使用 Xcode 10 进行构建,那么此脚本会做完全错误的事情!它在 ARCHS 变量中查找所有架构并从胖二进制文件中删除所有其他架构,问题是

  • ARCHS 不包括手表架构,并且
  • 从 Xcode10 开始,watch 二进制文件很胖(由于新 watch)

在 XCode 9 中,脚本会跳过 watch 内容,但现在它会错误地删除它们。

我通过更改脚本以仅删除模拟器架构来修复错误。

EXTRACTED_ARCHS=()
GOOD_ARCHS=()

PRESENT_ARCHS=($(lipo -archs "$FRAMEWORK_EXECUTABLE_PATH"))

if [[ "${#PRESENT_ARCHS[@]}" -lt 2 ]]
then
    echo "Framework is not a Fat binary, skipping..."
    continue
fi

for ARCH in "${PRESENT_ARCHS[@]}"
do
    if [[ "$ARCH" != x86_64 && "$ARCH" != i386 ]]
    then
        echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
        lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
        GOOD_ARCHS+=("$ARCH")
        EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
    fi
done

在我的案例中,错误有点误导。它与体系结构无关,它只是没有找到二进制文件本身。

我正在使用 add_library 通过 CMake 生成一个应用程序扩展。 CMake 将扩展的可执行文件从 MyExtension 重命名为 libMyExtension.so.

因为“CFBundleExecutable 必须匹配包目录的名称减去其扩展名。”,我不得不调整我的 CMakeLists.txt 文件以防止扩展的可执行文件是重命名:

set_target_properties(${APPEX_NAME} PROPERTIES
        XCODE_ATTRIBUTE_EXECUTABLE_SUFFIX ""
        XCODE_ATTRIBUTE_EXECUTABLE_PREFIX ""
)

就我而言,

将各个框架的"Embed & Sign"转"Do not embedded"

然后重新启动Xcode。无需使用 pod update 或 pod disintegrate。