在真正的 Apple Watch 上调试 WatchKit - 没有任何反应

Debug WatchKit on real Apple Watch - Nothing happens

我正在努力在真正的 Apple Watch 上调试我的 WatchKit Extension/App。使用模拟器调试 iPhone 应用程序和 WatchKit 扩展没有问题:

  1. Select WatchKit 应用配置文件和模拟器中的 运行 ==> 应用程序在 Watch Simulator 中启动,我可以在 扩展代码中使用断点 进行调试。
  2. 为了调试 iPhone 应用程序,我在模拟器中启动应用程序并手动附加调试器 ==> 我可以在 iPhone 代码中使用断点 进行调试。

观察iPhone应用和手表应用的工作都没有问题。至少在模拟器中没有。

我想在 真正的 Apple Watch 上做同样的事情。但是当我 select WatchKit 应用程序配置文件和我真正的 iPhone (而不是模拟器)并单击“运行”时,没有任何反应。这意味着 Xcode 似乎构建并启动了应用程序,但设备上没有任何反应。 Xcode 中的状态字段显示:

Building MyApp WatchKit App: MyApp WatchKit Extension

Building MyApp WatchKit App: Finishing...

Running MyApp on My iPhone 6

这就是全部。没有调试 Window,断点被忽略或不起作用,应用程序在 iPhone 或 Apple Watch 上都没有启动。

我发现了其他关于在真实设备上进行调试的问题(例如 ),但它们都涉及安装和签名问题。在我的例子中,iPhone 应用程序和 WatchKit 应用程序的安装都没有任何问题。当我单击手表上的应用程序图标时,我可以启动并使用该应用程序。 问题是我无法调试这个过程。

为什么我需要在真实设备上调试进程?好吧,有一件事我无法使用模拟器测试:当 Watch App 尝试联系 iPhone 应用程序使用 openParentApplication:reply: 而 iPhone 应用程序尚未 运行ning?这在模拟器中完美运行,但在真实设备上,Watch Apps 似乎没有得到 iPhone 应用程序的回复,只是永远等待。

我已经找到 来解决这个问题,但无法调试 Watch App 并查看代码的执行方式,我无法确定发生了什么...

我遇到了同样的问题,但为了稍微改善调试体验,我通常会重启我的设备几次。尝试重新启动您的 Apple Watch 或 iPhone.

在从 Xcode 启动您的应用程序之前,请确保该应用程序在您的 Apple Watch 上完全关闭(例如未卡在加载屏幕)。为此,您必须强制关闭应用程序:进入您的应用程序,按住侧边按钮直到出现关闭手表的菜单,然后再按同一侧边按钮几秒钟,直到手表返回到主屏幕并强制关闭您的应用程序。

现在您可以尝试从 Xcode 构建和 运行 应用程序,它应该可以更可靠地工作。

watchOS 3+:

强制退出是长按侧边按钮(数码表冠正下方的按钮)直到出现关机界面,然后 松开侧边按钮,然后按住数码表冠。

这里有一种技术对我来说似乎是最可靠的,尽管它仍然只有大约 25% 的时间有效(Xcode 7 beta 4、7A165t):

  1. 运行 调试中的 phone 目标(当然是在你实际的 iPhone 上)
  2. 当 iPhone 应用程序仍在 运行ning 时,切换到监视目标并 运行 处于调试状态。
  3. 安装应用程序时请密切注意手表主屏幕。安装该应用程序后,点击它以将其打开。这有时会 "kickstart" 手表应用程序并允许调试器捕获它。此时,您应该能够同时调试 iPhone 应用和 watchOS 应用。

感谢您的回答。我终于设法在我真正的 Apple Watch 上调试 运行ning(大部分时间)。然而,它非常麻烦并且不是很可靠。评论中没有足够的 space 所以我将使用这个答案来描述我的解决方案。也许对其他人有帮助:

  1. 确保您手表上的应用不是 运行ning(如 BalestraPatrick 所述)。启动应用程序并按住侧边按钮几秒钟以调出 "Turn off your Watch" 对话框。再按住侧边按钮几秒钟以关闭应用程序并 return 到手表主屏幕。
  2. 确保 iPhone 没有被锁定。

  3. Select WatchKit App 目标和您真正的 iPhone 和 运行 项目。

  4. 运行 Watch App 经常导致错误 SPErrorInvalidBundleNoGizmoBinaryMessage。重新启动 Xcode 并清理 Watch App 和 App 目标解决了这个问题。
  5. 如果 Watch App 构建成功,Xcode 中会出现一条短消息,但您的 iPhone 或 Watch 上不会显示任何消息。如果您对 Watch 应用程序进行了更改,则需要几秒钟的时间来刷新 Watch 上的应用程序。这由覆盖在应用程序图标上的进度圆圈指示。如果您在应用程序传输后未进行任何更改:通过点击图标手动启动手表应用程序。不会自动启动。
  6. 在大多数情况下,Xcode 将识别应用程序启动并将其调试器附加到它。这将允许使用断点、检查代码等。

在我的例子中,我想检查 iPhone 应用程序如何在应用程序 之前未激活时处理 application:handleWatchKitExtensionRequest:reply: 调用 。这很重要,因为使用模拟器无法做到这一点。如果应用程序需要很长时间来处理请求,手表将不会收到有效响应。

完成上述步骤后 Xcode 仅附加手表应用程序,不会在 iPhone 应用程序代码中的断点处保持。为此,必须手动将调试器附加到手表应用发送调用时启动的 iPhone 应用进程。

为了能够附加调试器,我向应用程序的主要功能添加了延迟:[NSThread sleepForTimeInterval:5]:

    Watch App 中的
  1. Select 函数将开始调用 iPhone App
  2. iPhone 应用程序将在后台启动。延迟给您 5 秒的时间来附加调试器。
  3. 在 Xcode 中选择 Debug\Attach To Process\Likely Targes\Your iPhone App 以附加调试器。
  4. 5 秒延迟后,该过程将继续,您也可以在 iPhone 应用代码中使用断点。
  5. 不要忘记在完成测试后删除延迟代码:-)

注意: 您将无法从 iPhone 应用程序中看到 NSLog 输出(或任何控制台输出),因为附加调试器不会重新路由控制台输出。

祝您测试这款出色的 Apple 新产品愉快:-P

这个问题有不同的答案。都很好。

原因是:根据我的经验,至少有两个不同的问题会阻止在真实手表上进行调试。两者都需要不同的策略。

此答案试图帮助您决定何时使用哪种策略。

  1. XCode 安装,短时间告诉您它是 运行,然后停止显示 "running..."。
    • 从 BalestraPatrick 的回答开始:
    • 重新启动您的设备。
    • 不要忘记重新启动您的 iPhone。我第一次遇到这个问题时就成功了。
  2. XCode 安装,告诉你它是 运行 更长的时间:“运行 的 Apple Watch 上。
    • 从 Jay Hickey 或 Andrei Herford 的回答开始
    • 手动启动手表应用程序可能会成功。

我也有过 XCode 能够在没有我帮助的情况下启动手表应用程序的情况。

奖金:

从 XCode 7.1 开始,似乎 XCode 并不总是编译所有必需的 Swift 文件(比以前更频繁)。这不是特定于手表的,它也适用于 iOS 应用程序。症状可能看起来与这个问题的症状相似。 -> 清理你的项目然后重新启动 XCode.