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

FCM无法立即发送Data消息及高优先级设置问题咨询

Firebase Cloud Messaging 推送问题排查与解决方案

问题梳理

你在小米、中兴设备上发送FCM Data消息时遇到了两个核心问题:

  • 使用admin.messaging().send()时多数消息发不出去
  • 使用admin.messaging().sendToDevice()无法调整优先级,而且消息经常无法送达,甚至设备从打盹模式唤醒后也收不到

先结合你提供的代码,我帮你定位问题,再给出具体的修复方案。


问题根源分析

1. send()方法的参数格式错误

你写的payload结构不符合FCM规范:把token和已废弃的delay_while_idle直接放在顶层,导致消息无法被正确解析发送。高优先级消息需要按平台配置、设备令牌、数据内容的分层结构定义。

2. sendToDevice()的优先级配置被忽略

虽然sendToDevice()是旧API,但它其实支持通过android字段设置优先级,只是你没做对应的配置。另外这个API的灵活性不如send(),官方现在更推荐使用后者。

3. 国产设备的系统限制(最关键)

小米、中兴这类国产厂商有独立的后台管理机制,会自动清理后台应用、限制推送服务。即使FCM消息发送成功,只要你的App被系统限制,设备就收不到推送。


具体修复方案

方案1:修正send()方法的消息格式

这是官方推荐的方式,结构清晰且支持高优先级配置:

const message = {
  // 目标设备令牌
  token: token,
  // Data消息内容
  data: {
    is_there_new_notification: "true"
  },
  // Android平台专属配置
  android: {
    priority: "high", // 设置高优先级,绕过Doze部分限制
    ttl: 0, // 即时送达,不缓存消息
    restrictedPackageName: "你的应用包名" // 可选,确保消息只发给你的App
  }
};

return admin.messaging().send(message)
.then((response) => {
  console.log('消息发送成功:', response);
  return response;
}).catch((error) => {
  console.log('消息发送失败:', error);
  return error;
});

注意:delay_while_idle已被废弃,设置priority: "high"会自动让消息优先送达,即使设备处于空闲状态。

方案2:给sendToDevice()添加优先级配置

如果你暂时不想切换到send(),可以这样修改payload来设置高优先级:

const payload = {
  data: { is_there_new_notification: "true" },
  // 新增Android优先级配置
  android: {
    priority: "high",
    ttl: 0
  }
};

return admin.messaging().sendToDevice(token, payload)
.then((response) => {
  console.log('消息发送成功:', response);
  return response;
})
.catch((error) => {
  console.log('消息发送失败:', error);
  return error;
});

方案3:适配国产设备的后台权限(必须做!)

这是解决推送不送达的核心步骤,国产系统的后台限制比原生Android严格得多:

  • 小米设备:
    1. 进入「设置」→「电池与性能」→「应用省电策略」
    2. 找到你的App,设置为「无限制」
    3. 进入「权限管理」,开启「自启动」和「后台弹出界面」权限
  • 中兴设备:
    1. 进入「设置」→「电池」→「应用耗电管理」
    2. 把你的App设置为「允许后台活动」
    3. 开启「自启动权限」
  • 额外建议:引导用户把App添加到桌面快捷方式或锁定任务栏,避免被系统强制清理。

方案4:优化Android端FCM服务配置

确保你的FCM服务能稳定运行:

  • 对于Android 12+,可以在AndroidManifest.xml里添加前台服务类型,提升服务优先级:
<service 
  android:name=".FirebaseFCMService" 
  android:exported="false"
  android:foregroundServiceType="dataSync">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>
  • 在onMessageReceived方法中,如果需要立即处理消息,可以启动一个前台服务(显示低优先级通知),避免服务被系统杀死。

方案5:测试Doze模式下的送达

用ADB命令模拟Doze模式,验证高优先级消息的送达情况:

# 强制设备进入Doze模式
adb shell dumpsys deviceidle force-idle
# 退出Doze模式
adb shell dumpsys deviceidle unforce

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:38:12