如何从通知响应中重新加载iOS 14小工具的时间表



我正在使用新的WidgetKit为iOS 14制作一个主屏幕小部件,我希望我的小部件时间表在用户响应通知时刷新。

这就是我的代码目前的样子:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

if response.actionIdentifier == "actionIdentifier" {        
print("notification response received")
WidgetCenter.shared.reloadAllTimelines()
}
completionHandler()
}

但是当用户响应通知时,我的小部件不会更新。打印声明被打印出来,所以我知道我的应用程序正在收到响应。当我在应用程序的其他地方调用reloadAllTimeLines()时,小部件也会被刷新,所以我确信我的小部件扩展实现正确。但在上述情况下,它并没有更新。

这是bug还是我做错了什么?或者,在用户响应通知后,是否有其他方法可以重新加载小部件时间线。

这似乎在iOS 14测试版2中得到了修复。当从通知响应中调用refreshAllTimelines((时,小部件现在会正确更新。

tldr;在应用程序处于后台时重新加载小部件似乎确实有效,但可能不会立即更新。

我最近遇到了这种情况,并添加了日志记录来确定发生了什么。如果好奇的话,我会在所有相关的地方添加NSLog,复制问题,收集sysdiagnose,并检查system_log。我测试了这个似乎是最极端的场景:在iPhone锁定、低功耗模式下、应用程序不在后台打开的情况下,从我的Apple Watch触发通知操作,并在主屏幕上添加了3个小部件。

我发现应用程序已启动,通知操作已处理,reloadAllTimelines()已按预期触发。但是小部件中的getTimelines没有被调用——直到大约24分钟后才被调用!所以它最终会更新。请注意,这并不是由于我的时间表重新加载策略——我将其设置为每天午夜只刷新一次。

iOS肯定在努力明智地处理重新加载请求,以保持电池寿命等。

试着在Dispatch Main下调用它,或者试着在延迟的情况下调用它进行测试,比如说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()
}
}
}

它就像魅力一样发挥作用。

最新更新