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

