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

Xcode UI测试如何处理UNUserNotificationCenter生成的通知权限

关于如何继续 UNUserNotificationCenter 64 限制的问题