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

Posted

技术标签:

【中文标题】如何调试仅在提交到应用商店后发生的“无效捆绑包”错误【英文标题】:How to debug "Invalid Bundle" error which happens only after submitting to app store 【发布时间】:2016-12-04 16:23:37 【问题描述】:

我的应用中有很多框架。应用程序在临时/企业版本中运行良好。只有当我提交到应用商店进行 testflight 测试时,我才会收到来自苹果的此错误电子邮件:

尊敬的开发者,

我们发现您最近交付的“我的应用名称在此处”存在一个或多个问题。要处理您的交付,请执行以下操作 问题必须得到纠正:

Invalid Bundle - 您的应用引用的一个或多个动态库不在 dylib 搜索路径中。

一旦这些问题得到纠正,您就可以重新交付纠正后的二进制文件。

问候,

App Store 团队

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

【问题讨论】:

***.com/a/33904053/341994 【参考方案1】:

在我的例子中,我不得不从 Notification App Extension 添加一个框架到主目标(在主目标中嵌入和登录,不要嵌入到扩展中)——即使在 @ 中没有提到它987654323@输出。

有趣的是,Iterable 官方文档说框架应该嵌入并在扩展中签名 - 由于嵌套包,这将导致另一个上传问题。

【讨论】:

【参考方案2】:

我也收到了来自 Apple 的类似邮件:

尊敬的开发者,

我们发现您的应用最近交付的一个或多个问题, “********。请更正以下问题,然后 重新上传。

ITMS-90562:无效的捆绑包 - 一个或多个动态库 dylib 搜索路径中不存在您的应用引用的内容。

最好的问候,

App Store 团队

我为我的手表应用使用了自己的框架。我通过在扩展目标中将框架选项更改为“不带签名嵌入”来解决了这个问题。默认选项是“不嵌入”。

【讨论】:

【参考方案3】:

尝试了上述所有解决方案,但对我不起作用。

我最近在 Xcode 10.1 中遇到了这个问题,并且我的所有框架都被正确引用(是否 otool -L 并且一切都排好了)。

似乎苹果验证过程发生了一些变化,可能是一个错误,可能不在 Apple 端,但我之前的所有构建都已上传并验证良好——此后我没有添加任何新框架。

将二进制文件上传到 iTunesConnect 后,我​​会看到以下错误:

Invalid Bundle - 一个或多个动态库被 您的应用不在 dylib 搜索路径中。

Invalid Bundle - 应用使用 Swift,但其中一个二进制文件不能 链接到它,因为它没有找到。检查应用程序捆绑 使用“始终嵌入 Swift”正确嵌入 Swift 标准库 标准库”构建设置,以及使用的每个二进制文件 Swift 具有到嵌入式 Swift 标准的正确搜索路径 使用“运行路径搜索路径”构建设置的库。

我的解决方案:

经过几天的调试,对我有用的是在从 Xcode 管理器上传存档时禁用 'Include bitcode for iOS content'。似乎此选项修改了导致验证器失败的二进制文件。

或者您可以在构建设置中禁用位码

【讨论】:

这不是一个解决方案,而是一个远非很好的解决方法。省略位码会增加整个应用程序的大小。 禁用位码后,Firebase Crashlytics 将无法工作【参考方案4】:

我们遇到了同样的问题,即使在通过 all the steps(参见“缺少框架包”)之后,唯一有效的方法是禁用 Bitcode

【讨论】:

认真的吗?我特意打开了 bitcode 正是因为我们要上传 bitcode 版本...【参考方案5】:

Apple 技术说明 TN2435 中也解决了此错误消息 在应用程序中嵌入框架:https://developer.apple.com/library/archive/technotes/tn2435/_index.html

您可以在“缺少框架包”标题下找到错误消息以及故障排除步骤。

【讨论】:

【参考方案6】:

有同样的问题。这发生在我身上,因为我的框架目标之一已添加到“将二进制文件与库链接”中的主目标中,但未添加到“目标依赖项”和“嵌入式二进制文件”中

【讨论】:

【参考方案7】:

所以我为此苦苦挣扎了两天。结果是我在存档中为我正在存档的方案检查了 UITests。

在从存档中取消选中它、重新存档、验证它(尽管在总是通过之前验证它)和“上传到 AppStore”之后,我没有收到来自 Apple 的电子邮件,通知我无效的 Swift 支持。相反,我收到了电子邮件,它已被处理并且很好!

【讨论】:

【参考方案8】:

我遇到了同样的问题,这是因为 app bundle 的 Frameworks 子文件夹中没有一个框架。

