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

应用被终止时如何从Firebase获取推送通知的自定义数据

FCM杀进程场景丢失自定义数据解决方案

根因说明

FCM推送分为三类:通知消息、数据消息、混合消息(同时携带通知内容和自定义数据)。应用被终止时,FCM SDK会直接接管系统通知栏的渲染逻辑,此时默认不会将自定义数据主动传递给应用层,只有用户点击通知拉起应用时才会触发数据传递,混合消息如果没有配置对应接收逻辑,就会出现自定义数据为null的情况。

Android端修复步骤

  • 不要仅依赖FirebaseMessagingService的onMessageReceived方法获取数据,该方法仅在应用前台/后台存活时触发,应用被杀死时不会回调
  • 在应用启动页的onCreate方法中读取Intent携带的Extras,用户点击通知拉起应用时自定义数据会通过该渠道传递,参考代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();
    if (intent.getExtras() != null) {
        for (String key : intent.getExtras().keySet()) {
            // 遍历即可拿到所有自定义字段
            Object value = intent.getExtras().get(key);
        }
    }
}
  • 若需要应用被杀死时无需用户点击也能后台处理数据,必须发送纯数据消息,不要携带通知字段,此时FCM会主动唤起应用的FirebaseMessagingService处理逻辑,自定义数据可正常读取
  • 国产Android系统需将应用加入电池优化白名单,避免FCM进程被系统冻结导致数据丢失

iOS端修复步骤

  • 确保推送payload中添加content-available: 1配置,同时开启应用的后台刷新权限
  • 在AppDelegate的didFinishLaunchingWithOptions方法中读取启动参数,应用被杀死时点击通知的自定义数据会通过该参数传递,参考代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    if let userInfo = launchOptions?[.remoteNotification] as? [AnyHashable: Any] {
        // 此处即可读取所有自定义数据
        print(userInfo)
    }
    return true
}
  • 不要通过Firebase控制台发送带通知内容的混合消息做测试,控制台生成的测试消息在iOS杀进程场景下会自动过滤自定义数据,建议直接调用FCM服务端接口发纯数据消息验证

通用配置注意事项

  • 自定义数据的key不要使用FCM预留字段,例如notification、data、priority等,避免被FCM SDK默认过滤
  • 发送混合消息时,确保自定义数据放在data字段下,不要和notification字段平级

内容的提问来源于stack exchange,提问作者Kate Jo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:45:11