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

Flutter中如何获取iOS活跃通知的Payload?

Flutter中如何获取iOS活跃通知的Payload?

嘿,我来帮你捋捋这个让人头疼的问题~

首先得明确:iOS端的通知payload处理和Android有不少差异,你遇到activeNotifications[0].payload返回null的情况,大概率是远程通知的payload没有被正确传递到Flutter的通知插件中,或者FCM的消息格式没配置对。下面分情况给你拆解:

1. 先搞清楚:远程通知 vs 本地通知的payload逻辑

你问的“要不要在调用show()时加payload”——这个只针对本地通知:如果是你在App里手动调用show()触发的本地通知,确实需要在方法参数里传入payload,这样后续从activeNotifications里才能拿到对应的值。但你的情况是FCM推送的远程通知,根本不需要在本地调用show(),问题出在远程通知的传递和解析上。

2. 检查FCM的APNS消息格式

iOS对APNS的payload结构有严格要求,系统只认aps字段下的内容,而你自定义的payload(或者想获取的内容)不能嵌套在aps里面,得放在aps的同级位置。比如正确的FCM消息格式应该是这样的:

{
  "apns": {
    "payload": {
      "aps": {
        "alert": {
          "title": "title",
          "body": "body"
        }
      },
      "custom_payload": "你需要的自定义数据"
    }
  },
  "data": {
    "custom_payload": "你需要的自定义数据"
  }
}

为什么还要加data字段?因为iOS在前台收到通知时,有些插件会优先读取data里的内容,后台则读取APNS的payload,双保险能避免丢失。

3. 确认通知插件的iOS配置(以flutter_local_notifications为例)

如果你用的是主流的flutter_local_notifications插件,得确保iOS端的配置没漏:

  • 在Info.plist里开启远程通知权限:添加UIBackgroundModes并包含remote-notification
  • 在AppDelegate.swift里正确处理APNS通知,把payload传递给插件。比如在didReceiveRemoteNotification方法里,调用插件的didReceiveRemoteNotification方法来转发payload
  • 初始化插件时,要设置iOSInitializationSettings,确保允许接收远程通知

4. 如何正确获取活跃通知的payload

当通知被系统展示后,你通过activeNotifications获取时,插件应该会把APNS里的自定义payload(或者FCM的data字段)填充到payload属性里。如果还是拿不到,可以试试在通知回调里先捕获payload:
比如在onDidReceiveNotificationResponse回调里,直接打印response.payload,看看能不能拿到值——如果这里能拿到,说明activeNotifications的问题可能是插件的缓存逻辑,你可以手动把payload存起来备用。

最后总结下

  • 远程通知不需要调用本地的show()传payload,重点在FCM的消息格式和插件配置
  • 自定义数据一定要放在APNS的aps字段外面,同时在FCM的data字段也存一份
  • 检查iOS原生端的通知转发逻辑,确保payload能传递到Flutter插件

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:07:57