FCM V1 API浏览器通知接收问题:无Topic发送及订阅方法咨询
FCM V1 API 浏览器端通知问题及主题相关咨询
我已经从旧版FCM迁移到FCM V1 API,通过接口 https://fcm.googleapis.com/v1/projects/' . $project_id . '/messages:send 发送消息,请求头和参数如下:
$headers = [ 'Authorization: Bearer ' . $this->getGoogleAccessToken(), 'Content-Type: application/json', ]; $data = [ 'message' => [ 'notification' => [ 'title' => $title, 'body' => $body, ], 'data' => [ 'custom' => 'test' ], 'topic' => 'new-topic', ], ];
消息发送成功,但浏览器端未显示通知。现在有两个问题:
- 是否可不携带
topic参数发送消息? - 如何在浏览器端执行subscribeToTopic订阅主题?
补充:移动端使用FirebaseMessaging.instance.subscribeToTopic('new-topic')可正常接收通知。
问题解答
1. 是否可以不携带topic参数发送消息?
完全可以,但必须替换为其他合法的消息目标字段,否则请求会失败。FCM V1 API支持的目标类型包括:
- 令牌(token):单设备推送,用
token字段替换topic,值为浏览器端获取的FCM注册令牌 - 条件(condition):基于多主题的逻辑条件推送,比如
"'new-topic' in topics || 'old-topic' in topics" - 设备组(notification_key):针对一组关联设备推送
2. 浏览器端如何订阅主题?
Web端Firebase Messaging没有原生的subscribeToTopic方法,可通过以下两种方式实现:
方式一:后端通过Firebase Admin SDK处理
在你的后端服务中调用Admin SDK的订阅接口,传入浏览器端的FCM注册令牌和主题名:
// PHP Admin SDK 示例代码 $messaging = $firebase->getMessaging(); $registrationTokens = [ '浏览器端获取的FCM注册令牌', ]; $topic = 'new-topic'; // 执行订阅 $messaging->subscribeToTopic($registrationTokens, $topic);
方式二:客户端通过授权HTTP请求订阅
让后端生成合法的访问令牌,前端调用FCM的主题订阅接口:
// 浏览器端JS示例代码 async function subscribeToTopic(token, topic) { const response = await fetch(`https://iid.googleapis.com/iid/v1/${token}/rel/topics/${topic}`, { method: 'POST', headers: { 'Authorization': 'Bearer ' + '后端生成的FCM访问令牌', 'Content-Type': 'application/json' } }); const data = await response.json(); console.log('订阅结果:', data); }
注意:访问令牌需通过服务账号密钥生成,权限需包含firebase.messaging相关权限。
另外,浏览器端未收到通知还需排查:
- 浏览器是否已开启通知权限
- 前端是否正确初始化Firebase Messaging,并监听
onMessage事件(后台消息需配置setBackgroundMessageHandler) - 确认浏览器端的注册令牌已成功订阅目标主题
内容的提问来源于stack exchange,提问作者olaomt
相关产品推荐
相关产品推荐

