何时何地获取Watch Complication的数据

El *_*Tea 29 ios watchkit clockkit watchos-2 apple-watch-complication

在对并发症进行了几天的处理之后,我有信心对于以规定间隔发生的更新的更新过程进行以下说明:

  • 系统调用 requestedUpdateDidBegin()
    • 您可以在此处确定数据是否已更改.如果没有,您的应用程序不必做任何事情.如果您的数据已更改,则需要调用以下任一项:
      • reloadTimelineForComplication 如果您需要重置所有数据.
      • extendTimelineForComplication 如果您只需要在并发症时间轴的末尾添加新项目.
    • 注意:系统实际上可能会调用,requestedUpdateBudgetExhausted()而不是requestedUpdateDidBegin()如果您在当天花费了太多的并发症时间预算.这就是这个问题的原因.
  • 如果您打电话reloadTimelineForComplication,系统将调用getCurrentTimelineEntryForComplication(以及获取阵列的未来和过去变体,具体取决于您的时间旅行设置)
  • 这是猜想,因为我还没有测试它,但我相信如果你打电话extendTimelineForComplication说只会getTimelineEntriesForComplication(... afterDate date: NSDate ...)被调用.
  • 然后系统将调用,getNextRequestedUpdateDateWithHandler以便您指定复杂性需要新更新的时间.

Apple的文档非常明确,您不应该经常询问更新,或者在复杂化代码中进行太多处理,否则您将耗尽时间预算,并且您的并发症将停止更新.所以,我的问题是:你在何时何地进行更新?

对于上下文,我的方案是一个URL,其返回数据每小时最多更改两次.

放置URL获取代码最明显的地方是func requestedUpdateDidBegin()获取数据,存储它,如果没有变化,只需返回.如果有更改,则延长或重新加载时间线.

但是,URL提取可能会很昂贵.备择方案:

  • 将代码放在手机应用程序上并使用a发送WCSession,但如果用户关闭该应用程序,则更新将不再发生.
  • 使用推送更新,但这不是一个Web应用程序,所以我没有地方发送它们.
  • 显然,当用户与监视应用程序交互时,我将更新所有数据,但现在这意味着它只在用户使用应用程序时才会更新,从而无需复杂化.

还有其他地方吗?我可以在手表应用程序中使用不属于复杂功能的周期性功能吗?获取并发症更新数据的正确位置在哪里?

小智 26

对于watchOS 3,Apple建议您从使用复杂数据源getNextRequestedUpdateDate计划更新切换到更新并发症.

watchOS 2的旧方法

requestedUpdateDidBegin()实际上只是为了更新复杂功能.让您的复杂功能(和观看应用程序)保持最新通常涉及的不仅仅是重新加载时间线(并且异步检索数据永远不适合旧方法).

watchOS 3的新方式

新的更好的方法是使用后台刷新应用程序任务.您可以使用一系列后台任务来安排处理在后台被唤醒的应用扩展程序:

setTaskCompleted任务完成后立即调用每个任务的方法.

使用app任务的其他好处

这个设计的一个关键特性是手表扩展现在可以处理各种前景和背景场景,其中包括:

  • 最初在app/complication启动时加载数据,
  • 当后台任务唤醒扩展时,后台更新数据,以及
  • 当用户从Dock中恢复您的应用程序时,更新前台中的数据.

Apple建议您使用每个机会,无论您的应用程序是在前台还是后台,都可以使您的复杂功能,应用程序和停靠快照保持最新状态.

有没有限制?

每天可用任务总数除以停靠栏中的应用程序数量.Dock中的应用程序越少,您的应用程序可以使用的任务就越多.Dock中的应用程序越多,您可以使用的越少.

  • 如果您的并发症处于活动状态,您的应用程序每小时至少可以唤醒四次.

  • 如果您的并发症未激活,您的应用程序将保证至少每小时唤醒一次.

由于您的应用现在在后台运行,因此您需要高效,快速地完成后台任务.

后台任务受限于CPU时间和允许的CPU使用量.如果超过CPU时间(或在后台使用超过CPU的10%),系统将终止您的应用程序(导致崩溃).

欲获得更多信息