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

我刚刚按照 Apple 转换指南将我的 ObjectiveC 应用程序升级到 WatchOS 2

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

"Sharing Code Between an iOS App and a watchOS App" 部分描述了如何将现有 iOS 框架复制到 WatchOS 框架目标中以供 WatchOS 使用,如下所示。

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

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

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

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

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

而不是大概必须将其更改为

#import <MyFrameworkWatch/SharedUtils.h>

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

除了最初的自动转换之外,我还做了一些工作,我设法让我的应用程序在模拟器上完美运行,但现在切换到设备时我无法启动它。

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

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

所以这是我的 Watch App Extension 试图 link 到 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 报告的版本。所以我想我已经解决了。我很想从我的框架中删除 cocoa pods 看看它是否有帮助。

有没有其他人按照过渡指南的建议创建了一个重复的框架,然后成功地将应用程序和框架实际安装在他们的手表上?

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

我们一如既往地感谢您的帮助!干杯!

编辑:我想我已经通过在我的 pod 文件和 运行ning pod update/pod 安装...它似乎没有很好地清理目标,所以我不得不手动删除 post 构建步骤中的 cocoa pod 步骤。也许我没有正确删除它,我发现了解 cocoa pods 的幕后情况有点令人困惑。不管发生同样的错误,所以要么我没有正确删除它,要么它对这个特定问题没有影响

好的,这是苹果的transition文档有误,或者是我理解错误造成的。它说

Add the framework to your WatchKit extension’s list of linked frameworks.

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