经过几天的复杂工作后,我有信心对按规定间隔发生的更新的更新过程进行以下说明:
- The system calls
requestedUpdateDidBegin()
- This is where you can determine if your data has changed. If it hasn't, your app doesn't have to do anything. If your data has changed, you need to call either:
-
reloadTimelineForComplication
如果您的所有数据都需要重置。
-
extendTimelineForComplication
如果您只需将新项目添加到复杂功能时间线的末尾。
- 注意:系统可能实际调用
requestedUpdateBudgetExhausted()
代替requestedUpdateDidBegin()
如果您当天花费了过多的并发症时间预算。这就是这个问题的由来。
- 如果你打电话
reloadTimelineForComplication
,系统会调用getCurrentTimelineEntryForComplication
(以及获得数组的未来和过去的变体,具体取决于您的时间旅行设置)
- 这是推测,因为我还没有测试过,但我相信如果你打电话
extendTimelineForComplication
那只有getTimelineEntriesForComplication(... afterDate date: NSDate ...)
会被称为。
- 然后系统会调用
getNextRequestedUpdateDateWithHandler
这样您就可以指定您的并发症需要多长时间进行新的更新。
苹果的文档非常清楚,你不应该太频繁地要求更新,或者在复杂功能代码中进行太多处理,否则你会耗尽你的时间预算,并且你的复杂功能将停止更新。所以,我的问题是:你们在何时何地进行更新?
对于上下文,我的场景是返回数据每小时最多更改两次的 URL。
放置 URL 获取代码的最明显位置是func requestedUpdateDidBegin()
获取数据,存储,如果没有变化,就返回。如果有更改,则延长或重新加载时间线。
然而,URL 获取的成本可能很高。备择方案:
- 将代码放在手机应用程序上并通过
WCSession
,但如果用户关闭该应用程序,则更新将不再发生。
- 使用推送更新,但这不是网络应用程序,所以我没有地方发送它们。
- 显然,当用户与手表应用程序交互时,我将更新所有数据,但这意味着它仅在用户使用应用程序时才会更新,这消除了复杂性的需要。
还有其他地方吗?我可以在手表应用程序中添加不属于复杂功能的周期性功能吗?哪里是获取复杂功能更新数据的正确位置?
对于 watchOS 3,Apple 建议您不再使用复杂功能数据源getNextRequestedUpdateDate https://developer.apple.com/reference/clockkit/clkcomplicationdatasource/1628062-getnextrequestedupdatedatewithha计划更新以更新您的并发症。
watchOS 2 的旧方式
requestedUpdateDidBegin()
实际上只是为了更新复杂性而设计的。使您的复杂功能(和手表应用程序)保持最新通常涉及的不仅仅是重新加载时间线(并且异步检索数据永远不适合旧方法)。
watchOS 3 的新方式
新的更好的方法是使用后台刷新应用程序任务 https://developer.apple.com/reference/watchkit/wkextensiondelegate#1806957。您可以使用一系列后台任务来schedule https://developer.apple.com/reference/watchkit/wkextension/1650848-schedulebackgroundrefresh and handle https://developer.apple.com/reference/watchkit/wkextensiondelegate/1650877-handle您的应用程序扩展在后台被唤醒:
-
获取新数据
- using WKWatchConnectivityRefreshBackgroundTask https://developer.apple.com/reference/watchkit/wkwatchconnectivityrefreshbackgroundtask从手机获取数据,或
- using WKURLSessionRefreshBackgroundTask https://developer.apple.com/reference/watchkit/wkurlsessionrefreshbackgroundtask从服务器下载数据
- 数据到达后更新您的模型,
- 从模型更新您的复杂性(通过重新加载或延长时间线),最后
- 更新应用程序的扩展坞快照以显示扩展坞上的数据
调用每个任务的setTaskCompleted
任务完成后立即使用方法。
使用应用程序任务的其他好处
此设计的主要特点之一是手表扩展现在可以处理各种前景和背景场景,其中包括:
- 当您的应用程序/并发症启动时最初加载数据,
- 当扩展被后台任务唤醒时,在后台更新数据,以及
- 当用户从 Dock 恢复您的应用程序时,在前台更新数据。
Apple 建议您利用提供的每一个机会无论您的应用程序是在前台还是后台让您的复杂功能、应用程序和扩展坞快照保持最新。
有什么限制吗?
每天的可用任务总数除以 Dock 中的应用程序数量。扩展坞中的应用程序越少,您的应用程序可以利用的任务就越多。扩展坞中的应用程序越多,您可以使用的应用程序就越少。
由于您的应用程序现在在后台运行,因此您需要高效、快速地完成后台任务。
后台任务受到允许的 CPU 时间量和 CPU 使用率的限制。如果您超过 CPU 时间(或在后台使用超过 10% 的 CPU),系统将终止您的应用程序(导致崩溃)。
了解更多信息
一个很好的介绍解释了何时以及为何更新您的手表应用程序,其中包括设计出色的 Apple Watch 体验 https://developer.apple.com/videos/play/wwdc2016/804/.
具体而言,让您的手表应用程序保持最新状态 https://developer.apple.com/videos/play/wwdc2016/218/会议涵盖了您需要了解的所有内容,以确保您的复杂功能、应用程序和扩展坞快照保持最新状态。
观看背景刷新 https://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.html示例代码演示了如何使用WKRefreshBackgroundTask
在后台更新 WatchKit 应用程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)