我的应用的当前 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
但是,经过审查,该框架肯定包含在发送到 App Store 的 Frameworks 文件夹中的实际 bundle 中。在 Xcode 项目中,Runtime Search Paths 包括“@executable_path/Frameworks”,这就是捆绑框架的地方。
这是我们第一次链接到动态库(这是必须的,因为该库包含 Swift 代码),所以有可能(甚至可能)我在这里遗漏了一些关于嵌入式框架的重要内容.
再次,奇怪的是我可以将我的 iPhone 擦干净,然后从 App Store 重新安装此版本,并且不会出现错误。在我测试过的每个配置中(包括我们的 beta 测试人员),库加载得很好。这意味着只有某些用户缺少该框架。此外,失败似乎没有任何押韵或原因。它发生在各种 iOS 设备上,在所有版本的 iOS 9 上(尽管我在 Xcode 管理器中没有看到任何 iOS 8 崩溃)。我完全无法重现该问题,但对于受影响的用户来说,它始终如一地发生。
知道为什么只有 一些 设备无法找到捆绑的框架吗?在某些情况下,App Store 是否会使用你的 bundle 配置?
Best Answer-推荐答案 strong>
经过一番调查,这些库似乎确实消失了。窥探发送到 App Store 的实际库二进制文件,它们最终只为 arm64 构建。仍在研究如何这是发生的(可能是一些 CocoaPods 的怪异),但这巧妙地解释了 dyld 在野外的失败。对于 arm64 架构(iPhone 5s 及更高版本),一切正常。对于 4s、5、5c 和较旧的 iPad,dyld 找不到该库。显然,App Store strips out non-compatible architectures当他们处理应用程序时,捆绑的那部分在 armv7 设备上完全丢失了。查看可用的崩溃报告,它们都没有出现在 arm64 设备上。
所有的“找不到库”崩溃,以及上面提到的日志,都在 iOS9 上。 iOS 8 上也有类似的崩溃,但消息不同。我假设它是我能够在本地复制的那个(“找不到合适的图像......确实找到了:mach-o,但是架构错误 ”),这与iOS8 设备将获得完整的二进制文件的想法。 Lib 会在那里,但没有 arm7。
此故障在正常开发过程中并不明显。我使用 iPhone 6 作为主要测试设备,而且我的测试团队显然也在更新设备上。我曾依靠模拟器在旧设备上进行测试。出于我现在可以引用的至少一个原因,这看起来是个坏主意™。将来,我将在实际的 armv7 设备上进行测试,然后再将其发送到世界上。
因此,对于将来遇到 dyld 失败的任何人来说,这是另一件需要寻找的事情。如果事实并非如此,将更新此内容。
编辑:尸检中的另一个花絮,为了后代 - 我们在 AppStore 构建中最终使用 arm64-only 的方式是捆绑库的调试版本,而不是 AppStore 版本。我通过创建一个新的 Copy 阶段并从 CocoaPods 的 Products 组中拖动框架来捆绑框架。但是,以这种方式配置复制阶段时获得的实际二进制文件取决于您当前处于事件状态的方案。如果您有一个激活的调试方案,您将获得库的调试版本。如果您有一个 AppStore 方案处于事件状态,您将获得一个 AppStore 构建。这是 Xcode 项目中的硬编码路径,无论您将来为主项目的构建选择哪种方案,您都将捆绑您最初拖动的版本。
默认情况下,Debug 构建只构建事件架构,这意味着 Debug 库缺少 armv7 支持。
关于iOS:未找到嵌入式框架,但仅在 *一些* 安装中,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/37513448/
|