有没有办法在新通知到达时删除已发送的通知?
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
,否则扩展被杀死太快。
以上是关于有没有办法在新通知到达时删除已发送的通知?的主要内容,如果未能解决你的问题,请参考以下文章