我有一个公共交通应用程序,提供火车的实时出发数据。 我想添加一个复杂功能,显示下一班火车的起飞时间。
是否可以在并发症上显示(或刷新)实时数据?例如,显示" 3分钟。到X站。"根据来自公共传输API的信息,数据可能每分钟都在变化。
我应该如何在watchOS 2或watchOS 3上完成此操作?
我知道ETA应用程序显示复杂的旅行时间,但我不确定他们是如何实现的。
答案 0 :(得分:7)
并发症并非旨在显示实时数据。频繁更新会影响能源效率并影响电池(手表和手机)。
为了最大限度地降低功耗,ClockKit会要求您提供尽可能多的数据,然后缓存数据并在需要时呈现数据。
虽然没有固定次数可以重新加载并发症时间线,但复杂数据源需要遵守每日执行时间预算。
如果您的应用数据频繁更改,则可能难以提供足够的数据以便在并发症中显示。更糟糕的是,如果过于频繁地刷新并发症数据,可能会超出执行时间预算,并且您的并发症可能要到第二天才会更新。
每日预算用尽后,拨打reloadTimeline
(和extendTimeline
)的电话不会执行任何操作。
如果您的并发症已超出其分配的每日预算执行时间,则调用此方法不会执行任何操作。谨慎地使用这种方法。
您可以使用CLKRelativeDateTextProvider
创建格式化的相对时间,该时间可以逐分钟变化。
CLKRelativeDateTextProvider对象创建一个格式化字符串,用于表示当前日期与指定日期之间的时间差。您可以使用相对日期文本提供程序以有效的方式实现计时器或其他相对时间值。不使用多个时间轴条目来复制倒数计时器,而是使用相对日期文本提供程序创建单个时间轴条目。当用户查看钟面时,ClockKit会自动更新并发症中的相对时间值,提供最新的时间信息。
您可以使用并发推送更新(来自远程服务器,或者来自iOS 10中手机的本地)。
每天最多有50次并发症推送更新。
您可以在手机上获取数据并使用transferCurrentComplicationUserInfo
。
在watchOS 2中,这只受每日预算的限制。在watchOS 3中,现在限制为每天50次传输。
有关详细信息,请参阅Is transferCurrentComplicationUserInfo more suitable for complication update?。
在watchOS 2中,您可以使用getNextRequestedUpdateDate
安排下次更新并发症。
这种情况不会超过每十分钟发生一次。
请注意,应升级watchOS 3应用以使用后台刷新应用任务。主要好处是后台任务能够做的不仅仅是更新你的并发症。他们还可以处理获取数据,在数据到达后更新模型,以及更新Dock快照。
最后,您可以安排手动更新。在watchOS 3中,推荐的方法是通过后台刷新应用程序任务。
任务预算每小时允许4个任务。有关详细信息,请参阅scheduleBackgroundRefresh
。
请注意,后台刷新应用任务的CPU使用率不得超过10%。
208 What's New in watchOS 3介绍了其中一些主题。
804 Designing Great Apple Watch Experiences讨论更新观看应用的时间和原因。
218 Keeping Your Watch App Up to Date提供有关使用后台任务更新复杂功能,应用和停靠快照的详细信息。
正如会谈中所提到的,您应该在需要时安排更新。
对于您的使用案例,仅在公共交通正在运行时才会举例,并且只有当定期计划的出发时间受到延迟影响时才会出现。
Apple提供WatchBackgroundRefresh示例代码,演示如何使用WKRefreshBackgroundTask
在后台更新WatchKit应用程序。
要更新后台任务中的任何活动复杂功能,您只需添加代码即可重新加载(或扩展)时间轴:
let complicationServer = CLKComplicationServer.sharedInstance()
for complication in activeComplications {
complicationServer.reloadTimelineForComplication(complication)
}