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

如何在FirebaseMessagingService中查看RemoteMessage的优先级?

解答:验证FCM消息优先级及休眠时接收问题

首先,完全可以在onMessageReceived()中获取RemoteMessage的优先级,不过可能是你在调试时的小细节没注意到,我来一步步帮你梳理:

1. 获取消息优先级的正确方式

Firebase Messaging SDK确实提供了getPriority()方法来获取消息优先级,但你需要注意两个关键点:

  • 确保你的Firebase Messaging SDK版本是较新的(建议使用23.0.0及以上版本,旧版本可能未提供该方法)
  • 不要过度依赖IDE调试界面的自动补全,直接手动调用方法打印即可

在你的FirebaseMessagingService的onMessageReceived()里添加这段代码:

@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    
    // 获取并打印优先级
    int priorityValue = remoteMessage.getPriority();
    String priorityLabel = priorityValue == RemoteMessage.PRIORITY_HIGH 
        ? "HIGH" 
        : priorityValue == RemoteMessage.PRIORITY_NORMAL 
            ? "NORMAL" 
            : "UNKNOWN";
    
    Log.d("FCM_DEBUG", "Received message priority: " + priorityLabel + " (" + priorityValue + ")");
    
    // 处理你的业务逻辑...
}

优先级对应的常量值:PRIORITY_HIGH为1,PRIORITY_NORMAL为0。

2. 休眠时消息不工作的补充排查

你已经设置了高优先级,但设备休眠时仍有问题,除了优先级,还要考虑这些常见的厂商系统限制:

  • 后台进程管控:小米、华为、OPPO等国内厂商的系统有严格的后台管控机制,即使是高优先级FCM消息,也可能被拦截。需要引导用户:
    • 将应用加入「后台白名单」或「受保护应用」列表
    • 开启应用的「自启动权限」
    • 关闭应用的「电池优化」选项
  • TimeToLive设置:你设置了timeToLive: 0,意味着消息如果无法立即投递就会被丢弃,这在设备休眠时很容易导致消息直接丢失。建议根据业务场景调整这个值,比如设置为86400(24小时)
  • 消息类型差异:你发送的是纯data消息,这类消息会直接触发onMessageReceived(),但深度休眠下部分厂商可能会延迟投递;如果是通知消息,系统会负责展示通知,唤醒设备的效果可能更稳定(当然这取决于你的业务需求)

3. 发送端代码确认

你的Node.js代码设置优先级的方式是正确的:

const options = { priority: "high", timeToLive: 0 };
return admin.messaging().sendToTopic("MyTopic", data, options);

这里的priority: "high"会对应客户端的PRIORITY_HIGH,配置没有问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:13:46