Laravel发送FCM通知,Flutter端接收时data字段为空
解决Laravel推送FCM时Flutter无法接收data字段的问题
问题定位
Laravel推送FCM通知时,Flutter端能正常接收notification中的title和body,但data字段内容为空,核心原因大概率是FCM对data字段的类型要求未满足,或是变量值为空导致。
具体修复步骤
1. 确保Laravel端data字段值为字符串类型
FCM要求data中的所有值必须是字符串类型,如果你的$page或$id是数字或其他非字符串类型,json_encode后会被FCM过滤或解析失败。修改Laravel代码如下:
$payload = [ 'priority' => 'high', 'content_available' => true, 'to' => $fcm, 'notification' => [ 'body' => trim($msg), 'title' => trim($title), ], 'data' => [ 'click_action' => 'FLUTTER_NOTIFICATION_CLICK', 'page' => (string)$page, // 强制转为字符串 'id' => (string)$id // 强制转为字符串 ], ];
2. 验证Laravel端变量有效性
在推送前确认$page和$id变量不为空,可以添加日志检查:
Log::info('FCM Push Data: ', ['page' => $page, 'id' => $id]);
如果变量为空,先排查业务逻辑中赋值的问题。
3. 检查FCM请求返回结果
在Laravel中打印FCM的响应,确认推送是否成功:
$rest = curl_exec($crl); Log::info('FCM Response: ' . $rest); // 查看是否有错误提示 curl_close($crl);
如果响应中有error字段,根据提示调整(比如无效的token、权限问题等)。
4. Flutter端接收逻辑优化
确保你的firebase_messaging包版本为稳定版,同时在前台接收时,可打印完整message确认数据位置,避免遗漏:
FirebaseMessaging.onMessage.listen((RemoteMessage message) { print('Foreground message received'); // 打印完整消息结构,确认data字段是否存在 print('Full message: ${message.toMap()}'); String? page = message.data['page']; String? id = message.data['id']; // 针对部分特殊情况,fallback到notification的扩展数据 if (page == null) { page = message.notification?.android?.data?['page']; id = message.notification?.android?.data?['id']; } print('Page: $page, ID: $id'); });
额外注意事项
- 当App处于后台时,点击通知跳转的情况下,需通过
FirebaseMessaging.getInitialMessage()或FirebaseMessaging.onMessageOpenedApp获取data字段。 - 确保Flutter端的Firebase配置文件(google-services.json/GoogleService-Info.plist)正确配置,且包名/Bundle ID与FCM控制台一致。
内容的提问来源于stack exchange,提问作者poomulus
相关产品推荐
相关产品推荐

