【问题标题】:Debug WatchKit on real Apple Watch - Nothing happens在真正的 Apple Watch 上调试 WatchKit - 没有任何反应
【发布时间】:2015-10-22 20:55:02
【问题描述】:

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

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

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

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

构建 MyApp WatchKit 应用:MyApp WatchKit 扩展

构建 MyApp WatchKit 应用程序:完成...

在我的 iPhone 6 上运行 MyApp

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

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

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

我已经找到 hints 来解决这个问题,但无法调试 Watch 应用程序并查看代码是如何执行的,我无法确定发生了什么......

【问题讨论】:

    标签: ios objective-c xcode cocoa-touch watchkit


    【解决方案1】:

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

    1. 确保手表上的应用程序没有运行(如 BalestraPatrick 所述)。启动应用程序并按住侧面按钮几秒钟以调出“关闭手表”对话框。再按住侧边按钮几秒钟以关闭应用并返回 Watch 主屏幕。
    2. 确保 iPhone 未锁定。

    3. 选择WatchKit App 目标和您的真实iPhone 并运行该项目。

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

    在我的情况下,我想检查当应用之前未处于活动状态时,iPhone 应用如何处理application:handleWatchKitExtensionRequest:reply: 调用。这很重要,因为使用模拟器无法做到这一点。如果应用程序需要很长时间来处理请求,Watch 将不会收到有效响应。

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

    为了能够附加调试器,我在应用程序主函数中添加了延迟:[NSThread sleepForTimeInterval:5]:

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

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

    用这款很棒的 Apple 新产品进行愉快的测试:-P

    【讨论】:

      【解决方案2】:

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

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

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

      watchOS 3+:

      强制退出是通过按住侧面按钮(数字表冠下方的按钮)直到出现关机屏幕,然后 松开侧边按钮,然后按住 Digital Crown。

      【讨论】:

      • 感谢您的提示!这是使其运行的必要步骤之一。我在回答中详细描述了这一点。
      【解决方案3】:

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

      1. 在调试中运行手机目标(当然是在您的实际 iPhone 上)
      2. 当 iPhone 应用程序仍在运行时,切换到 watch 目标并在调试中运行它。
      3. 在安装应用程序时密切关注您的手表主屏幕。安装应用程序后,点击它以将其打开。这有时会“启动”手表应用程序并允许调试器捕获它。此时,您应该可以同时调试您的 iPhone 应用和 watchOS 应用了。

      【讨论】:

      • 感谢您的提示!这是使其运行的必要步骤之一。我在回答中详细描述了这一点。
      【解决方案4】:

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

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

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

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

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

      奖金:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-03
        • 2015-07-05
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多