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

