iOS与Android纯数据推送通知兼容问题技术求助
解决方案:兼容Android和iOS的纯数据推送配置
要同时满足Android前后台触发onMessageReceived、iOS正常接收且允许Notification Extension修改内容,核心是利用FCM的平台专属字段做差异化配置,避开顶层notification字段的冲突:
核心思路
- 给Android:只保留
data块,不设顶层notification,确保FCM将消息识别为数据消息,前后台都会走onMessageReceived - 给iOS:通过
apns字段内嵌符合APNs要求的通知结构,既满足FCM的payload校验规则,又不会影响Android的消息处理逻辑
正确的Payload示例
{ "to": "目标设备令牌", "data": { "custom_title": "客户端需要替换的标题源数据", "custom_body": "客户端需要替换的内容源数据", "extra_info": "其他自定义业务参数" }, "apns": { "payload": { "aps": { "alert": { "title": "临时占位标题", "body": "临时占位内容" }, "mutable-content": 1 } } } }
各部分作用说明
data块:存放所有需要客户端处理的自定义数据,Android端直接从这里读取内容构建通知;iOS端在Notification Extension中从userInfo里的data字段提取数据。apns.payload.aps:专门给iOS的通知配置,提供FCM要求的基础通知结构(避免触发InvalidParameters错误),其中mutable-content:1是开启Notification Extension的关键。- 无顶层
notification字段:彻底避免Android后台直接显示系统默认通知,保证onMessageReceived被调用。
客户端处理逻辑
- Android:在
onMessageReceived方法中,直接读取remoteMessage.data中的键值对,自行构建并显示自定义通知。 - iOS:在Notification Extension的
didReceive(_:withContentHandler:)方法中,从content.userInfo["data"](需转成字典)获取自定义数据,替换content.title和content.body后,调用contentHandler(content)完成通知修改。
注意事项
- 确保iOS的Notification Extension已经在Xcode中正确配置,且开启了推送权限。
- 不要添加
content-available字段,避免触发静默推送的频率限制。 - 测试时需覆盖Android前后台、iOS前后台场景,确认消息都能按预期触发自定义处理。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

