如何在 Xcode 11 中修复“IPA 处理失败”错误?

49

当我尝试使用“分发APP”选项创建IPA文件时,出现了“IPA处理失败”的错误。

我已经检查了日志文件:IDEDistribution.standard.log文件。

2019-08-06 18:36:52 +0000 警告:配置问题:平台 iPhoneSimulator.platform没有任何非模拟器SDK;忽略它 扫描IPA... 2019-08-06 18:36:52 +0000 断言失败: 在otool输出中预期4个archs: /var/folders/4t/rpjk7pd55t16jfrd32y98gf0lb2t68/T/IDEDistributionOptionThinning.~~~a4cZJc/Payload/demo.app/Frameworks/AppAuth.framework/AppAuth: Mach头文件 魔数 cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 23
3680 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS 装载命令 0


1
在更新AppAuth.framework之后,我能够解决这个问题。 - R.B Niranjan
我刚刚解决了这个问题,原因是一个依赖目标使用了 Alamofire 框架的错误/损坏链接。我通过在 Build Phases 中删除该目标中所有 Alamofire 的依赖项,并从项目中删除该框架来解决了这个问题。然后我再次添加了该框架,这解决了我的问题。 - Catluc
就像@Tonny Xu提到的那样。解决方案在这里 - Denny
2
请确保您的二进制框架和Pod框架路径未包含在“Build Phases -> Copy Bundle Resource”中。 - Kuvonchbek Yakubov
在搭载 M1 芯片的 Mac 上使用 Xcode 12 时遇到了同样的问题。但我不确定这对您是否也适用:将 iOS 部署目标从 10.0 切换到 13.0 对我解决了问题。(同时更新项目格式为 Xcode 12.0 兼容,但我不知道这是否必要或相关)。我在这里找到了答案:https://dev59.com/IFEG5IYBdhLWcg3wgv82#64932592 - Sebastian
显示剩余6条评论
16个回答

58

我遇到了相同的问题。我使用了这个脚本来解决这个问题。请按照相同的步骤操作。

enter image description here

构建阶段 -> 加号按钮 -> 创建新的运行脚本阶段

 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"

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

我已经按照说明完成了相同的操作。构建成功创建。但是当我在真实设备上安装它时,应用程序已经安装,但应用程序图标被禁用。我没有收到任何错误信息。无法打开应用程序。 - Aman Gupta
最重要的是记住将此运行脚本添加到BuildPhases的最后。特别是在“嵌入框架”之后,以确保从所有框架中剥离不需要的架构。 - atulkhatri

49

1. 取消勾选 "从位码重建", 2. 快快快地点击下一步。(速度也很重要。)

输入图像描述

如果没有这样做,将显示“IPA 处理失败”。 输入图像描述


谢谢,伙计。我的应用程序中有React Native框架,它们不支持位码。 - Booharin
我已经按照说明完成了相同的操作。构建成功创建。但是当我在真实设备上安装它时,应用程序已经安装,但应用程序图标被禁用。我没有收到任何错误信息。无法打开应用程序。 - Aman Gupta
@AmanGupta,你能告诉我你是否可以使用开发证书在真实设备上调试你的应用程序吗?我建议你可以在真实设备上调试你的应用程序以查找更多的日志记录。 - Zgpeace
1
无法取消勾选。在取消勾选之前,IPA 处理失败屏幕就会出现。 - Mihir Oza
这是我见过的最有趣的答案之一,哈哈,因为它实际上起作用了。 - Jalil
显示剩余7条评论

17

您应该检查 Xcode > build 阶段下的 嵌入框架(Embed Frameworks)

如果您的框架在此处被引入,则无法在您的框架中使用 i386\x86_64。因为 嵌入框架(Embed Frameworks) 会被复制到应用程序中。为了控制应用程序的大小,嵌入框架(Embed Frameworks) 中的框架必须是最精简的。

您可以使用 链接二进制库(Link Binary With Libraries) 来引入您的框架,如此处所述:https://github.com/Carthage/Carthage/issues/1046

请注意,您需要添加一个新的运行脚本,并将您的框架添加到其中,否则它将会崩溃。enter image description here


14

为了解决我这边类似的问题,我使用了以下方法:

  • 在应用程序目标中,我进入了Build Phases
  • 嵌入框架嵌入应用扩展部分之后,我添加了一个运行脚本,其中包含以下脚本:
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
我从这里取得的脚本:https://medium.com/@maximbilan/ios-submission-unsupported-architectures-issues-733917a98cc3,感谢Daniel Kennet!请注意,该脚本也可能导致编译错误。如果出现这种情况,请查看此处的解决方案。在我的设备上,我还注意到当在开发设备/模拟器上本地编译应用程序时,必须关闭此脚本。希望这有所帮助!

我正要写完全相同的答案 :) - Morten Holmgaard
这个加上从copy-carthage步骤中删除所有静态库就解决了问题。谢谢! - Maciej Stramski

8

当在 Xcode 11 中进行存档时,似乎不允许使用i386或x86_64架构的动态库。我通过从提到的框架中删除这些体系结构来解决了这个问题。


2
实际上,我通过添加一个脚本来删除模拟器二进制文件来解决了这个问题。 - Tonny Xu
@TonnyXu 我有同样的问题,你能给我提供脚本吗? - JhonnyTawk
3
@Varrry在这篇stackoverflow文章中提供的脚本解决了我的问题,成功移除了架构。 - Lean van Heerden

6

我必须取消选中"Rebuild from bitcode"


这对我立即起作用了 - 谢谢!我不知道其根本原因是什么(可能与其他架构有关),但这似乎值得一试。 - Benjohn
有没有一种方法可以不用点击就完成这个操作?我的电脑太容易出问题了。 - Martin
是的,那样可以运行。但在快速的计算机上,错误会更快地出现,您无法点击复选框。您需要尝试十几次。肯定有更好的方法。 - Martin
如果禁用了 Bitcode,Firebase Crashlytics 将无法工作。 - mhammad alkhalaf

4

针对使用M1芯片(硅)的用户:

完全退出Xcode(从菜单栏关闭并退出),并删除现有的存档。

转到Finder -> 应用程序。

右键单击Xcode,选择“获取信息”。

勾选Rosetta。

enter image description here

再次尝试打开Xcode。


3
我必须选择“不嵌入”框架来解决这个问题。

3
我们通过将我们应用中使用的所有框架的 Always Embed Swift Standard Libraries 设置为NO来解决了这个问题。

谢谢。将其设置为默认值“NO”使其正常工作并成功导出ipa文件。我猜测嵌入框架中的Swift库可能会导致应用程序无法启用整个应用程序的位码。 - DragonCherry

2
在我的情况下,启用Bitcode导致了问题。前往“构建设置” -> “启用Bitcode”,将其设置为“NO”。再次尝试归档,应该可以正常工作。

如果禁用了 Bitcode,Firebase Crashlytics 将无法工作。 - mhammad alkhalaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接