有没有办法在新通知到达时删除已发送的通知?

Posted

技术标签:

【中文标题】有没有办法在新通知到达时删除已发送的通知?【英文标题】:Is there any way to remove delivered notifications upon arrival of a new one? 【发布时间】:2019-02-07 03:43:17 【问题描述】:

大约在去年第三季度,我不仅能够使用UNNotificationServiceExtension 来解密传入的推送通知内容(一个常见用例),而且还可以在每次收到新通知时删除之前发送的通知。

我使用UNUserNotificationCenter.current().getDeliveredNotifications 检索已发送的通知,然后删除我需要删除的通知。

然而,随着新年的到来,我突然注意到我的应用不再从通知中心删除以前发送的通知,尽管代码仍然存在于服务扩展中并且没有抛出任何错误,并且尽管其他服务扩展中的代码运行良好。

经过调试,我发现UNUserNotificationCenter.current().getDeliveredNotifications 现在会返回一个空的通知数组,即使在锁定屏幕上有多个通知。

UNUserNotificationCenter.current().removeAllDeliveredNotifications() 根本不做任何事情,所以即使只是使用该调用,而不检索或过滤传递的通知,也不会删除任何内容。

有谁知道是否还有办法做到这一点?

或者 Apple 是否会禁止此功能?

【问题讨论】:

您是否希望在收到并安排新的通知之前一直存在已发送的通知,或者先发送通知然后将其删除? 理想情况下,我需要按threadIdentifier 过滤并删除所有以前传递的特定类型的通知,而不是堆叠它们,但我也愿意在每次新的通知时删除所有以前传递的通知一个进来。这曾经是可能的,但UNUserNotificationCenter.current().removeAllDeliveredNotifications()由于某种原因已经停止在通知服务扩展中工作。 如果你有标识符,你可以使用函数'UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [reminder.Identifier])' 来删除传递的通知,对你有用吗?跨度> 没有。正如我在原始帖子中所说,也不再可能在服务扩展中检索传递的通知。也不能使用UNUserNotificationCenter.current().removeAllDeliveredNotifications()UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [reminder.Identifier])。从本质上讲,UNUserNotificationCenter.current() 方法似乎都不再适用于 UNNotifiationServiceExtension,我不知道为什么。 如果 API 行为不正确,您应该在 bugreport.apple.com 上针对 API 提交错误 【参考方案1】:

似乎apns-collapse-id APNs 请求标头在这里可能有用。

    可用于更新以前的通知内容并将其置于顶部。

    具有相同折叠标识符的多个通知将作为单个通知显示给用户。

    根据docs,apns-collapse-id 指定通知identifier(通常是随机的)。 BE 可以在有效负载中使用给定 id 发送一个新的“删除”通知,以在removeDeliveredNotifications(withIdentifiers:) 函数中使用它。

【讨论】:

有什么理由相信removeDeliveredNotifications(withIdentifiers:) 会做任何事情而removeAllDeliveredNotifications() 什么都不做?此外,apns-collapse-id 不能由任何基于云的后端设置(例如,我没有使用 100% 自定义构建的后端),因为它是 APNS HTTP 标头的一部分。我能够设置的唯一属性是 APS JSON dictionary 中的属性。 我在使用 removeAllDeliveredNotifications 时遇到了问题(例如,在 11.2 上),但 removeDeliveredNotifications(withIdentifiers: 仍然可以正常工作。雷达被告知要在 11.3 中修复(例如 35676570 )。这是blogpost 以及一些其他可能的解决方法。然而,尽管如此,如前所述,您应该检查现有的为 ios 12 打开的雷达,并在需要时打开一个新的雷达。 我去年使用了那篇文章中提到的在 userInfo 中使用自定义有效负载 id 的解决方法,这就是停止工作的原因,所以现在看起来一切都坏了。我确实提交了一个错误报告,但我想我现在只能满足于让相同类别的通知堆叠。 哇,这真的还是一个错误吗? getDeliveredNotifications 在 iOS 13 中仍然无法使用 @KyleRedfearn 原来这实际上是一个异步问题。基本上,getDeliveredNotifications 和所有删除方法都是异步的。您可以通过仅在完成块中运行通知服务扩展的contentHandler() 来确保 getDeliveredNotifications 方法运行,但通知删除方法没有完成块。我最近刚刚询问了 Apple 代码级别的支持,解决这个问题的唯一方法是使用计时器延迟(我们使用 DispatchQueue.main.asyncAfter)来运行 contentHandler,否则扩展被杀死太快。

以上是关于有没有办法在新通知到达时删除已发送的通知?的主要内容,如果未能解决你的问题,请参考以下文章

通知发送,接收不到通知的处理办法

有没有办法在发送本地通知时运行一些代码?

推送通知到达时间

有没有办法在 MS 团队中发送活动提要通知?

有没有办法在 pwa 中安排离线通知?

(统一)有没有办法在引用的对象实例被删除/丢失时得到通知?