UNNotificationRequest 需要唯一标识符,但也会触发重复项

Posted

技术标签:

【中文标题】UNNotificationRequest 需要唯一标识符,但也会触发重复项【英文标题】:UNNotificationRequest requires unique identifier, but fires on duplicates too 【发布时间】:2017-09-27 00:56:45 【问题描述】:

我这样称呼本地通知

        let center = UNUserNotificationCenter.current()
        let content = UNMutableNotificationContent()
        content.title = title
        content.body = text
        content.categoryIdentifier = category
        content.userInfo = map
        content.sound = UNNotificationSound.default()
        content.setValue("YES", forKeyPath: "shouldAlwaysAlertWhileAppIsForeground")
        let request = UNNotificationRequest(identifier: "testing", content: content, trigger: nil)
        center.add(request)

每次使用相同的 UNNotificationRequest 标识符(一个不变的字符串)。根据文档

标识符

请求的唯一标识符(如果标识符不唯一,则不会创建新的通知请求对象)。您可以稍后使用此标识符来取消仍待处理的请求。此参数不能为 nil。

https://developer.apple.com/documentation/usernotifications/unnotificationrequest/1649633-init

每次我触发本地通知时都会触发它,即使在应用程序的同一个实例中也是如此。标识符始终相同。文档有误吗?

【问题讨论】:

你不应该重复使用相同的标识符。 我知道这是不好的做法,而且我不在生产代码中。但是在测试过程中,我看到的与文档相矛盾,因为他们说“未创建对象”,但在同一标识符上发送了一个新通知。 确保取消之前的预定通知 ***.com/questions/42882832/… 不知道那个^链接如何回答我关于为什么使用相同的标识符两次仍然有效的问题。 【参考方案1】:

此时文档已更正且更准确: https://developer.apple.com/documentation/usernotifications/unnotificationrequest/1649633-init

系统使用标识符参数来确定如何处理 请求:

如果您提供唯一标识符,系统会创建一个新通知。 如果标识符与之前发送的通知匹配,系统会再次提醒用户,将旧通知替换为 新通知,并将新通知置于列表顶部。 如果标识符与待处理请求匹配,则新请求将替换待处理请求。

【讨论】:

以上是关于UNNotificationRequest 需要唯一标识符,但也会触发重复项的主要内容,如果未能解决你的问题,请参考以下文章

具有 UNNotificationRequest 的计算属性返回无法将类型“Void”的返回表达式转换为返回类型“[UNNotificationRequest]”

可以有多个未完成的 UNNotificationRequest 吗?

UNNotificationRequest 仅在 iPhone 解锁时播放自定义声音

UNNotificationRequest 中的开始和结束日期

从请求中检索 UNNotificationRequest 声音名称

动作按钮的 Swift UNNotificationRequest 标识符点击了本地通知