我有一台服务器可以保留2个布尔值。这些布尔每15秒更换一次。
每当我唤醒Apple Watch时,我都希望复杂功能显示当前的状态。如何在早期耗尽预算的情况下完成这项工作?
最好的方法是每当我叫醒手表时,将最新的状态提取到并发症中。我看到的唯一可能的方法是每15秒轮询服务器(直接或通过我的手机)。问题是我很快就会用完所有分配的时间。
如果我能让复杂功能只在腕表被唤醒时更新,那就太棒了。可以这样做吗?
答案 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可以做什么,你会发现用户似乎更容易实现用户想要的东西,理想情况下没有不必要地耗尽电池。