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

如何在FCM REST API中管理主题?Cloudflare Workers场景求助

解决方案:通过FCM REST API管理主题订阅

FCM的主题管理确实有REST接口,只是未在主题管理文档中单独高亮,以下是适配Cloudflare Workers原生fetch环境的具体实现方案:

1. 单个设备订阅/取消订阅主题

订阅主题

调用iid.googleapis.com的端点发送POST请求,完成单个设备的主题订阅:

  • 请求端点:https://iid.googleapis.com/iid/v1/{设备Token}/rel/topics/{主题名}
  • 请求头需包含:
    • Authorization: Bearer {你的FCM服务器密钥}
    • Content-Type: application/json
  • 请求体传空JSON对象{}即可

Cloudflare Workers代码示例:

async function subscribeToDeviceTopic(deviceToken, topicName, fcmServerKey) {
  const res = await fetch(
    `https://iid.googleapis.com/iid/v1/${deviceToken}/rel/topics/${topicName}`,
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${fcmServerKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({})
    }
  );

  if (!res.ok) {
    const errMsg = await res.text();
    throw new Error(`订阅失败: ${res.status} - ${errMsg}`);
  }

  return res.json();
}

取消订阅主题

在订阅端点后添加查询参数?operation=remove,请求方式仍为POST:

async function unsubscribeDeviceFromTopic(deviceToken, topicName, fcmServerKey) {
  const res = await fetch(
    `https://iid.googleapis.com/iid/v1/${deviceToken}/rel/topics/${topicName}?operation=remove`,
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${fcmServerKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({})
    }
  );

  if (!res.ok) {
    const errMsg = await res.text();
    throw new Error(`取消订阅失败: ${res.status} - ${errMsg}`);
  }

  return res.json();
}

2. 批量管理主题订阅

如果需要一次性处理多个设备,使用批量操作端点可减少请求次数,更适配Cloudflare Workers场景:

批量订阅

  • 请求端点:https://iid.googleapis.com/iid/v1:batchAdd
  • 请求体需包含目标主题和设备Token数组:
{
  "to": "/topics/{主题名}",
  "registration_tokens": ["token1", "token2", "..."]
}

代码示例:

async function batchSubscribeTopics(deviceTokens, topicName, fcmServerKey) {
  // 单次批量最多支持1000个Token,超过需分批处理
  if (deviceTokens.length > 1000) {
    throw new Error("单次批量操作最多支持1000个设备Token");
  }

  const res = await fetch('https://iid.googleapis.com/iid/v1:batchAdd', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${fcmServerKey}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      to: `/topics/${topicName}`,
      registration_tokens: deviceTokens
    })
  });

  if (!res.ok) {
    const errMsg = await res.text();
    throw new Error(`批量订阅失败: ${res.status} - ${errMsg}`);
  }

  return res.json();
}

批量取消订阅

只需将端点替换为https://iid.googleapis.com/iid/v1:batchRemove,请求体格式与批量订阅一致。

关键注意事项

  • 使用Firebase控制台获取的FCM服务器密钥(项目设置→云消息传递→服务器密钥),该密钥需具备FCM管理权限
  • 在Cloudflare Workers中,建议将服务器密钥存储为环境变量,避免硬编码泄露
  • 处理响应时需关注错误状态码(如401表示权限无效,404表示设备Token已失效),返回的错误文本会包含具体原因
  • 批量操作单次最多支持1000个Token,超过时需手动拆分请求分批处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:35:06