iOS:未找到嵌入式框架,但仅在*部分*安装上找到

iOS:未找到嵌入式框架,但仅在*部分*安装上找到,ios,iphone,xcode,frameworks,Ios,Iphone,Xcode,Frameworks,我的应用程序的当前AppStore版本有数百名用户崩溃,无法找到捆绑的框架。这在测试中没有出现,我无法重现问题,无论是在模拟器上还是在设备上,无论我是将设备清理干净并重新安装,还是在现有版本上安装 我从用户处获得的错误日志表明: Dyld Message: Library not loaded: @rpath/OMGHTTPURLRQ.framework/OMGHTTPURLRQ Referenced from: /var/containers/Bundle/Application/BB3201

我的应用程序的当前AppStore版本有数百名用户崩溃,无法找到捆绑的框架。这在测试中没有出现,我无法重现问题,无论是在模拟器上还是在设备上,无论我是将设备清理干净并重新安装,还是在现有版本上安装

我从用户处获得的错误日志表明:

Dyld Message: Library not loaded: @rpath/OMGHTTPURLRQ.framework/OMGHTTPURLRQ
Referenced from: /var/containers/Bundle/Application/BB320110-3C64-4772-9A3A-208F4CAD84B5/PicTapGo.app/PicTapGo
Reason: image not found
但是,经过审查,该框架肯定包含在发送到应用商店的实际捆绑包中,即Frameworks文件夹中。在Xcode项目中,运行时搜索路径包括“@executable\u path/Frameworks”,这就是框架捆绑的地方

这是我们第一次针对动态库进行链接(这是必须的,因为库中包含Swift代码),所以我可能(甚至可能)遗漏了一些关于嵌入式框架的关键内容

同样,奇怪的是,我可以把我的iPhone擦干净,然后从应用商店重新安装这个版本,而错误不会发生。在我测试过的每个配置中(包括我们的beta测试),库的负载都很好。这意味着只有一些用户缺少该框架。此外,似乎没有任何押韵或失败的原因。它发生在所有类型的iOS设备上,发生在所有版本的iOS 9上(尽管我在Xcode organizer中没有看到任何iOS 8崩溃)。我完全无法重现这个问题,但对于受影响的用户来说,它一直在发生


你知道为什么只有一些设备找不到捆绑的框架吗?在某些情况下,应用商店是否会对您的捆绑包配置进行监视?

经过调查,这些库似乎确实消失了。通过窥探发送到应用商店的实际库二进制文件,它们最终只为arm64构建。仍在研究这是如何发生的(也许是一些椰子足类动物的古怪),但这很好地解释了dyld在野外的失败。对于arm64架构(iPhone 5s及更高版本),一切都很正常。对于4s、5、5c和更老的iPad,dyld找不到lib。很明显,当他们处理应用程序时,应用程序商店,而这部分捆绑包在armv7设备上完全丢失了。查看可用的崩溃报告,没有一个在arm64设备上

所有“library not found”(未找到库)崩溃,以及上面提到的日志,都在iOS9上。iOS 8上也有类似的崩溃,但消息不同。我假设它是我能够在本地复制的(“
没有找到合适的图像…确实找到了:mach-o,但架构错误”
”),这与iOS8设备将获得全脂二进制的想法相吻合。Lib会在那里,但没有arm7

在正常开发过程中,此故障并不明显。我使用iphone6作为主要测试设备,我的测试团队显然也都在更新的设备上。我依靠模拟器在旧设备上进行测试。看起来这是个坏主意™ 至少有一个原因我现在可以引用。将来,我将在实际的armv7设备上进行测试,然后再将其发送到世界上

因此,对于任何在未来经历dyld失败的人来说,这是另一件需要寻找的事情。如果结果不是这样,将更新此

编辑:来自尸检的另一个小贴士,为了子孙后代-我们最终在AppStore构建中使用arm64的方式是绑定库的调试版本,而不是AppStore版本。我通过创建一个新的复制阶段,并从CocoaPods的产品组中拖拽框架,从而捆绑了这些框架。但是,以这种方式配置复制阶段时得到的实际二进制数取决于当前处于活动状态的方案。如果调试方案处于活动状态,则会获得库的调试版本。如果有一个应用商店方案处于活动状态,则会得到一个应用商店生成。这是Xcode项目中的硬编码路径,无论将来为主项目的构建选择哪种方案,都将绑定最初拖动的版本


默认情况下,调试生成只生成活动体系结构,这意味着调试库缺少armv7支持。

在动态框架中也存在同样的问题。我打电话给苹果公司,向他们寻求解决方案。这是iOS 9.3.1中的一个bug。如果用户升级到iOS 9.3.2,它应该是固定的并且可以工作。应用程序无法通过启动屏幕。用户必须重新安装,即使这样,有时还是不起作用。这就是为什么你在iOS-8上看不到这个问题的原因。这似乎是合理的(好吧,这个bug最终会出现在那里似乎很可笑,但这将是iOS的事情,这是合理的)。我会看看是否能让客户来验证。谢谢