UNUserNotificationCenter.current().getDeliveredNotifications 只返回一个空数组
Posted
技术标签:
【中文标题】UNUserNotificationCenter.current().getDeliveredNotifications 只返回一个空数组【英文标题】:UNUserNotificationCenter.current().getDeliveredNotifications only ever returns an empty array 【发布时间】:2018-01-08 07:26:40 【问题描述】:基本上,我只是尝试打印我的应用已发送的通知,但执行以下操作:
UNUserNotificationCenter.current().getDeliveredNotifications (notifications) in
print(notifications)
在 Xcode 控制台中只显示一个空数组,即使通知中心包含多个传递的通知。 (print(notifications.count)
返回 0)
我可以使用getPendingNotificationRequests
成功获取已安排但未送达的通知,更新它们,甚至使用removePendingNotificationRequests(withIdentifiers:)
将其删除。但是任何访问/修改/删除已交付的任何内容的尝试都不起作用。
我在这里遗漏了一些简单的东西吗?最近 ios 10+ 访问传递的通知的方式是否发生了变化?
【问题讨论】:
【参考方案1】:getDeliveredNotification
确实遇到了同样的问题,通知数组总是空的。
所以,我意识到我正在将[UIApplication sharedApplication].applicationBadgeNumber
设置为0
,清除通知中心的所有远程通知。
现在我只有在收到所有待处理通知后才将applicationBadgeNumber
设置为0
。
【讨论】:
就我而言,我没有设置applicationBadgeNumber
;仍然收到空的已传递通知数组。
抱歉,您的推送通知可能需要更新徽章计数才能使用getDeliveredNotification
。你能测试一下吗?
什么,你的意思是你应该手动增加它?我计划在未来触发本地通知,并在通知触发后检查此功能(我试图让removeDeliveredNotifications(withIdentifiers:)
工作,但通知始终留在通知中心)
抱歉,我不知道您说的是本地通知。在推送通知的情况下,您可以在推送通知的有效负载中发送徽章计数!虽然你看看这个线程 ***.com/a/20780778/3052059 是否对你有帮助。 :)
嗯,那个特定的线程是 iOS 10 之前的版本,使用了已弃用的 API。在此处使用新的UNUserNotificationCenter
等。【参考方案2】:
我在UNNotificationServiceExtension
上使用的时候是空的,原来我需要使用信号量来防止扩展返回0结果:
let semaphore = DispatchSemaphore(value: 0)
let center = UNUserNotificationCenter.current()
center.getDeliveredNotifications notifications in
defer
semaphore.signal()
let relatedNotificationIdentifiers = notifications.filter notification in
notification.request.content.userInfo["callId"] as? String == callId
&& notification.request.identifier != request.identifier
.map(\.request.identifier)
// This call is async
center.removeDeliveredNotifications(withIdentifiers: relatedNotificationIdentifiers)
// ...so this call needs to be done with a slight delay because otherwise
// it will be killed before it is done removing the notifications
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1)
contentHandler(bestAttemptContent)
semaphore.wait()
此外,最后它需要等待执行removeDeliveredNotifications
,这也是异步的。
apns-collapse-id
可以帮助减少传入的 APNS 消息。
【讨论】:
以上是关于UNUserNotificationCenter.current().getDeliveredNotifications 只返回一个空数组的主要内容,如果未能解决你的问题,请参考以下文章
UNUserNotificationCenter.current().getDeliveredNotifications 只返回一个空数组
我如何知道 UNUserNotificationCenter 的 removeAllPendingNotificationRequests() 何时完成?
UNUserNotificationCenter 需要将Present code
使用 UNUserNotificationCenter 后没有调用 didReceiveLocalNotification