WidgetKit 小部件不允许每三秒刷新一次时间轴

WidgetKit widget does not allow refreshing timeline every three seconds

我创建了一个小部件,我想每三秒更新一次。

我有以下代码:

struct WidgetModel : TimelineEntry
{
    var date: Date
    var data: [Data]
}

func getTimeline(in context: Context, completion: @escaping (Timeline<WidgetModel>) -> Void)
{
    let controller = DataController()
    controller.refresh()
        
    let nextRefresh = Calendar.current.date(byAdding: .second, value: 3, to: Date())!
    let model = WidgetModel(date: nextRefresh, data: controller.data)
        
    let timeline = Timeline(entries: [model], policy: .atEnd)
        
    completion(timeline)
}

但是,这三秒将被忽略。模拟器总是显示下一次刷新将在五分钟后。我也尝试使用 .after 而不是 .atEnd,但这没有任何效果。 五分钟是最小值还是跟模拟器有关?

WWDC 会见 WidgetKit“小部件不是 every-second 操作...”https://developer.apple.com/videos/play/wwdc2020-10028/?time=1099

WidgetKit 旨在不影响用户的设备性能。它通过最小化刷新和 URLSession 请求来做到这一点。 Apple 使用有关小部件使用和可见性的指标来决定允许您的应用程序进行多少处理。不支持基于秒的刷新。

您需要提前创建一个包含小部件所有视图的时间线。在 Apple 的 WWDC 视频中,他们建议您提前为一整天创建一个时间表。创建时间线后,您可以使用 .atEnd 或 .after 策略来请求新的时间线。如果您的主应用程序发生变化,您可以要求刷新时间线。