UNNotificationCenterDelegate在通知dismiss时未调用问题咨询
Apple Watch自定义Dismiss通知动作无回调问题排查与解决
嘿,我之前在做WatchOS通知功能的时候也踩过一模一样的坑!让我帮你捋捋问题出在哪,以及怎么解决~
首先得明确:系统自带的通知关闭按钮(也就是默认的dismiss操作)是不会触发userNotificationCenter(_:didReceive:withCompletionHandler:)回调的,只有你自己定义的dismiss动作才会触发。如果你的自定义dismiss动作没触发回调,大概率是这几个地方没配置对:
1. 自定义Dismiss动作的配置是否正确
你需要确保自定义dismiss动作被正确添加到通知分类(UNNotificationCategory)中,并且推送的payload里指定了对应的分类ID。
比如正确的动作创建代码应该是这样的:
func applicationDidFinishLaunching() { UNUserNotificationCenter.current().delegate = self // 创建自定义动作"a1" let a1Action = UNNotificationAction(identifier: "a1", title: "执行A1", options: [.foreground]) // 创建自定义dismiss动作(注意这里的identifier要唯一,别用系统默认的) let customDismissAction = UNNotificationAction(identifier: "custom_dismiss", title: "关闭", options: []) // 创建通知分类并关联动作 let notificationCategory = UNNotificationCategory( identifier: "watch_custom_category", actions: [a1Action, customDismissAction], intentIdentifiers: [], options: [] ) // 注册分类到系统 UNUserNotificationCenter.current().setNotificationCategories([notificationCategory]) }
2. 推送Payload必须关联正确的分类ID
你的远程推送payload里必须包含category字段,值要和你创建的分类ID完全一致,否则通知不会显示你的自定义动作,自然也不会触发回调。
示例payload:
{ "aps": { "alert": { "title": "测试通知", "body": "这是一条带自定义动作的Watch通知" }, "category": "watch_custom_category" } }
3. 确保代理方法正确实现且代理已设置
检查这两个关键点:
- 你已经在
applicationDidFinishLaunching里设置了UNUserNotificationCenter.current().delegate = self,而且没有被后续代码意外覆盖; - 你完整实现了
userNotificationCenter(_:didReceive:withCompletionHandler:)方法,并且在方法末尾调用了completionHandler()(这个很重要,不调用的话系统可能会忽略后续操作)。
完整的代理方法示例:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print("收到通知动作回调:\(response.actionIdentifier)") switch response.actionIdentifier { case "a1": // 处理自定义动作a1的逻辑 print("执行A1动作") case "custom_dismiss": // 处理自定义dismiss动作的逻辑 print("执行自定义关闭动作") case UNNotificationDefaultActionIdentifier: // 处理默认点击动作 print("执行默认动作") default: break } // 必须调用这个方法告诉系统你已处理完动作 completionHandler() }
4. 额外排查点
如果上面的配置都没问题还是没回调,可以试试这些操作:
- 重启你的Apple Watch和Xcode,有时候系统缓存会导致通知分类不生效;
- 检查你的WatchOS扩展的Info.plist,确认
NSExtensionPrincipalClass已经设置为你的ExtensionDelegate类; - 给自定义dismiss动作加上
.foreground选项,强制唤醒扩展到前台,测试是否能触发回调(虽然后台也应该能触发,但有些情况下WatchOS会限制后台扩展的执行)。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

