You need to enable JavaScript to run this app. 集成firebase_auth 0.18.1后iOS真机前台推送onMessage失效问题求助
优惠活动
大模型
产品
解决方案
定价
更多

集成firebase_auth 0.18.1后iOS真机前台推送onMessage失效问题求助

该版本组合下的onMessage失效核心原因
  • iOS端原生代理被意外覆盖:你使用的firebase_auth: 0.18.1在iOS编译层存在已知的方法交换逻辑,会在初始化时重写UNUserNotificationCenter的代理绑定关系,直接覆盖掉firebase_messaging: ^7.0.2自动注册的通知回调代理。你之前尝试微调两个库的版本号没有解决问题,本质是这个冲突存在于两个库的iOS原生编译层,属于跨插件的代理抢占问题,不是Dart层的版本兼容问题能覆盖的。因为后台状态下的APNs推送是走系统进程级的唤醒链路,不依赖这个前台代理的回调,所以应用最小化时能正常收消息;而安卓端的推送回调链路不依赖iOS这套通知代理机制,因此完全不受影响。
  • 插件初始化顺序不匹配:Flutter 1.22.6版本的插件注册机制对依赖顺序有强约束,如果你在App启动阶段提前触发了firebase_auth的初始化,没有等firebase_messaging的代理完成绑定,就会出现代理被auth模块抢占的问题。这个问题在该版本线的两个库组合下是复现率极高的已知冲突。
  • 前台消息拦截逻辑被重置:firebase_messaging 7.0.2版本的onMessage回调触发,必须满足两个前提:一是通知权限申请完成,二是原生层正确配置了前台消息的展示策略。被auth模块覆盖的代理逻辑里没有实现willPresentNotification的回调分支,导致应用处于前台时,系统会直接拦截所有推送消息,根本不会把消息分发到Flutter层的onMessage方法。

适配你当前版本环境的可落地修复方案

  • 在iOS原生入口AppDelegate中,手动将Messaging.messaging()设置为UNUserNotificationCenter的代理,绕开插件自动注册的冲突逻辑,对应OC版代码:
    if (@available(iOS 10.0, *)) {
        [UNUserNotificationCenter currentNotificationCenter].delegate = Messaging.messaging;
    }
    
  • 调整Dart层的回调绑定时机:不要在插件初始化阶段直接调用_firebaseMessaging.configure(),等Firebase.app()初始化完成、Auth模块的实例加载完毕之后,再执行推送回调的绑定逻辑。
  • 手动补充前台展示策略的代理实现,避免系统拦截前台推送,对应Swift版代码:
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.banner, .sound, .badge])
    }
    

内容的提问来源于stack exchange,提问作者Damian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 07:15:04