watchOS - 显示并发症的实时出发数据

Bra*_*ram 4 apple-watch watchkit watchos clockkit apple-watch-complication

我有一个公共交通应用程序,提供火车的实时出发数据.我想添加一个复杂功能,显示下一班火车的出发时间.

是否可以在并发症上显示(或刷新)实时数据?例如,显示"到X站3分钟".根据来自公共传输API的信息,数据可能每分钟都在变化.

我应该如何在watchOS 2或watchOS 3上完成此操作?

我知道ETA应用程序显示复杂的旅行时间,但我不确定他们是如何实现的.

小智 8

实时更新是否可行?

  • 并发症并非旨在显示实时数据.频繁更新会影响能源效率并影响电池(手表和手机).

    为了最大限度地降低功耗,ClockKit会要求您提供尽可能多的数据,然后缓存数据并在需要时呈现数据.

  • 虽然没有固定次数可以重新加载并发症时间线,但复杂数据源受每日执行时间预算的限制.

    如果您的应用程序的数据经常更改,则可能难以提供足够的数据以在并发症中显示.更糟糕的是,如果过于频繁地刷新并发症数据,则可能会超出执行时间预算,并且您的并发症可能要到第二天才会更新.

  • 每日预算用完后,拨打电话reloadTimeline(和extendTimeline)什么都不做.

    如果您的并发症已超过其分配的每日预算执行时间,则调用此方法不会执行任何操作.谨慎地称呼这种方法.

并发症如何显示相对时间?

  • 您可以使用a CLKRelativeDateTextProvider创建格式化的相对时间,该时间可以在每分钟的基础上更改.

    CLKRelativeDateTextProvider对象创建一个格式化字符串,用于表示当前日期与指定日期之间的时间差.您可以使用相对日期文本提供程序以有效的方式实现计时器或其他相对时间值.不使用多个时间轴条目来复制倒数计时器,而是使用相对日期文本提供程序创建单个时间轴条目.当用户查看钟面时,ClockKit会自动更新并发症中的相对时间值,提供最新的时间信息.

如何经常更新并发症?

  • 您可以使用并发推送更新(从远程服务器或iOS 10中的手机本地).

    每天最多有50次并发症推送更新.

  • 您可以在手机上获取数据并使用transferCurrentComplicationUserInfo.

    在watchOS 2中,这仅受每日预算的限制.在watchOS 3中,现在限制为每天50次传输.

    请参阅transferCurrentComplicationUserInfo更适合复杂更新?更多细节.

  • 在watchOS 2中,您可以使用它getNextRequestedUpdateDate来安排下次更新并发症.

    这种情况不会超过每十分钟发生一次.

    请注意,应升级watchOS 3应用以使用后台刷新应用任务.主要好处是后台任务能够做的不仅仅是更新你的并发症.他们还可以处理提取数据,在数据到达后更新模型,以及更新Dock快照.

  • 最后,您可以安排手动更新.在watchOS 3中,推荐的方法是通过后台刷新应用程序任务.

    任务预算每小时允许4个任务.有关scheduleBackgroundRefresh详细信息,请参阅

    请注意,后台刷新应用程序任务不得使用超过10%的CPU.

推荐的WWDC 2016会议

如会谈中所述,您应该在需要时安排更新.

对于您的使用案例,示例仅在公共交通运行时,并且仅在定期计划的出发时间受到延迟影响时才会出现.

Apple示例代码

Apple提供WatchBackgroundRefresh示例代码,演示如何WKRefreshBackgroundTask在后台更新WatchKit应用程序.

要更新后台任务中的任何活动复杂,您只需添加代码以重新加载(或扩展)时间轴:

let complicationServer = CLKComplicationServer.sharedInstance()

for complication in activeComplications {
    complicationServer.reloadTimelineForComplication(complication)
} 
Run Code Online (Sandbox Code Playgroud)