如何修复:userNotificationCenter(_:didReceive:withCompletionHandler:)未被调用?
问题排查与修复方案
1. 补全前台通知展示代理方法
当APP处于前台时,系统默认不会弹出通知横幅,导致你无法点击触发目标方法。在AppDelegate的UNUserNotificationCenterDelegate扩展中添加以下方法,允许前台显示通知:
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // 允许前台显示通知横幅、声音和角标 completionHandler([.alert, .sound, .badge]) }
2. 修正通知内容的取值逻辑
Firebase推送的通知内容默认嵌套在aps字典中,你当前的取值代码无法正确获取标题和消息(这不是方法不触发的直接原因,但会导致后续逻辑失效),替换为以下代码:
// 替换原有的title和message取值逻辑 if let aps = userInfo["aps"] as? [String: Any], let alertDict = aps["alert"] as? [String: Any], let title = alertDict["title"] as? String, let message = alertDict["body"] as? String { // 后续视图跳转逻辑... }
3. 确认代理设置的有效性
虽然你已设置UNUserNotificationCenter.current().delegate = self,但需确保代码执行顺序正确:先设置代理,再请求通知权限。当前代码顺序没问题,但可以再确认didFinishLaunchingWithOptions方法中没有其他代码覆盖代理设置。
4. 验证不同APP状态下的触发情况
- 后台状态:将APP切换到后台(不要完全退出),发送通知后点击横幅,检查控制台是否输出
didReceive method is called。 - APP完全退出状态:杀掉APP进程后发送通知,点击横幅启动APP,确认方法是否被触发。
5. 检查推送配置完整性
确认你的APNs推送证书在Apple开发者后台有效,且已正确上传到Firebase控制台;同时检查设备能正常获取FCM Token(控制台会输出Firebase registration token: xxx,确认该日志存在)。
内容的提问来源于stack exchange,提问作者Ihor Dolhalov
相关产品推荐
相关产品推荐

