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

使用FCM Admin发送APN后台更新静默通知时出错

解决FCM Admin发送无badge/sound的静默通知报错问题

我之前在使用FCM Admin发送静默通知时也踩过完全一样的坑!明明苹果开发者指南里的Listing 7-1明确说可以只带content-available: 1,但用FCM发送就报错,加了badge或sound就正常,这其实是FCM转发APNs通知时的规则差异导致的。

问题根源

苹果文档里的示例是直接向APNs发送的payload格式,但FCM作为中间转发层,对静默通知有两个关键要求:

  1. 必须显式设置APNs的优先级为5(正常优先级),高优先级(10)要求通知必须包含可见内容(alert/badge/sound),否则APNs会拒绝;
  2. 需要同时配置FCM层面的content_available: true,确保FCM正确识别这是一条静默通知并转发给APNs。

如果只在aps里加content-available:1,FCM会默认使用高优先级,这就触发了APNs的校验规则,导致通知被拒绝报错;而添加badge/sound后,高优先级符合要求,所以能正常发送。

正确的FCM Payload示例

下面是符合要求的、仅携带data字段的静默通知代码(以Node.js的FCM Admin SDK为例):

const admin = require('firebase-admin');

// 初始化FCM Admin(已初始化可跳过此步骤)
admin.initializeApp();

const sendSilentNotification = async (deviceToken) => {
  const message = {
    token: deviceToken,
    // 自定义data字段,供客户端接收后处理
    data: {
      extra1: "your_custom_value_1",
      extra2: "your_custom_value_2"
    },
    apns: {
      payload: {
        aps: {
          "content-available": 1 // APNs要求的静默标识
        }
      },
      headers: {
        "apns-priority": "5" // 必须设置为正常优先级,静默通知专用
      }
    },
    // FCM层面的静默标识,确保FCM正确处理
    content_available: true
  };

  try {
    const response = await admin.messaging().send(message);
    console.log('静默通知发送成功:', response);
  } catch (error) {
    console.error('发送失败:', error);
  }
};

客户端处理提示

客户端收到这条静默通知后,会触发didReceiveRemoteNotification:fetchCompletionHandler(iOS),你可以在这个方法里读取extra1和extra2,然后创建自定义本地通知,完全不需要依赖FCM推送的可见内容。

注意事项

  • 不要设置aps里的alert、badge、sound字段,保持aps仅包含content-available:1;
  • 确保客户端开启了“后台App刷新”权限,否则静默通知可能无法触发后台处理;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:03:36