Как перезагрузить временную шкалу виджета iOS 14 из ответа на уведомление?

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

Вот как сейчас выглядит мой код:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        
  if response.actionIdentifier == "actionIdentifier" {        
            print("notification response received")
            WidgetCenter.shared.reloadAllTimelines()
        }

   completionHandler()
    }

Но мой виджет не обновляется, когда пользователь отвечает на уведомление. Оператор печати печатается, поэтому я знаю, что мое приложение получает ответ. Виджет также обновляется, когда я вызываю reloadAllTimeLines() где-нибудь еще в моем приложении, поэтому я уверен, что расширение моего виджета реализовано правильно. Но это не обновление в приведенном выше сценарии.

Это ошибка или я что-то не так делаю? Или есть другой способ перезагрузить временную шкалу виджета после того, как пользователь ответит на уведомление.

5 ответов

Решение

Похоже, это исправлено в iOS 14 beta 2. Виджет теперь корректно обновляется при вызове метода refreshAllTimelines() из ответа на уведомление.

Попробуйте вызвать его в разделе "Основная диспетчеризация" или попробуйте вызвать его с задержкой, например, 2 секунды.

Я вызываю то же самое в списке SwiftUI, что и

let listArray = ["Item1", "Item2", "Item3"]
List(listArray) { listObject in
    Button(action: {
        WidgetCenter.shared.reloadAllTimelines()
    }) {
        HStack {
            Text(listObject)
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading)
                .padding()
        }
    }
}

И это работает как шарм.

тлдр; Перезагрузка ваших виджетов, когда приложение находится в фоновом режиме, кажется, работает, однако оно может не обновляться сразу.

Недавно я столкнулся с этим и добавил ведение журнала, чтобы определить, что происходит. Если интересно, я сделал это, добавивNSLogвезде, где это уместно, воспроизводя проблему, собирая sysdiagnose и изучая файлы system_logs. Я протестировал этот сценарий, который кажется наиболее экстремальным: запустить действие уведомления с моих Apple Watch с заблокированным iPhone, в режиме низкого энергопотребления, с приложением, не открытым в фоновом режиме, и с тремя виджетами, добавленными на главный экран.

Я обнаружил, что приложение было запущено, действие уведомления было обработано иreloadAllTimelines()сработал как и ожидалось. НоgetTimelinesв виджете не было вызвано - не раньше, чем через 24 минуты! Так что в конце концов он будет обновляться. И обратите внимание, что это было не из-за моей политики перезагрузки временной шкалы — у меня установлено обновление только один раз в день в полночь.

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

Просто позвоните ниже

WidgetCenter.shared.reloadTimelines(ofKind: "KindOfWidget")

Не забудьте также импортировать WidgetKit.

Первый:

import Widget

Когда вы хотите обновить:

WidgetCenter.shared.reloadAllTimelines()
Другие вопросы по тегам