如何在手表醒着时更新手表复杂功能,以免耗尽每日预算

时间:2016-01-14 16:03:33

标签: watchkit apple-watch apple-watch-complication

我有一台服务器可以保留2个布尔值。这些布尔每15秒更换一次。

每当我唤醒Apple Watch时,我都希望复杂功能显示当前的状态。如何在早期耗尽预算的情况下完成这项工作?

最好的方法是每当我叫醒手表时,将最新的状态提取到并发症中。我看到的唯一可能的方法是每15秒轮询服务器(直接或通过我的手机)。问题是我很快就会用完所有分配的时间。

如果我能让复杂功能只在腕表被唤醒时更新,那就太棒了。可以这样做吗?

1 个答案:

答案 0 :(得分:6)

除非你需要,否则有办法不取数据吗?

没有

通过唤醒手表,"您可以通过与手表互动或抬起手腕来激活手表。无论采用何种方式,手表都可以唤醒表盘,也可以唤醒最后一次活动(由唤醒屏幕设置控制)。

  • 如果它被唤醒到表盘,则这与您的应用程序,手表扩展程序或复杂控制器无关。没有通知可用于处理该情况。

  • 如果它唤醒某项活动,则可能不是您的活动。如果这是您的活动,您可以做的就是在您的观看应用处于活动状态时停止更新。

无论哪种方式,只有在手表醒着时才更新并发症。

如果您考虑一下您的要求,它会违反Apple的指导原则,因为用户希望看一下表盘,并且已经看到了当前的并发症数据。系统要求您在手表未唤醒时提供更新,以便在手表唤醒时立即显示信息。

更新并发症数据

the available update approaches中,这些都无法满足您的要求:

  • PKPushTypeComplication推送通知

    如果您没有经常全天更新,这将是理想的选择。

      

    Apple对您从服务器发送的此类型的推送次数应用每日限制。如果超出限制,则不会提供后续推送。

  • 预定自动更新

    这里的问题是最小预定更新间隔是10分钟,因此您在剩余的9-3 / 4分钟内不会有当前的并发症信息。

      

    预定更新对于数据在可预测时间发生变化的应用非常有用。当发生预定更新时,ClockKit首先调用数据源的requestedUpdateDidBegin或requestedUpdateBudgetExhausted方法。

这些方法可能会满足您的要求,但您必须尝试这些方法并确定哪一个符合您的需求。

  • 观看扩展程序+后台NSURLSession

    这可能会对电池造成更多的消耗,但即使不在手机范围内也能正常工作。

  • 通过WCSession transferCurrentComplicationUserInfo

    手动更新

    如果您处于手机范围内,则手机更有可能(始终)轮询您的服务器,然后提供持续更新。

      

    当您的iOS应用收到针对您的复杂功能的更新数据时,它可以使用Watch Connectivity框架立即更新您的复杂功能。 WCSession的transferCurrentComplicationUserInfo:方法向WatchKit扩展发送高优先级消息,根据需要将其唤醒以传递数据。收到数据后,根据需要延长或重新加载时间线,以强制ClockKit从您的数据源请求新数据。

    请注意iOS 10中的complication transfers are budgeted。如果您每天执行大量更新,则此方法无效。

说完这一切之后,另一种方法是在服务器端监控这些布尔值,并且只在出现问题或更改时发出通知。您没有准确解释这些布尔指示的内容,但还有其他监控方法可以避免您不得不经常轮询服务器(通过手机或手表)。

如果这不是一个选项,那么您真的应该考虑查看手机上的服务器数据,或者切换到复杂程度更低的更新间隔。 Apple不鼓励频繁更新,甚至他们自己的(股票或天气)并发症也不会每分钟更新几次。

<强>更新

  

如果我只是想在用户自己请求时更新并发症(=点击并发症)怎么办?他一直对这个州并不感兴趣。

  • 当手表醒来时,您(仅)更新并发症吗?否

  • 您可以在分机醒来时更新分机吗?是

用户需要考虑复杂性是什么意思。它旨在定期更新以显示当前信息。没有机制不更新复杂功能,因为用户对了解状态几乎不感兴趣。

你可以点击一个复杂功能打开它的应用程序吗?是。但是并发症本身会显示过时的数据,用户必须做的不仅仅是提高他们的手腕以查看当前的状态。

如果您考虑用户提出的问题,他们描述并发症(显示当前状态),而是在他们请求时查看当前状态的方法

该机制与不同于并发症。他们真正描述了用户刷新(或打开)以查看的Glance(或应用程序)。

  • 如果他们想要实时更新,可以通过WCSession updateApplicationContext完成。

      

    使用updateApplicationContext:error:方法将最近的状态信息传递给对方。当对方醒来时,它可以使用此信息来更新自己的状态。使用此方法发送新字典会覆盖以前的字典。

    可行的方式是手机向手表发送背景更新。手表存储了最新的更新,当您的应用程序或Glance唤醒时,它将可用。用户查看应用程序或Glance,它显示手表存储的最新值。在打开时,随着新的更新到来,它会继续更新。在关闭(例如,不活动,睡着)时,手表会代表您的应用或一瞥显示最新更新。

  • 如果用户不需要应用或浏览每15秒更新一次,那么您就不需要轮询,而只需使用NSURLSession即可获取扩展名唤醒时的当前状态。

如果您向用户解释当用户抬起手腕时无法更新并发症,并且他们并不关心始终了解状态(这是一个并发症的意思要做到这一点,然后向他们展示Glance可以做什么,你会发现用户似乎更容易实现用户想要的东西,理想情况下没有不必要地耗尽电池。