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

使用Go SDK时,能否通过主题与设备令牌组合发送FCM消息?

FCM主题与设备令牌组合发送的可行性及解决方案

结论

FCM 不支持在同一条Message结构体中同时指定Topic和Token(包括批量令牌列表)字段,这两个字段是互斥的——发送消息时只能选择其中一种目标类型:要么给指定令牌的设备发,要么给订阅主题的所有设备发。

业务场景适配方案

结合你“用户可开关多场景通知,每个场景对应一个主题”的需求,正确的实现方式应该是通过设备订阅/取消订阅主题来管理推送范围:

  • 当用户开启某个场景的通知时,调用FCM的订阅接口,将该用户的设备令牌订阅到对应场景的主题;
  • 当用户关闭某个场景的通知时,调用取消订阅接口,移除该设备令牌与对应主题的关联;
  • 后续给场景发通知时,直接发送主题消息即可,FCM会自动推送给所有订阅了该主题的设备,无需手动维护令牌列表和主题的关联关系。

Go SDK示例代码

订阅设备到主题

import (
    "context"
    "firebase.google.com/go/messaging"
)

func subscribeToTopic(client *messaging.Client, deviceToken string, topic string) error {
    ctx := context.Background()
    _, err := client.SubscribeToTopic(ctx, []string{deviceToken}, topic)
    return err
}

取消设备的主题订阅

func unsubscribeFromTopic(client *messaging.Client, deviceToken string, topic string) error {
    ctx := context.Background()
    _, err := client.UnsubscribeFromTopic(ctx, []string{deviceToken}, topic)
    return err
}

发送主题消息

func sendTopicNotification(client *messaging.Client, topic string, title, body string) error {
    ctx := context.Background()
    msg := &messaging.Message{
        Topic: topic,
        Notification: &messaging.Notification{
            Title: title,
            Body:  body,
        },
        // 可按需添加Data字段传递自定义数据
        // Data: map[string]string{"key": "value"},
    }
    
    _, err := client.Send(ctx, msg)
    return err
}

注意事项

FCM的Message结构体中,Token、Topic、Condition、RegistrationToken这些目标字段都是互斥的,同一消息只能设置其中一个,否则会触发API错误。

内容的提问来源于stack exchange,提问作者Tung Luong Thanh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:20:23