watchOS 并发症 - 重新加载超过每日预算?

Posted

技术标签:

【中文标题】watchOS 并发症 - 重新加载超过每日预算?【英文标题】:watchOS Complication – reload more than daily budget? 【发布时间】:2020-03-13 10:48:41 【问题描述】:

我正在开发一个类型为 graphicRectangular 的 watchOS Complication。诸如苹果活动或心率并发症之类的东西。这些更新经常并显示一些图形数据。

我的图表有效 - 在时间轴中显示日历事件。

我不能“每分钟”更新它。在时间线图中为实际时间设置一个标记(检查屏幕截图)会很好。但是这个想法基本上已经消失了,因为我每天只能强制更新时间线 50 次(正如我所读到的)。苹果只是说

如果您的并发症已超出其分配的每日预算 对于执行时间,对此方法的调用什么都不做。

所以我无能为力,对吧?即使我的目标不是将其提交到 AppStore 并获得审核也不行?

现在我开发了一个函数来检查文本是否需要更新(在 13:00 Lorem Ipsum 上方的屏幕截图中)或图形是否已更改,如果是则触发 reloadTimeline() 方法。因此,不仅每次都重新加载它,而且仅在必要时重新加载。但是我应该如何调用这个函数呢?我在后台任务中尝试过,但只检查“当它需要时”——我还在 ExtensionDelegate 中构建了一个可重复的 30 秒计时器。这也有效——但似乎只在 XCode 运行应用程序时有效——如果我在 XCode 中停止,那么图表几乎只会每 15 分钟更新一次(可能是后台任务)。

我还为 storeChanged() 添加了 EventKit 观察者。因此,如果日历发生更改,我可以重新加载图表。在 XCode 处于活动状态的情况下运行应用程序时,这也很有效并且引用速度很快。停止应用程序并在“XCode 之外”的手表上使用它似乎有一个严重的延迟——有时它永远不会工作。

当打开应用程序(点击复杂功能)时,storeChanged() 事件会立即触发(我认为是这个功能——我无法真正调试它,因为连接到 XCode 的每个都运行得非常快)并且在关闭应用程序后并发症被刷新。


storeChanged() 事件被超快触发然后通过 XCode 运行但极其滞后/缓慢/仅在不通过 XCode 运行时打开应用程序时触发,是否有原因?

我的 Timer 在不通过 XCode 运行时不运行是否有原因?使用 XCode 运行时,我可以从这些定时 30 秒的“检查”中看到控制台中的调试打印。但是在 XCode 之外运行时,这些似乎无关紧要。只是很少更新并发症。


另一个例子:今天早上,当我戴上手表时,昨天的图表仍然可见。因此,后台任务或计时器无法通宵工作。打开应用程序时(点击复杂功能),图表会立即刷新。


EventKit 观察者或计时器的正确位置在哪里? ExtensionDelegateComplicationController?

【问题讨论】:

【参考方案1】:

Xcode 中一切运行速度很快的原因是,当应用程序连接到调试器时,系统不会停止执行后台队列。因此,将应用程序附加到调试器将使您的所有后台队列保持活动状态。

计时器在主队列上运行。当应用程序附加到 Xcode 调试器时,主队列一直在运行。在没有调试器的情况下运行您的应用程序时,主队列会在应用程序进入后台时暂停。

要尽可能频繁地刷新您的并发症,您可以:

使用complication controller datasource Background task handler 每天 50 次刷新您的并发症 (you can trigger this from the ios App too using the WatchConnectivity framework) 如果您的应用与 extended runtime sessions 的用例匹配,您也可以尝试一下

遗憾的是,您不能做更多的事情。当您的并发症超过 Apple 限制时,它将不再刷新。所以最好每 30 分钟刷新一次。

【讨论】:

谢谢!但哪个是 ComplicationControllerDelegate?只要有一个 ExtensionDelegate 或 ComplicationController。每天刷新 50 次就足够了——这不是主要问题。主要问题是让 backgroundTask / Timer 运行以检查并发症是否需要更新。知道为什么没有 XCode 的 Timer 不能正常工作吗? 我更新了帖子,如果您还有任何问题,请告诉我 我还找到了一个为未来预先规划并发症状态的解决方案。看我的回答。【参考方案2】:

我使用getTimelineEndDate()getTimelineEntries(for: after date:) 在初始/刷新时生成所有其他计划的并发症“视图”。所以我不需要为了改变“计划内容”而刷新复杂性。

我只需要刷新它以从 EventKit 中获取更改。

【讨论】:

以上是关于watchOS 并发症 - 重新加载超过每日预算?的主要内容,如果未能解决你的问题,请参考以下文章

WatchOS 并发症

如何在 SwiftUI 中的 WatchOS 中实现 handleUserActivity?

9.20PMP每日一题

watchOS 不进入 ComplicationController

tintColor 不适用于 watchOS 5 复杂功能

WatchOS 5 如何在 WatchOS 5 中测试未来时间的复杂性,因为 Time Travel 已被删除?