如何在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
相关产品推荐
相关产品推荐

