WatchKit InterfaceController 在 sendMessage:replyHandler 中有条件地播放触觉:

WatchKit InterfaceController conditionally play haptic in sendMessage:replyHandler:

我想让界面控制器检查以确保当我收到 phone 的回复时它仍然在前台。如果是,执行触觉以让用户知道它已完成工作。

sendMessage:replyHandler: 是我用来与 phone 通信的方式,但它可能需要很长时间才能与 return 通信。 InterfaceController 设置为 WCSessionDelegate。它可能需要足够长的时间,以至于用户可以在完成之前放下他们的手腕。在那种情况下,我想让触觉不触发。截至目前,触觉可以排队,然后在未来的随机时间播放,这没有帮助。

我已配置要发送的通知,但只有在手表未显示该应用程序时才会显示。因此,为什么我需要在尝试播放触觉之前弄清楚界面控制器是否在屏幕上。

我首先考虑改进 iOS 代码,这样 return 回复的时间不会太长。

但是,您可以在回复消息中包含当前日期,然后让回复处理程序在播放触觉之前检查回复是否是即时的。如果在您的应用下次激活时处理了回复,这将避免它在未来播放。

顺便说一句,界面控制器出现在屏幕上,因为它正在执行回复处理程序。

我建议的步骤。

  1. sendMessage:replyHandler: 从 Watch 发送任务请求,这将要求 phone 执行一些较长的 运行 任务。
  2. 观看此调用时生成一些 BOOL,比方说 shouldUpdatePhone = YES
  3. 现在考虑您的任务是 运行 并且 Watch 处于 InActive 状态,在这种情况下,您的 Flag (shouldUpdatePhone) 是 YES 所以再次立即调用并告诉 iPhone 该屏幕现在处于活动状态。
  4. 如果长时间 运行 任务在那之后完成,您将获得 Watch 现在处于非活动状态的信息,然后避免 Haptic 的响应信号。