如何使用自定义操作关闭 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 关闭我的通知。为什么不是呢?我做错了什么吗?

编辑 我现在看到这两种情况正在发生:

  1. 我在锁定屏幕上 3D 触摸我的通知,然后在它外面点击,我的通知 'collapses' 和常规通知是可见的,就像我 3D 触摸它之前一样。

  2. 我在锁定屏幕上 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..")。事实证明,只需指定一个空数组 [] 就可以了。