Ios 如何使用自定义操作取消3D触摸通知?
我正在使用Ios 如何使用自定义操作取消3D触摸通知?,ios,objective-c,iphone,notifications,3dtouch,Ios,Objective C,Iphone,Notifications,3dtouch,我正在使用UserNotifications为我的应用程序实现一种警报通知。当3D触摸此通知时,我希望它显示一些“警报信息”,以及“暂停”警报的选项,这将在5分钟内有效地重复通知。 这一切都很好,只是当我点击“打盹”按钮时,通知没有被取消 我正在使用NotificationContentExtension修改内容,类别标识符为“提醒通知extensioncategory”。然后,我在如下代码中创建了我的类别: let snooze = UNNotificationAction(identifie
UserNotifications
为我的应用程序实现一种警报通知。当3D触摸此通知时,我希望它显示一些“警报信息”,以及“暂停”警报的选项,这将在5分钟内有效地重复通知。
这一切都很好,只是当我点击“打盹”按钮时,通知没有被取消
我正在使用NotificationContentExtension
修改内容,类别标识符为“提醒通知extensioncategory”
。然后,我在如下代码中创建了我的类别:
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
delegate方法,特别是func-didReceive(uu-response:completion:)
完成仅接受值UNNotificationContentExtensionResponseOption
,该值可以是.dismise
、.donotdismise
、或.dismissAndForwardAction
。
为了测试,我做了以下工作:
func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) {
print("This is happening. ActionIdentifier: ", response.actionIdentifier)
completion(.dismiss)
}
当我调试通知扩展时,打印确实发生了。它打印出“这正在发生。操作标识符:snoozeActionIdentifier”
。然而,该通知并未被驳回。
如果我从.disease
更改为.donotdisease
,则不会发生任何更改。它仍然没有驳回。如果我更改为.dismissAndForwardAction
,它将关闭并打开我的应用程序
我找不到有这个问题的人。我想要.discome
来取消我的通知。为什么不是呢?我做错什么了吗
编辑
我现在看到这两种情况正在发生:
因此,完成回调实际上会关闭常规通知,但不会关闭扩展。为什么?我怎样才能取消分机?这是我必须调用的手动方法吗?我现在明白我的愚蠢错误了 正如您在上面的代码中所看到的,我已将我的类别中的action按钮实例化为:
let snooze = UNNotificationAction(identifier: "snoozeActionIdentifier", title: NSLocalizedString("SNOOZE", comment: ""), options: .foreground)
在最后,我指定了选项.foreground
。就我而言,这应该是一个空数组[]
我想我必须指定一个选项,输入类型是
无提示操作选项
,它只有选项。authenticationRequired
(“不,我不想那样”)。破坏性的(“不,我不想要红色按钮”)和。前台
(“如果我必须选择一个,如果这些..”)。事实证明,只需指定一个空数组就可以了。我对您的问题感到困惑。你的意思是当你按下snooze时…它打开了应用程序,但是snooze通知仍然在你的屏幕上?@Honey如果我用调用完成处理程序。dismissAndForwardAction
它打开了我的应用程序。如果我使用.discouse
调用完成处理程序,则根本不会发生任何事情(例如,它既没有关闭也没有打开应用程序)。结果发现问题出在我初始化通知动作的时候。显然,UNNotificationActionOptions
描述了按钮的作用,而UNNotificationContentExtensionResponseOption
描述了操作发生后通知应该做什么。原来通知的.discouse
与按钮的.foreground
不匹配。谢谢!一点也不愚蠢,我也这么想。这应该是可选的,或者有更好的文档。再次感谢!除此之外,您还可以为选项UNNotificationAction(标识符:typeIdentifier,title:title)