Flutter使用FirebaseMessaging ^8.0.0-dev.14实现推送及Android接收异常问询
Flutter 集成 FirebaseMessaging ^8.0.0-dev.14 推送通知实现指南
废弃API适配说明
该dev版本已完全移除旧版FirebaseMessaging.configure()全局配置方法,原有逻辑被拆分为独立的流监听与实例方法,需替换为以下方式实现全场景通知处理:
- 应用处于前台时接收推送:通过
FirebaseMessaging.onMessage.listen()订阅消息流 - 应用处于后台时,用户点击推送唤起应用:通过
FirebaseMessaging.onMessageOpenedApp.listen()订阅消息流 - 应用被完全终止时,用户点击推送唤起应用:通过
FirebaseMessaging.instance.getInitialMessage()获取启动时的关联消息
Android端收不到通知的核心排查方向
iOS可正常接收但Android异常,通常由配置错位、监听位置错误导致,按以下点逐一定位修复:
- 确认
android/app目录下的google-services.json中注册的包名,和android/app/build.gradle里设置的applicationId完全一致;避免debug构建随意添加applicationIdSuffix导致包名与Firebase控制台注册项不匹配,该类错位会直接导致FCM服务无法向目标应用实例投递消息 - Android 13及以上版本需单独申请通知展示权限,
requestPermission()会触发系统授权弹窗,禁止将权限申请逻辑放在单个业务页面的initState中——如果用户从未进入该页面,权限申请永远不会触发,通知自然无法展示 - 所有通知流的订阅逻辑必须放在应用顶层全局位置,不要放在任意业务Dart页面的
initState中;如果对应页面未被加载,订阅关系未建立,即使系统收到推送,应用端也没有对应处理逻辑触发通知展示 - 如果应用自定义了通知展示通道,需和FCM服务端发送消息时指定的
channelId完全对齐;未匹配通道的通知会被Android系统直接拦截 - 主动调用
FirebaseMessaging.instance.getToken()获取当前设备的FCM注册Token并打印日志,若返回值为空,可直接定位是Google服务配置不匹配导致的注册失败
全局初始化代码参考
替换原有单页面的零散逻辑,在应用全局入口完成初始化:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化Firebase核心实例 await Firebase.initializeApp(); // 全局注册通知监听 FirebaseMessaging.onMessage.listen((RemoteMessage message) { // 前台收到推送的自定义处理逻辑 }); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { // 后台态点击推送的跳转处理逻辑 }); // 处理终止态点击推送的启动逻辑 final initialMessage = await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) { // 自定义启动跳转逻辑 } // 全局申请通知权限 await FirebaseMessaging.instance.requestPermission(); runApp(const MainApp()); }
内容的提问来源于stack exchange,提问作者user14892930
相关产品推荐
相关产品推荐

