如何debugging“无效捆绑”错误,只有在提交到app store后才会发生

我的应用程序中有很多框架。 应用程序在adhoc / enterprise版本中运行良好。 只有当我提交到app store进行testing飞行testing,我得到这个来自苹果的错误电子邮件:

亲爱的开发者

我们发现您最近的“我的应用程序的名称在这里”的一个或多个问题。 要处理您的交付,必须纠正以下问题:

无效的包 – 您的应用程序引用的一个或多个dynamic库不存在于dylibsearchpath中。

一旦这些问题得到纠正,您可以重新发送更正的二进制文件。

问候,

App Store团队

这里没有具体的信息。 我怎样才能debugging它?

从苹果开发者技术支持得到了一个答案,说这是苹果方面的一个错误。 这是下面的build议的解决方法,不适合我:

为了诊断这个问题,你应该从Xcode中导出你发送给App Store的IPA。 由于IPA是zip文件,您可以右键单击并使用“打开方式”>“存档实用程序”进行解压缩。 您应该在解压后的文件夹结构中find主要的可执行文件,并在命令行运行otool以查看库列表:otool -L

你得到的path列表应该与你在IPA里面find的匹配。 所有的库都应该以@rpath开头。 将此列表中的所有内容与解压缩的IPA文件夹进行简单的比较应能够揭示缺失的内容。

一旦你知道缺less的东西,去你的Xcode构build阶段设置。 应该有一个“复制文件”或“embedded框架”的构build阶段,其中包括缺less的库 – 您应该将库添加到列表中。 如果您没有看到这两个构build阶段,则可以通过添加新的“复制文件”构build阶段,将“目标设置为构架”以及将该库添加到列表来重新创build它,以确保已选中“代码签名复制”。

如果在主二进制文件中找不到任何东西,请确保对其他任何二进制文件执行相同的search,例如watchOS应用程序或iOS应用程序扩展。

如果您发现所有的框架都处于这个构build阶段,请查看您的应用程序目标的常规页面的embedded式二进制文件部分,并让我知道如果您发现二进制文件的多个级别../不见了。

请让我知道,如果它适合你!

在将支持手表的应用上传到app store时遇到同样的问题。

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

为我工作的解决scheme就像在手表应用程序的构build设置(或手表应用程序扩展,但不是两个)中设置EMBEDDED_CONTENT_CONTAINS_SWIFT=YES一样简单。 之后,所有必要的swift库被正确地复制到档案中的手表应用程序path,并上传到应用程序商店工作正常。

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

我的问题:我有embedded式框架相同的错误。

  1. 应用程序项目有自定义框架项目
  2. 自定义框架项目内部是另一个自定义框架项目

应用程序build立到模拟器和设备没有问题,但苹果testing失败,返回“无效捆绑”。

我像技术支持人员告诉Taha一样检查了包装,一切都是现在正确的!

我的解决scheme:我重组了项目,以便两个定制框架并排坐在一起,一个不再embedded另一个。

这看起来是一个苹果validation问题,因为一切工作正常的设备和模拟器,但解决方法是直截了当的。

在我的情况下,在构build设置中,当我将以下内容添加到库的构build设置时,这是固定的:

  DYLIB_INSTALL_NAME_BASE = @rpath 

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

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

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

无效的包 – 您的应用程序引用的一个或多个dynamic库不存在于dylibsearchpath中。

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

第1步:确保您的自定义框架已添加到目标的常规选项卡中embedded式二进制文件在这里输入图像说明

第2步:在构build设置下,

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

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

这解决了我的问题,我能够上传二进制到iTunes连接

参考

我有同样的问题,这是由于一个框架没有出现在应用程序包的Frameworks子文件夹中。

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

所以我为此挣了两天。 结果是我的UITests被检查存档为我的计划我正在归档的build设。

从存档中取消选中之后,重新存档,validation(虽然在总是通过之前validation它)和“上传到AppStore”。我没有收到Apple发送的电子邮件,通知我Invalid Swift Support无效。 相反,我收到了电子邮件,它已被处理,很好去!