我正在为我的应用程序实现一种警报通知,使用了。当3D触摸此通知时,我希望它显示一些“警报信息”,并提供“稍后提醒”选项,该选项将在5分钟内有效地重复通知。
这一切都运行良好,只是当我点击“稍后提醒”按钮时,通知不会被解除。
我使用来修改内容,其categoryIdentifier为。然后我像这样在代码中创建了我的类别:
现在,我的通知将在3秒钟内发送。 我锁定屏幕并接收到通知,效果非常好。当我对其进行3D Touch时,我的扩展程序启动,并显示我设置的
当我调试通知扩展时,打印确实发生了。它输出了"This is happening. ActionIdentifier: snoozeActionIdentifier"。但是,通知并没有被解除。如果我从".dismiss"更改为".doNotDismiss",什么也不会改变。它仍然无法解除。如果我更改为".dismissAndForwardAction",它会解除并打开我的应用程序。
我找不到任何遇到过这个问题的人。我希望".dismiss"可以解除我的通知。为什么它不能?我做错了什么吗?
编辑: 我现在看到发生了以下两种情况:
1.我从锁定屏幕上3D-Touch通知,然后点按它外面,我的通知“折叠”并且常规通知显示为之前我3D-Touch它时的样子。
2.我从锁定屏幕上3D-Touch通知,点击“Snooze”(什么也不发生),然后点击通知外部,常规通知消失了。
因此,完成回调实际上确实解除了常规通知,但未解除扩展。为什么?我该如何解除扩展?那是必须手动调用的方法吗?
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"按钮,如图所示:(内容已删除)
当我点击"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”(什么也不发生),然后点击通知外部,常规通知消失了。
因此,完成回调实际上确实解除了常规通知,但未解除扩展。为什么?我该如何解除扩展?那是必须手动调用的方法吗?
.dismissAndForwardAction
调用完成处理程序,它会打开我的应用程序。如果我使用.dismiss
调用完成处理程序,则什么都不会发生(例如,它既不会消失也不会打开应用程序)。结果发现问题出在初始化notificationAction
时。显然,UNNotificationActionOptions
描述按钮的操作,而UNNotificationContentExtensionResponseOption
描述动作发生后通知应该执行的操作。事实证明,通知的.dismiss
与按钮的.foreground
不搭配。 - Sti