Обновление фона виджета iOS 14 не происходит — как получить информацию о счетчике диагностики / обновления бюджета?

#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. Как я могу понять, почему обновление не работает и когда оно снова станет возможным? Есть ли что-то вроде времени восстановления?
  2. Как я могу проверить счетчик бюджета обновления? Можем ли мы каким-то образом получить его в коде?
  3. Как я могу сбросить счетчик бюджета для тестирования? Должен ли я воссоздать виджет? Перезагрузить телефон? Переустановите приложение?

Ответ №1:

По моему опыту, вызов reloadAllTimelines() из любого места, кроме приложения переднего плана, кажется ненадежным. Вместо того, чтобы устанавливать политику истечения срока действия временной шкалы в .никогда, попробуйте использовать .after с датой 15 минут или около того в будущем. Это должно гарантировать, что ваш виджет обновляется ~4 раза в час с последними данными. Надеюсь, это достаточно близко для вашего варианта использования.