我的应用程序的当前AppStore版本看到数百名用户崩溃,无法找到捆绑的框架。这没有出现在测试中,无论是在模拟器上还是在设备上,我都无法重现这个问题,无论我是擦除设备还是全新安装,还是安装在现有版本上。 / p>
我从用户那里获得的错误日志表明:
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崩溃)。我完全无法重现这个问题,但对于受影响的用户来说,它始终如一。
知道为什么只有某些设备无法找到捆绑框架?在某些情况下,App Store是否会使用您的捆绑配置?
答案 0 :(得分:1)
经过一番调查后,似乎库确实消失了。窥探运送到App Store的实际库二进制文件,他们最终只为arm64构建。仍在努力如何这发生了(也许是一些CocoaPods的怪异),但这巧妙地解释了野外的dyld失败。对于arm64架构(iPhone 5s和更高版本),一切都很好。对于4s,5,5c和更旧的iPad,dyld无法找到lib。显然,App Store strips out non-compatible architectures在他们处理应用程序时,并且该部分捆绑包在armv7设备上显然缺失。查看可用的崩溃报告,它们都不在arm64设备上。
找不到所有&#34;库&#34;崩溃,如上所述的日志,在iOS9上。在iOS 8上有类似的崩溃,但有不同的消息。我假设它是我能够在本地重现的那个(&#34; no suitable image found... Did find <somelib>: mach-o, but wrong architecture
&#34;),这与iOS8设备可以获得全脂二进制。 Lib会在那里,但没有arm7。
这种失败在正常发育过程中并不明显。我使用iPhone 6作为主要测试设备,我的测试团队显然也都在新设备上。我依靠模拟器在旧设备上进行测试。这看起来像是一个坏主意™至少有一个我现在可以引用的原因。将来,我会在向世界发送信息之前,在实际的,事实上的armv7设备上进行测试。
因此,对于任何未来遇到dyld故障的人来说,这还有一件事需要寻找。如果事实并非如此,将会更新。
编辑:来自验尸的又一个小问题,为后人 - 我们在AppStore版本中仅使用arm64的方式是捆绑调试版本的库,而不是AppStore版本。我通过创建一个新的复制阶段捆绑了框架,并从CocoaPods的Products组中拖动框架。但是,以这种方式配置复制阶段时获得的实际二进制文件取决于您当前具有活动的方案。如果激活了Debug方案,则可以获得库的调试版本。如果您的AppStore方案处于活动状态,则会获得AppStore构建。这是Xcode项目中的硬编码路径,无论您为将来的主项目构建选择哪种方案,您都要捆绑最初拖动的版本。默认情况下,Debug构建仅构建活动体系结构,这意味着Debug库缺少armv7支持。