应用被终止时如何从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
相关产品推荐
相关产品推荐

