iOS14 Widget обновляется каждую полночь

Я делаю виджет, который показывает сегодняшнюю дату и календарь.

Я хочу, чтобы виджет обновлялся каждую полночь, поэтому попробовал несколько способов. Но со временем я так и не понял, как это сделать.

  • Сначала попробуйте: давайте записи, которые обновляются каждую полночь. Но он не обновляет виджет ровно каждую полночь.
struct Provider: TimelineProvider {
  func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {

    var entries: [SomeEntry] = []

    let currentDate = Date()
    let currentEntry = SomeEntry(date: currentDate), content: content)
    entries.append(currentEntry)

    for offset in 1 ..< 5 {
      let day = Calendar.autoupdatingCurrent.date(byAdding: .day, value: offset, to: currentDate)!
      let midnight = Calendar.autoupdatingCurrent.startOfDay(for: day)
      let entry = SomeEntry(date: midnight, content: content)
      entries.append(entry)
    }

    completion(entries, .atEnd)
  }

}

  • Вторая попытка: динамические даты

Я попытался использовать описанные здесь динамические даты (https://developer.apple.com/documentation/widgetkit/displaying-dynamic-dates).

Но он не настраивается, поэтому я думаю, что не могу использовать его при создании виджета календаря.


  • Третья попытка: локальное уведомление

Я пробовал использовать локальное уведомление, чтобы перезагружать виджет каждую полночь.

Но я обнаружил, что в iOS я не могу использовать тихое локальное уведомление.


  • Четвертая попытка: фоновые задачи

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


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

Я думаю, что есть способ оповещать расширение виджета при изменении даты.

Есть идеи, как это сделать?


person HB.K    schedule 26.01.2021    source источник
comment
Отвечает ли это на ваш вопрос? Как изменить вид в полночь в WidgetKit, SwiftUI? Это также может помочь вам: Установка интервала обновления TimelineProvider для виджета   -  person pawello2222    schedule 26.01.2021
comment
Я пробовал эти методы, но, к сожалению, это не гарантировало обновление виджета каждую полночь.   -  person HB.K    schedule 27.01.2021
comment
Нет гарантии. На самом деле вы не можете обновить виджет, вы только просите систему обновить его. Прочтите Поддержание виджета в актуальном состоянии .   -  person pawello2222    schedule 27.01.2021
comment
@ HB.K вы пробовали использовать WidgetCenter (ручная перезагрузка) и reloadPolicy: .none.   -  person Yodagama    schedule 02.02.2021