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提取可能会很昂贵.备择方案:
WCSession,但如果用户关闭该应用程序,则更新将不再发生.还有其他地方吗?我可以在手表应用程序中使用不属于复杂功能的周期性功能吗?获取并发症更新数据的正确位置在哪里?
小智 26
对于watchOS 3,Apple建议您从使用复杂数据源getNextRequestedUpdateDate计划更新切换到更新并发症.
requestedUpdateDidBegin()实际上只是为了更新复杂功能.让您的复杂功能(和观看应用程序)保持最新通常涉及的不仅仅是重新加载时间线(并且异步检索数据永远不适合旧方法).
新的更好的方法是使用后台刷新应用程序任务.您可以使用一系列后台任务来安排和处理在后台被唤醒的应用扩展程序:
获取新数据
setTaskCompleted任务完成后立即调用每个任务的方法.
这个设计的一个关键特性是手表扩展现在可以处理各种前景和背景场景,其中包括:
Apple建议您使用每个机会,无论您的应用程序是在前台还是后台,都可以使您的复杂功能,应用程序和停靠快照保持最新状态.
每天可用任务总数除以停靠栏中的应用程序数量.Dock中的应用程序越少,您的应用程序可以使用的任务就越多.Dock中的应用程序越多,您可以使用的越少.
如果您的并发症处于活动状态,您的应用程序每小时至少可以唤醒四次.
如果您的并发症未激活,您的应用程序将保证至少每小时唤醒一次.
由于您的应用现在在后台运行,因此您需要高效,快速地完成后台任务.
后台任务受限于CPU时间和允许的CPU使用量.如果超过CPU时间(或在后台使用超过CPU的10%),系统将终止您的应用程序(导致崩溃).
设计优秀的Apple Watch体验中介绍了一个很好的介绍,解释何时以及为何更新您的手表应用程序.
具体而言," 保持观察应用程序最新"会话涵盖了您需要了解的所有内容,以使您的复杂功能,应用程序和停靠快照保持最新.
WatchBackgroundRefresh示例代码演示了如何WKRefreshBackgroundTask在后台更新WatchKit应用程序.