如何调试“无效的捆绑包”错误,该错误仅在提交到应用商店后发生。

49

我的应用中有很多框架。在adhoc/企业版发布时,应用程序工作良好。只有当我提交到应用商店进行TestFlight测试时,才会从苹果收到以下错误邮件:

亲爱的开发者,

我们发现您最近提交的“我的应用名称”存在一个或多个问题。为了处理您的提交,必须纠正以下问题:

无效的Bundle - 您的应用引用了一个或多个动态库,但这些动态库不在dylib搜索路径中。

一旦这些问题得到解决,您就可以重新提交已经纠正的二进制文件。

祝好,

App Store团队

这里没有具体信息。我该如何调试呢?


https://dev59.com/_ZHea4cB1Zd3GeqPmDMO#33904053 - matt
13个回答

42
从苹果开发技术支持中获得的答复表明这是苹果方面的一个错误。下面是建议的解决方法,但对我没有用:

为了诊断此问题,您应该从Xcode导出您要发送到App Store的IPA文件。由于IPA文件是zip文件,您可以通过右键单击并选择“打开方式”>“存档实用程序”来解压缩它。您应该在未压缩的文件夹结构中找到您的主可执行文件,并在命令行上运行otool以查看库列表:otool -L

您得到的路径列表应与您在IPA中找到的内容相匹配。您所有的库都应该以@rpath开头。将此列表中的所有内容与未压缩的IPA文件夹中的内容进行简单比较,应该能够找出缺少的内容。

一旦您知道缺少了什么,就转到Xcode的构建阶段设置。应该有一个构建阶段用于复制文件或嵌入框架,其中包括缺少的库-您只需将该库添加到列表中即可。如果您没有看到这些构建阶段中的任何一个,请通过添加新的复制文件构建阶段、将目标设置为Frameworks并将库添加到列表中(确保选中“在复制时签名”)来重新创建它。

如果您在主二进制文件中没有发现任何缺失内容,请确保对可能存在的任何其他二进制文件(例如用于watchOS应用或iOS应用扩展的文件)进行相同的搜索。

如果您发现所有框架都在此构建阶段中,请查看应用程序目标的“常规”页面上的“嵌入式二进制文件”部分,并告诉我是否看到多个../级别与您发现丢失的二进制文件相邻。

请告诉我它是否对您有用!


2
@Taha Selim Bebek,你在哪里找到ipa文件? - gkeenley

15

当我上传一个带有手表支持的应用到应用商店时,遇到了同样的问题。

通过第一个答案中的提示,使用otool -L分析ipa或xcarchive中的二进制文件,我成功地解决了这个问题。然而,问题并不在我的框架(位于@rpath),而是在Swift库中。我注意到libswiftWatchKit.dylib在框架文件夹中丢失了。

对我有效的解决方案非常简单,只需要在手表应用程序的构建设置中设置EMBEDDED_CONTENT_CONTAINS_SWIFT=YES(或手表应用程序扩展,但不要同时设置)。之后,所有必要的Swift库将被正确复制到存档中的手表应用程序路径,并且上传到应用商店也会正常工作。

显然,如果您只在主应用程序文件夹中提供必要的Swift库,则手表应用程序可以正常运行且上传也能通过。


2
我有同样的问题,但是设置 EMBEDDED_CONTENT_CONTAINS_SWIFT 对我没有任何作用。我在这里发布了:https://dev59.com/XOk6XIcBkEYKwwoYAfO1 - xaphod
4
在XCode 8中,它已更改为“ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES”。 - victor.vasilica

14

在将自定义的Swift框架添加到我的项目后,我在上传应用程序到iTunes连接器后收到了这封电子邮件。

我从iTunes Store收到了这封电子邮件:

无效的捆绑包 - 您的应用程序引用了一个或多个动态库,但这些库未出现在dylib搜索路径中。

对于这个问题,解决方法很简单:

第一步:确保在您的目标的常规选项卡下的嵌入式二进制文件中添加了您的自定义框架输入图像描述

第二步:在构建设置下,

主项目目标设置始终嵌入Swift标准库=是

并为自定义框架目标设置始终嵌入Swift标准库=否

这解决了我的问题,我能够将二进制文件上传到iTunes Connect

参考


