如何使用自定义操作关闭3D Touch通知?

4
我正在为我的应用程序实现一种警报通知,使用了。当3D触摸此通知时,我希望它显示一些“警报信息”,并提供“稍后提醒”选项,该选项将在5分钟内有效地重复通知。 这一切都运行良好,只是当我点击“稍后提醒”按钮时,通知不会被解除。

我使用来修改内容,其categoryIdentifier为。然后我像这样在代码中创建了我的类别:
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 Touch时,我的扩展程序启动,并显示我设置的UIView的预览,以及通知下方的"Snooze"按钮,如图所示:(内容已删除)Notification 当我点击"Snooze"按钮时,将调用UNNotificationContentExtension代理方法,具体为func didReceive(_ response: completion:) 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-Touch通知,然后点按它外面,我的通知“折叠”并且常规通知显示为之前我3D-Touch它时的样子。
2.我从锁定屏幕上3D-Touch通知,点击“Snooze”(什么也不发生),然后点击通知外部,常规通知消失了。
因此,完成回调实际上确实解除了常规通知,但未解除扩展。为什么?我该如何解除扩展?那是必须手动调用的方法吗?

我对你的问题感到困惑。你的意思是当你按下小睡时...它会打开应用程序,但小睡通知仍然停留在屏幕顶部吗? - mfaani
1
@Honey 如果我使用 .dismissAndForwardAction 调用完成处理程序,它会打开我的应用程序。如果我使用 .dismiss 调用完成处理程序,则什么都不会发生(例如,它既不会消失也不会打开应用程序)。结果发现问题出在初始化 notificationAction 时。显然,UNNotificationActionOptions 描述按钮的操作,而 UNNotificationContentExtensionResponseOption 描述动作发生后通知应该执行的操作。事实证明,通知的 .dismiss 与按钮的 .foreground 不搭配。 - Sti
1个回答

8

我现在看到了我愚蠢的错误..

正如您在上面的代码中所看到的那样,我已经实例化了我的分类操作按钮:

let snooze = UNNotificationAction(identifier: "snoozeActionIdentifier", title: NSLocalizedString("SNOOZE", comment: ""), options: .foreground)

在最后,我指定了选项.foreground。对于我的目的,这应该只是一个空数组 []
我以为我必须指定一个选项,并且输入类型是UNNotificationActionOptions,其中仅有.authenticationRequired("不,我不想要那个"),.destructive("不,我不想要红色按钮")和.foreground("嗯,如果我必须选择其中一个...")。事实证明,简单地指定一个空数组 []就可以完成任务。

1
谢谢你!这不是一个愚蠢的错误,我也曾经这样想过。这应该是可选的或者有更好的文档说明。再次感谢! - nananta
此外,您可以使用默认参数来设置选项 UNNotificationAction(identifier: typeIdentifier, title: title) - SuryaKantSharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接