Я делаю виджет, который показывает сегодняшнюю дату и календарь.
Я хочу, чтобы виджет обновлялся каждую полночь, поэтому попробовал несколько способов. Но со временем я так и не понял, как это сделать.
- Сначала попробуйте: давайте записи, которые обновляются каждую полночь. Но он не обновляет виджет ровно каждую полночь.
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 я не могу использовать тихое локальное уведомление.
- Четвертая попытка: фоновые задачи
Я пробовал выполнять фоновые задачи, но он не обновляет виджет, если приложение закрывается.
Я знаю, что виджеты других популярных виджетов обновляются точно каждую полночь. Даже если я вручную изменю время устройства, они работают.
Я думаю, что есть способ оповещать расширение виджета при изменении даты.
Есть идеи, как это сделать?