2016-05-29 62 views
2

当前的AppStore版本的应用程序正在查看数百个用户的崩溃情况,在这些用户中无法找到捆绑的框架。这并没有出现在测试中,无论是在设备清理还是全新安装,还是在现有版本上安装,我都无法重现该问题,无论是在模拟器还是设备上。iOS:未找到嵌入式框架,但仅在* some *安装

我已经从用户处获取的错误日志说明:

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 

然而,经审查,该框架肯定是包含在已发送到App Store,在框架文件夹中的实际束。在Xcode项目中,运行时搜索路径包含'@ executable_path/Frameworks',这就是框架捆绑在一起的地方。这是我们第一次链接到一个动态库(这是必须的,因为lib包含Swift代码),所以有可能(甚至可能)我错过了一些关于嵌入式框架的重要内容这里。

同样,奇怪的是,我可以擦拭我的iPhone清洁,并从App Store重新安装此版本,并不会发生错误。在我测试过的每个配置中(包括我们的beta测试者),该库加载得很好。这意味着仅有部分用户缺少该框架。此外,似乎没有任何押韵或失败的原因。它发生在所有iOS设备上,包括所有版本的iOS 9(尽管我没有看到Xcode组织者列出的任何iOS 8崩溃)。我完全无法重现该问题,但对于受影响的用户而言,它始终如一地发生。

任何想法为什么只有一些设备将无法找到捆绑框架?在某些情况下,应用程序商店是否使用您的捆绑软件配置?

+1

与动态框架有相同的问题。我给苹果打电话,并要求他们提供解决方案。这是iOS 9.3.1中的一个错误。如果用户升级到iOS 9.3.2,则应该修复并运行。该应用不会超过启动画面。用户必须进行全新安装,即使这样,有时仍然无法正常工作。这就是为什么你在iOS-8上看不到问题的原因。 – Brandon

+0

当然似乎是合理的(好吧,似乎_ludicrous_该错误将在那里结束,但合理的是,它将是一个iOS的东西)。将看看我能否让客户尝试验证。谢谢! –

回答

1

经过一番调查,似乎确实消失。窥探发送到App Store的实际库二进制文件,他们最终只能为arm64构建。仍然在如何这发生了(也许一些CocoaPods怪异),但这很好地解释了在野外的dyld失败。对于arm64体系结构(iPhone 5s及更高版本),一切都是A-OK。对于4s,5c,5c和更老的iPad,dyld找不到该lib。显然,App Store strips out non-compatible architectures在处理应用程序时,该部分软件包在armv7设备上显然缺失。查看可用的崩溃报告,它们都不在arm64设备上。

所有的“未找到的库”崩溃,像上面提到的日志,都在iOS9上。 iOS 8上有类似的崩溃,但有不同的消息。我假设它是我能够在本地重现的那个(“no suitable image found... Did find <somelib>: mach-o, but wrong architecture”),这与iOS8设备将获得全双工二进制文件的想法相吻合。 Lib会在那里,但没有arm7。

iOS Architectures by device

这种不良的正常发育过程中并不明显。我使用iPhone 6作为主要测试设备,而我的测试团队显然也都在较新的设备上。我曾依靠模拟器在旧设备上进行测试。看起来这是一个糟糕的想法™至少有一个原因,我现在可以引用。将来,我会在将事情发送到世界之前,在实际的,事实上的armv7设备上进行测试。

因此,对于任何人在未来遇到问题,这是另一件需要寻找的事情。如果事实并非如此,将会更新。

编辑:从尸体解剖,为后人更多 - 我们结束与arm64-只在AppStore构建的方式是捆绑调试版本的库,而不是AppStore版本。我通过创建一个新的Copy阶段来捆绑框架,并从CocoaPods的Products组中拖动框架。但是,以这种方式配置复制阶段时获得的实际二进制文件取决于您当前处于活动状态的方案。如果您的Debug方案处于活动状态,那么您将获得库的调试版本。如果您有一个AppStore方案处于活动状态,您将获得一个AppStore版本。这是Xcode项目中的硬编码路径,无论您将来为主项目的构建选择哪种方案,都会捆绑您最初拖动的版本。

默认情况下,Debug build只构建活动架构,这意味着Debug库缺少armv7支持。