You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:02:36