Как перезагрузить временную шкалу виджета 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()