WatchOS 2 应用程序无法在我的框架库未加载的 dyld_fatal_error 的设备上启动:找不到图像

Posted

技术标签:

【中文标题】WatchOS 2 应用程序无法在我的框架库未加载的 dyld_fatal_error 的设备上启动:找不到图像【英文标题】:WatchOS 2 App fails to launch on device with dyld_fatal_error for my Framework Library not loaded: Image not found 【发布时间】:2015-12-08 22:28:39 【问题描述】:

我刚刚按照苹果转换指南将我的 ObjectiveC 应用升级到 WatchOS 2

https://developer.apple.com/library/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/ConfiguretheXcodeProject.html

通过“在 ios 应用程序和 watchOS 应用程序之间共享代码”部分描述如何将现有 iOS 框架复制到 WatchOS 框架目标中以供 WatchOS 使用,如下所示。

“如果您已经有一个与您的 iOS 应用共享框架的 watchOS 1 应用,请复制您的 iOS 框架目标并对其进行修改以支持 watchOS 2。

复制和配置 watchOS 2 的框架目标

    打开 Xcode 的项目编辑器面板。 (窗格通常是关闭的。) 按住 Control 键单击目标以显示带有复制命令的上下文菜单。 更改目标的名称,以便日后轻松识别。 在构建设置中,更改以下值: 将支持的平台设置更改为 watchOS。 将 Base SDK 设置更改为最新的 watchOS。 更改产品名称设置,使其与您的 iOS 框架的名称相匹配。您希望使用相同的名称构建两个框架。 将框架添加到 WatchKit 扩展的链接框架列表中。”

我已经按照这些步骤克隆了我的框架,iOS 框架称为 MyFramework,现在新的 WatchOS 框架称为 MyFrameworkWatch。但如上所述,产品名称设置为 MyFramework 而不是 MyFrameworkWatch。我认为这种命名转变是为了让我可以使用

从我的框架中包含
#import <MyFramework/SharedUtils.h>

而不是可能不得不将其更改为

#import <MyFrameworkWatch/SharedUtils.h>

我不介意后者,但我承认保持框架名称相同会​​更好。

在最初的自动转换之外进行了一些工作后,我设法让我的应用程序在模拟器上运行良好,但现在切换到设备我无法启动它。

在设备上启动我的应用程序会导致它旋转几秒钟然后崩溃。发射一瞥只会使其无限旋转。尝试从 Xcode 运行它并运行应用程序会导致应用程序最终启动和旋转,旋转有时会无限期地持续,但最终它会通过,我得到如下报告的实际错误

dyld_fatal_error - dyld: Library not loaded: @rpath/MyFramework.framework/MyFramework referenced from WatchKit Extension Reason: image not found

所以这是我的 Watch App Extension 尝试链接到 Watch 框架,并且这样做是为了寻找 MyFramework 名称,而不是 MyFrameworkWatch 名称。我想知道这个名字冲突是否导致它感到困惑?

当我尝试在 Xcode 的 Products 文件夹下查找引用的框架时,我可以看到两个框架

MyFramework
MyFramework

它们都引用相同的路径

/Users/jim/Library/Developer/Xcode/DerivedData/MyApp-byegspjumgwlfpahhwjgzpmfkcdx/Build/Products/Debug-iphoneos/MyFramework.framework

虽然您可以看到目标成员资格将两个框架分开,但顶部的 MyFramework 与主应用程序、今日小部件和框架测试项目相关联。较低的 MyFramework 仅与我的 Watch 扩展相关联。这些肯定引用完全相同的路径感觉不对?

最后,当我在谷歌上搜索这个问题时,我发现参考 CocoaPods 有类似的问题,尽管根据他们的网站在这里

https://github.com/CocoaPods/CocoaPods/issues/4180

自 9 月以来,它已在 0.39.0 版本中得到修复,这是 pod --version 报告的版本。所以我想我有他们的解决办法。我很想从我的框架中删除可可豆荚,看看是否有帮助。

有没有其他人按照过渡指南的建议创建一个重复的框架,然后设法让应用程序和框架实际安装在他们的手表上好吗?

有什么方法可以分析已完成的构建以尝试查看是否可以看到构建文件的问题,这样我就不必等待手表无法启动应用程序来调试它。

一如既往地感谢任何帮助!干杯!

编辑:我想我已经设法通过在我的 pod 文件中注释掉目标部分并运行 pod update/pod install 来从有问题的 MyFrameworkWatch 目标中删除可可豆荚......它似乎没有清理目标很好,所以我不得不在后期构建步骤中手动删除可可豆荚步骤。也许我没有正确删除它,我发现知道可可豆的引擎盖下发生了什么有点令人困惑。不管发生同样的错误,要么我没有正确删除它,要么它对这个特定问题没有影响

【问题讨论】:

我已经做了一些调试,并且可以确认给定运行时错误 dyld: Library not loaded: @rpath/MyFramework.framework/MyFramework referenced from /private/var/mobile/Containers/Bundle/ Application/XXXX-XXX.../MyWatchkitApp.app/Plugins/MyWatchKitExtension.appex/MyWatchKitExtension 原因:找不到图像 我已经找到我正在构建的 .app 并且可以看到没有框架被复制到 WatchKit 扩展中,不知道@rpath 会在哪里期待它 【参考方案1】:

好的,这是由于苹果的转换文档有误,或者我解释错了。它说

将框架添加到您的 WatchKit 扩展的链接框架列表中。

实际上,正确的解决方法是将框架添加到嵌入式二进制文件部分(无论如何都会自动将条目添加到链接的框架中),并将框架正确放置在框架目录下的监视扩展中。然后该应用程序加载正常!太沮丧了,我在几天内为此浪费了几个小时!

【讨论】:

以上是关于WatchOS 2 应用程序无法在我的框架库未加载的 dyld_fatal_error 的设备上启动:找不到图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 watchOS 2 应用程序 Xcode 7 beta 5 中使用 Parse

dyld:库未加载:@executable_path/../

仍然 dyld:库未加载

库未加载@rpath/AFNetworking iOS

Xcode - dyld:库未加载

dyld:库未加载:@rpath/libswiftCore.dylib