Виджет WidgetKit не позволяет обновлять временную шкалу каждые три секунды

Я создал виджет, который хочу обновлять каждые три секунды.

У меня такой код:

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, но это не дало никакого эффекта. Минимальное значение - пять минут или это связано с симулятором?

1 ответ

Решение

WWDC Meet WidgetKit "Виджеты - это не ежесекундная операция..." https://developer.apple.com/videos/play/wwdc2020-10028/?time=1099

WidgetKit разработан так, чтобы не влиять на производительность устройства пользователя. Это достигается за счет минимизации обновлений и запросов URLSession. Apple использует показатели об использовании и видимости виджетов, чтобы решить, какой объем обработки разрешить вашему приложению. Обновления на основе секунд не поддерживаются.

Вам необходимо заранее создать временную шкалу со всеми видами виджета. В видеоролике Apple о WWDC они рекомендуют заранее создать график на целый день. После создания временной шкалы вы можете использовать политики.atEnd или.after для запроса новой временной шкалы. Если что-то изменится в вашем основном приложении, вы можете попросить обновить временную шкалу.

Другие вопросы по тегам