我正在使用UserNotifications
为我的应用实施一种提醒通知。当3D触摸此通知时,我希望它显示一些警报信息'以及选项" Snooze"警报,将在5分钟内有效地重复通知。
这一切都运行正常,但单击“暂停”按钮时通知不会被解除。
我使用NotificationContentExtension
修改内容,使用categoryIdentifier "ReminderNotificationExtensionCategory"
。然后我用这样的代码创建了我的类别:
let snooze = UNNotificationAction(identifier: "snoozeActionIdentifier", title: NSLocalizedString("SNOOZE", comment: ""), options: .foreground)
let reminderCategory = UNNotificationCategory(identifier: "ReminderNotificationExtensionCategory", actions: [snooze], intentIdentifiers: [], options: .customDismissAction)
UNUserNotificationCenter.current().setNotificationCategories([reminderCategory])//Not sure if I should set this every time or just once..
然后我创建了我的通知对象
let content = UNMutableNotificationContent()
content.categoryIdentifier = "ReminderNotificationExtensionCategory"
content.title = "test"
content.body = "test"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false) //Fire in 3 seconds
let request = UNNotificationRequest(identifier: "someIdentifier, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { (error:Error?) in /**/}
现在,我的通知将在3秒后发送。
我锁定屏幕并接收它,它看起来很棒。当我3D触摸它时,我的扩展程序启动了,我在UIView
设置了一个潜行峰值,以及我在通知下面的" Snooze" - 按钮,如图所示图片:(已删除内容)
当我点击" Snooze" - 按钮时,将调用UNNotificationContentExtension
委托方法,具体为func didReceive(_ response: completion:)
完成时只接受UNNotificationContentExtensionResponseOption
的值,该值可以是.dismiss
,.doNotDismiss
或.dismissAndForwardAction
。
仅仅为了测试,我已经这样做了:
func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) {
print("This is happening. ActionIdentifier: ", response.actionIdentifier)
completion(.dismiss)
}
当我调试通知扩展时,打印确实发生了。它打印出"This is happening. ActionIdentifier: snoozeActionIdentifier"
。但是,通知没有被驳回。
如果我从.dismiss
更改为.doNotDismiss
,则不会发生任何变化。它仍然没有消失。如果我更改为.dismissAndForwardAction
,则会解散并打开我的应用。
我找不到有这个问题的人。我希望.dismiss
拒绝我的通知。为什么不呢?我做错了吗?
修改 我现在看到这两种情况正在发生:
我在锁定屏幕上触摸我的通知,然后点按其外部,我的通知“崩溃”#39;并且在3D触摸之前可以看到常规通知。
我在锁定屏幕上触摸我的通知,点按“暂停”按钮' (并且没有任何反应),然后点按通知外部,常规通知消失。
因此,完成回调实际上会解除常规通知,但不会解除扩展。为什么?我如何解雇延期?这是我必须打电话的手动方法吗?
答案 0 :(得分:7)
我现在看到了我的愚蠢错误..
正如您在上面的代码中所看到的,我已经在我的类别中实例化了操作按钮:
let snooze = UNNotificationAction(identifier: "snoozeActionIdentifier", title: NSLocalizedString("SNOOZE", comment: ""), options: .foreground)
最后,我指定选项.foreground
。为了我的目的,这应该只是一个空数组[]
。
我认为我必须指定 选项,并且输入类型为UNNotificationActionOptions
,其中只有选项.authenticationRequired
("不,我不喜欢& #39; t想要").destructive
("不,我不想要一个红色按钮")和.foreground
("好吧,如果我必须选择一个,如果这些..")。事实证明,只需指定一个空数组[]
即可。