这个答案是正确的,可以让你走上正轨。在我的情况下,我必须将所有的CocoaPods链接到Linked Frameworks中(但是你不能将CocoaPods放入嵌入式二进制文件中)。但是你可以将自己应用程序的自定义框架放入嵌入式二进制文件中,然而对于我来说,在提交到应用商店时并不需要这样做。 - DaWiseguy
手动链接到一个调试版本的框架对于发布二进制文件来说不是错误的吗? - Gomino
1
@Gomino 这仅用于演示目的。必须遵循所有最佳实践。 - Mohammad Zaid Pathan
好的@ZaidPathan,但是如何根据您的构建配置链接正确的目标框架? - Gomino
文档中:通过单击图5中突出显示的添加图标,将框架目标添加到嵌入式二进制文件部分。不要从Finder中拖入框架。可能的解释是:当您拖动时,Xcode会使用框架的绝对路径。该绝对路径特定于特定的配置/构建。您不希望它特定于构建/配置。相反,您希望它仅特定于应用程序目标及其与框架的关系 - 不涉及任何配置/路径。 - mfaani

8
尝试了以上所有解决方案,但都对我无效。最近在Xcode 10.1中遇到了这个问题,而且我的所有框架都被正确引用(执行了otool -L并且一切都排列整齐)。看起来苹果的验证流程有些变化,可能是一个bug,也可能不是苹果的问题,但是我之前的所有构建都上传和验证通过了,而且我自那以后没有添加任何新的框架。在将二进制文件上传到iTunesConnect时,我会看到以下错误:
“Invalid Bundle”-您的应用程序引用了一个或多个动态库,但它们不存在于dylib搜索路径中。
“Invalid Bundle”-应用程序使用Swift,但其中一个二进制文件无法链接到它,因为找不到它。请检查应用程序包是否正确嵌入了Swift标准库,使用“始终嵌入Swift标准库”构建设置,并且每个使用Swift的二进制文件都具有正确的搜索路径,使用“Runpath Search Paths”构建设置。 我的解决方案:
  • 经过数天的调试,对我有用的方法是在从Xcode组织器上传存档时禁用'为iOS内容包括位码'。似乎这个选项会修改二进制文件,导致验证器失败。

enter image description here

  • 或者您可以在“构建设置”中禁用位码。

5
这不是一种解决方案,而是一种远非完美的变通方法。省略位代码将增加应用程序的总体大小。 - Borut Tomazin
2
当禁用位码时,Firebase Crashlytics 将无法工作。 - mhammad alkhalaf

2
我也收到了一封类似的来自苹果的邮件:
亲爱的开发者,
我们在您的应用程序“********”的最新版本中发现了一个或多个问题。请纠正以下问题,然后重新上传。
ITMS-90562:无效包 - 您的应用程序引用的一个或多个动态库不在dylib搜索路径中。
此致
应用商店团队
我的手表应用程序使用了自己的框架。我通过在扩展目标中将框架选项更改为“嵌入但不签名”来解决了这个问题。默认选项是“不嵌入”。

enter image description here


2
我的问题: 我遇到了与嵌入式框架相关的相同错误。
1. App 项目有自定义框架项目。 2. 自定义框架项目内部还有另一个自定义框架项目。
应用程序可以在模拟器和设备上构建,但无法通过 Apple 测试,返回“无效捆绑包”。
我像 Taha 一样按照技术支持告诉我的方式检查了包,一切都正确无误!
我的解决方案: 我重新组织了项目,使两个自定义框架并排放置,其中一个不再嵌入另一个。
这似乎是苹果验证问题,因为在设备和模拟器上一切正常,但解决方法很简单。

太好了!我在一个框架内部又嵌套了一个框架。我认为这是因为 CocoaPods 不允许在框架内使用 pods。 - Emma Labbé

2
在我的情况下,在构建设置中,当我为库添加以下内容到构建设置时,问题得到了解决:
 DYLIB_INSTALL_NAME_BASE = @rpath

线索是一个链接器警告:“YourLibrary的安装名称以“/”开头,但它不是指定SDK中的内容。”

2

我也遇到了同样的问题。这是因为我的一个框架目标被添加到“链接二进制文件库”中的主目标中,但未添加到“目标依赖项”和“嵌入式二进制文件”中。


这对我很有帮助。我的项目内部框架没有被添加到主目标下的“嵌入式框架”构建阶段中。 - liudasbar

1
我们遇到了同样的问题,即使经过所有步骤(请参见“缺少框架包”),唯一有效的方法是禁用Bitcode

1
真的吗?我故意打开了位码,因为我们想上传一个位码版本... - Dylan Nicholson

1

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