我通过添加一个复制字段构建阶段来修复它,并在那里添加缺少的 .framework 文件。

【讨论】:

【参考方案9】:

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

我从 iTunes 商店收到了这封电子邮件,

Invalid Bundle - 您的应用引用的一个或多个动态库不在 dylib 搜索路径中。

这个问题的解决方法很简单,

第 1 步:确保将您的自定义框架添加到目标的常规标签中的嵌入式二进制文件 .

第 2 步:在构建设置下,

为您的主项目目标设置Always Embed Swift Standard Libraries = Yes

并为您的自定义框架目标设置Always Embed Swift Standard Libraries = No

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

Ref

【讨论】:

这个答案是正确的。就我而言,我所有的可可豆荚都必须在链接框架中链接(但您不能将可可豆放入嵌入式二进制文件中)。但是您可以将自己的应用程序自定义框架放入嵌入式二进制文件中,但是对我来说,在提交到应用程序商店时这不是必需的。 为发布二进制文件手动链接到框架的调试版本是不是错了? @Gomino 这仅用于演示目的。必须遵循所有最佳做法。 好的@ZaidPathan 但是你如何根据你的构建配置链接正确的目标框架?【参考方案10】:

就我而言,在构建设置中,当我将以下内容添加到库的构建设置中时,此问题已得到修复:

 DYLIB_INSTALL_NAME_BASE = @rpath

线索是链接器警告:'YourLibrary 的安装名称以“/”开头,但不是来自指定的 SDK'

【讨论】:

【参考方案11】:

我的问题: 我对嵌入式框架也有同样的错误。

    App 项目有自定义框架项目 自定义框架项目内部是另一个自定义框架项目

为模拟器和设备构建的应用程序没有问题,但未通过 Apple 测试,返回“Invalid Bundle”。

我检查了包装,就像技术支持告诉 Taha 一样,一切都存在且正确!

我的解决方案: 我重组了项目,使两个自定义框架并排放置,一个不再嵌入另一个。

这看起来是一个 Apple 验证问题,因为在设备和模拟器上一切正常,但解决方法很简单。

【讨论】:

完美!我在框架内有一个框架。我认为这是因为 CocoaPods 不允许在框架内使用 pod。【参考方案12】:

我在将支持手表的应用上传到应用商店时遇到了同样的问题。

我能够通过第一个答案的提示解决它,使用 otool -L 分析来自 ipa 或 xcarchive 的二进制文件。 但是,问题不在于我的框架(@rpath),而在于 swift lib。我注意到框架文件夹中缺少libswiftWatchKit.dylib

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

显然,如果您仅在主应用程序的文件夹中提供必要的 swift 库,则手表应用程序可以工作并上传通行证。

【讨论】:

我有同样的问题,但设置 EMBEDDED_CONTENT_CONTAINS_SWIFT 对我没有任何帮助。我在这里发帖:***.com/questions/39481174/… 在 XCode 8 中它已更改为 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES【参考方案13】:

从 Apple 开发人员技术支持处得到答复,称这是 Apple 方面的错误。这是以下建议的解决方法,但对我不起作用:

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

您获得的路径列表应该与您在 国际音标。你所有的库都应该以@rpath 开头。一个简单的 将此列表中的所有内容与解压缩的 IPA 文件夹进行比较 应该揭示缺少的东西。

一旦您知道缺少什么,请转到您的 Xcode 构建阶段设置。 Copy Files 或 Embed 应该有一个构建阶段 包含缺失库的框架——你应该只添加 库到列表。如果您没有看到这些构建阶段中的任何一个, 您可以通过添加一个新的 Copy Files 构建阶段来重新创建它,设置 框架的目标,并将库添加到列表中, 确保选中 Code Sign On Copy。

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

如果您发现所有框架都处于此构建阶段,请 查看应用程序目标的 Embedded Binaries 部分 一般页面,如果您看到多个级别的 ../ 下一个,请告诉我 到您找到的二进制文件丢失。

如果它适合你,请告诉我!

【讨论】:

@Taha Selim Bebek 你在哪里找到 ipa 文件?

以上是关于如何调试仅在提交到应用商店后发生的“无效捆绑包”错误的主要内容,如果未能解决你的问题,请参考以下文章

由于捆绑包 ID,iPhone 应用程序更新无法验证

捆绑标识符不能从以前的版本更改

将应用提交到苹果应用商店后如何更改“版本发布控制”

无法安装代号一 iOS 调试应用程序

如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

如何调试 Windows 商店应用程序崩溃?