^9.1.2版本firebase_messaging初始化代码无法运行的修改咨询
firebase_messaging 9.1.2 版本初始化代码适配方案
原代码无法运行的核心原因
- 存在语法结构错误,
FirebaseMessaging.onMessage.listen方法的闭合括号提前截断,导致后续的onLaunch、onResume回调参数全部错位塞入getNotificationSettings的参数列表中,直接引发编译报错 - 9.x版本的
getNotificationSettings方法仅用于获取/申请通知权限,不接收任何消息回调参数,原代码将消息监听逻辑绑定到该方法的写法完全不符合API定义 - 9.x版本废弃了旧版
onLaunch/onResume的回调式写法,所有消息交互逻辑均改为Stream订阅模式 - 9.x版本的消息对象类型为
RemoteMessage,与旧版直接传递Map<String, dynamic>的参数格式不兼容
调整后可正常运行的完整代码
Future initialize(context) async { // 单独执行通知权限获取逻辑,移除原方法中错误塞入的回调参数 NotificationSettings settings = await FirebaseMessaging.instance.getNotificationSettings(); // 未授权时主动申请通知权限 if (settings.authorizationStatus == AuthorizationStatus.notDetermined) { settings = await FirebaseMessaging.instance.requestPermission(); } // 应用处于前台时收到推送消息的监听,对应原onMessage逻辑 FirebaseMessaging.onMessage.listen((RemoteMessage message) async { String rideRequestId = getRideRequestId(message.data); retrieveRideRequestInfo(rideRequestId, context); }); // 应用处于后台时,用户点击通知打开应用的监听,对应原onResume逻辑 FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async { print("onMessageOpenedApp: $message"); String rideRequestId = getRideRequestId(message.data); retrieveRideRequestInfo(rideRequestId, context); }); // 应用被完全杀死(终止状态)时,用户点击通知打开应用的监听,对应原onLaunch逻辑 RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) { String rideRequestId = getRideRequestId(initialMessage.data); retrieveRideRequestInfo(rideRequestId, context); } }
配套适配注意事项
- 原有
getRideRequestId方法的入参需要调整为接收Map<String, dynamic>类型的消息业务数据,不要直接传入整个RemoteMessage对象,否则会出现类型不匹配问题 - 若需要处理后台静默推送,需要单独定义顶级的
onBackgroundMessage回调函数,不能将该回调写在类内部的方法中 - 若需要自定义前台推送的展示样式,可在
onMessage监听中通过message对象的notification字段单独处理,无需额外配置回调参数
内容的提问来源于stack exchange,提问作者yassine guenidi
相关产品推荐
相关产品推荐

