我有一个公共交通应用程序,其中包含火车的实时出发数据。我想添加一个复杂功能,显示下一班火车的出发时间。
是否可以显示(或刷新)并发症的实时数据?例如,显示“3 min. to station X”。根据来自公共交通 API 的信息,数据每分钟都会发生变化。
我应该如何在 watchOS 2 或 watchOS 3 上完成这项工作?
我知道 ETA 应用程序会显示复杂的旅行时间,但我不确定它们是如何实现的。
我有一个公共交通应用程序,其中包含火车的实时出发数据。我想添加一个复杂功能,显示下一班火车的出发时间。
是否可以显示(或刷新)并发症的实时数据?例如,显示“3 min. to station X”。根据来自公共交通 API 的信息,数据每分钟都会发生变化。
我应该如何在 watchOS 2 或 watchOS 3 上完成这项工作?
我知道 ETA 应用程序会显示复杂的旅行时间,但我不确定它们是如何实现的。
并发症并非旨在显示实时数据。频繁更新可能会影响能源效率并影响电池(在手表和手机上)。
为了最大限度地减少功耗,ClockKit 会要求您提供尽可能多的数据,然后缓存数据并在需要时进行渲染。
虽然没有固定的复杂时间线可以重新加载的次数,但复杂数据源受每日执行时间预算的约束。
如果您的应用程序的数据经常更改,则可能难以提供足够的数据以显示在复杂功能中。更糟糕的是,如果您过于频繁地刷新并发症数据,您可能会超出执行时间预算,并且您的并发症可能要到第二天才会更新。
一旦每日预算用尽,调用reloadTimeline
(和extendTimeline
)什么都不做。
如果您的并发症已经超过了分配的每日执行时间预算,则调用此方法不会执行任何操作。谨慎调用此方法。
您可以使用 aCLKRelativeDateTextProvider
创建可以按分钟更改的格式化相对时间。
一个 CLKRelativeDateTextProvider 对象创建一个格式化字符串,该字符串传达当前日期和您指定的日期之间的时间差。您使用相对日期文本提供程序以有效的方式实现计时器或其他相对时间值。不要使用多个时间线条目来复制倒数计时器,而是使用相对日期文本提供程序创建单个时间线条目。当用户查看钟面时,ClockKit 会自动更新您的复杂功能中的相对时间值,提供最新的时间信息。
您可以使用复杂推送更新(来自远程服务器,或从 iOS 10 中的手机本地)。
每天限制为 50 次复杂功能推送更新。
您可以在手机上获取数据并使用transferCurrentComplicationUserInfo
.
在 watchOS 2 中,这仅受每日预算限制。在 watchOS 3 中,现在限制为每天 50 次传输。
在 watchOS 2 中,您可以使用getNextRequestedUpdateDate
来安排下次更新您的并发症。
这不会比每十分钟更频繁地发生。
请注意,应升级 watchOS 3 应用程序以使用后台刷新应用程序任务。主要好处是后台任务将能够做的不仅仅是更新您的并发症。他们还可以处理获取数据、数据到达后更新模型以及更新停靠快照。
最后,您可以安排手动更新。在 watchOS 3 中,推荐的方法是通过后台刷新应用程序任务。
任务预算允许每小时执行 4 个任务。有关scheduleBackgroundRefresh
更多详细信息,请参阅。
请注意,后台刷新应用程序任务使用的 CPU 不得超过 10%。
208 watchOS 3 中的新增功能介绍了其中一些主题。
804 Designing Great Apple Watch Experiences讨论了何时以及为何更新您的手表应用程序。
218让您的手表应用程序保持最新状态提供了有关使用后台任务更新您的复杂功能、应用程序和停靠快照的详细信息。
正如会谈中提到的,您应该在需要更新的时间安排更新。
对于您的用例,示例仅适用于公共交通运行时,并且仅当定期安排的出发时间会受到延误影响时。
Apple 提供了WatchBackgroundRefresh示例代码,演示了如何WKRefreshBackgroundTask
在后台更新 WatchKit 应用程序。
要更新后台任务中的任何活动并发症,您只需添加代码以重新加载(或扩展)时间线:
let complicationServer = CLKComplicationServer.sharedInstance()
for complication in activeComplications {
complicationServer.reloadTimelineForComplication(complication)
}