#ios #swift #widget #ios14 #widgetkit
Вопрос:
Мы пытаемся обновлять наш домашний виджет примерно 4-5 раз в час в течение 10 часов в день после того, как наше приложение достигнет заданного состояния (мы не можем предсказать, когда именно это произойдет).
Когда приложение находится на переднем плане, все работает нормально, и, как и ожидалось, приложение находится в фоновом режиме, хотя виджет обновляется, возможно, раз в час или вообще не обновляется (фоновая обработка включена и работает должным образом) . Это кажется совершенно случайным, и в настоящее время мы просто не можем проследить или понять, что происходит или почему это происходит.
Это наш поставщик времени:
struct Provider: TimelineProvider {
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> Void) {
let preferences = UserDefaults.init(suiteName:widgetGroupId)
let title = preferences?.string(forKey: "title")
let entry = SimpleEntry(date: Date(), title: title ?? "")
completion(entry)
}
func placeholder(in context: Context) -> SimpleEntry {
...
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
getSnapshot(in: context) { (entry) in
let timeline = Timeline(entries: [entry], policy: .never)
completion(timeline)
}
}
}
Наше приложение пытается обновить домашний виджет с помощью WidgetCenter.shared.reloadAllTimelines()
.
Теперь у меня есть следующие вопросы:
- Как я могу понять, почему обновление не работает и когда оно снова станет возможным? Есть ли что-то вроде времени восстановления?
- Как я могу проверить счетчик бюджета обновления? Можем ли мы каким-то образом получить его в коде?
- Как я могу сбросить счетчик бюджета для тестирования? Должен ли я воссоздать виджет? Перезагрузить телефон? Переустановите приложение?
Ответ №1:
По моему опыту, вызов reloadAllTimelines() из любого места, кроме приложения переднего плана, кажется ненадежным. Вместо того, чтобы устанавливать политику истечения срока действия временной шкалы в .никогда, попробуйте использовать .after с датой 15 минут или около того в будущем. Это должно гарантировать, что ваш виджет обновляется ~4 раза в час с последними данными. Надеюсь, это достаточно близко для вашего варианта использования.