如何使用自定义操作关闭 3D 触摸通知?
How to dismiss 3D-touched notification with custom action?
我正在为我的应用程序实现一种警报通知,使用 UserNotifications
。当 3D 触摸此通知时,我希望它显示一些 'alert information',以及 "Snooze" 警报的选项,这将在 5 分钟内有效地重复通知。
一切正常,只是当我单击“暂停”按钮时通知没有消失。
我正在使用 NotificationContentExtension
修改内容,类别标识符 "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
关闭我的通知。为什么不是呢?我做错了什么吗?
编辑
我现在看到这两种情况正在发生:
我在锁定屏幕上 3D 触摸我的通知,然后在它外面点击,我的通知 'collapses' 和常规通知是可见的,就像我 3D 触摸它之前一样。
我在锁定屏幕上 3D 触摸我的通知,点击 'Snooze'(没有任何反应),然后点击通知以外的地方,常规通知消失。
所以完成回调实际上确实关闭了常规通知,但不是扩展。为什么?我怎样才能关闭扩展?这是我必须调用的手动方法吗?
我现在看到了我的愚蠢错误..
正如您在我上面的代码中看到的那样,我在我的类别中实例化了操作按钮:
let snooze = UNNotificationAction(identifier: "snoozeActionIdentifier", title: NSLocalizedString("SNOOZE", comment: ""), options: .foreground)
最后,我指定了选项.foreground
。对于我的目的,这应该只是一个空数组 []
。
我想我必须指定 一个 选项,并且输入类型是 UNNotificationActionOptions
,它只有选项 .authenticationRequired
("no I don't want that") .destructive
("no I don't want a red button") 和 .foreground
("well, if I have to pick one if these..")。事实证明,只需指定一个空数组 []
就可以了。
我正在为我的应用程序实现一种警报通知,使用 UserNotifications
。当 3D 触摸此通知时,我希望它显示一些 'alert information',以及 "Snooze" 警报的选项,这将在 5 分钟内有效地重复通知。
一切正常,只是当我单击“暂停”按钮时通知没有消失。
我正在使用 NotificationContentExtension
修改内容,类别标识符 "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
关闭我的通知。为什么不是呢?我做错了什么吗?
编辑 我现在看到这两种情况正在发生:
我在锁定屏幕上 3D 触摸我的通知,然后在它外面点击,我的通知 'collapses' 和常规通知是可见的,就像我 3D 触摸它之前一样。
我在锁定屏幕上 3D 触摸我的通知,点击 'Snooze'(没有任何反应),然后点击通知以外的地方,常规通知消失。
所以完成回调实际上确实关闭了常规通知,但不是扩展。为什么?我怎样才能关闭扩展?这是我必须调用的手动方法吗?
我现在看到了我的愚蠢错误..
正如您在我上面的代码中看到的那样,我在我的类别中实例化了操作按钮:
let snooze = UNNotificationAction(identifier: "snoozeActionIdentifier", title: NSLocalizedString("SNOOZE", comment: ""), options: .foreground)
最后,我指定了选项.foreground
。对于我的目的,这应该只是一个空数组 []
。
我想我必须指定 一个 选项,并且输入类型是 UNNotificationActionOptions
,它只有选项 .authenticationRequired
("no I don't want that") .destructive
("no I don't want a red button") 和 .foreground
("well, if I have to pick one if these..")。事实证明,只需指定一个空数组 []
就可以了。