选择通知动作时userNotificationCenter代理方法未触发问题咨询
我之前也踩过一模一样的坑,给你列几个最容易忽略的排查点,按顺序检查应该能解决:
确认代理对象的生命周期
你在application(_:didFinishLaunchingWithOptions:)里设置self.notificationCenter.delegate = self,这里的self如果是AppDelegate的话还好,但如果是自定义了其他类做代理,一定要保证这个对象是全局持有的(比如用单例、或者在AppDelegate里强引用)。要是代理对象被提前销毁,系统根本找不到回调的目标。检查方法签名是否完全匹配
尤其是用Swift开发时,因为UNUserNotificationCenterDelegate是OC协议,必须保证方法签名丝毫不差,还要加上@objc修饰。正确的Swift方法签名应该是:@objc func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 你的业务处理逻辑 completionHandler() // 必须调用这个,告诉系统你处理完了 }用OC的话也要注意方法名拼写:
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { // 处理逻辑 completionHandler(); }别漏了调用
completionHandler(),这步很容易忘,系统会因为超时判定回调失败。验证通知类别与操作的绑定
你创建UNNotificationAction后,有没有把它添加到UNNotificationCategory里,再把这个类别注册到通知中心?比如:let action = UNNotificationAction(identifier: "my_action", title: "执行操作", options: []) let category = UNNotificationCategory(identifier: "custom_category", actions: [action], intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([category])发送通知请求时,必须给
UNMutableNotificationContent的categoryIdentifier设置成对应的custom_category,否则操作按钮和通知没关联,点击后自然不会触发回调。检查通知权限的授权选项
请求通知权限时,至少要包含.alert选项,否则通知无法展开显示操作按钮:UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in // 处理授权结果 }要是只请求了
.sound或.badge,通知连操作按钮都显示不出来,更别说触发回调了。确认App状态不影响回调
不管App是前台、后台还是被杀死状态,点击通知操作按钮都应该触发这个代理方法。如果是前台收到通知时,你需要额外实现userNotificationCenter(_:willPresent:withCompletionHandler:)来决定是否显示通知,但这不会影响操作按钮的回调逻辑。
你可以按上面的顺序逐一排查,大概率是其中某一步没做到位。
内容的提问来源于stack exchange,提问作者david_miller_

