DRF集成Firebase FCM推送 后端无法获取注册令牌问题咨询
问题解答
首先明确核心规则:FCM注册令牌(registration token)无法在后端生成,这是很多刚对接FCM推送的开发者最容易踩的认知误区。
这个令牌是Firebase客户端SDK在用户的真实设备(手机、浏览器等)上本地生成的,和「具体设备+具体安装的应用实例」强绑定,后端没有任何接口可以凭空生成合法可用的令牌,后端的职责只有接收客户端上传的令牌、存储令牌、用存储的令牌调用推送接口发消息。
正确的令牌对接流程
- 客户端侧(iOS/Android/Web前端)集成对应平台的Firebase Messaging SDK,完成SDK初始化
- 客户端初始化完成后主动调用SDK提供的获取令牌方法,拿到合法token后,调用你DRF项目编写的上传接口,将token和当前登录用户ID、设备类型等信息绑定后存入数据库
- 客户端需要监听Firebase SDK的token刷新回调,当应用重装、用户清除应用数据、token过期触发刷新时,要把新的token重新上传到后端,替换数据库里旧的失效token
- 后端发送推送时,直接从数据库取出对应用户/设备的有效token,调用FCM Admin SDK的发送方法即可
可以参考下面的DRF侧存储设备令牌的最简模型实现:
# models.py from django.db import models from django.conf import settings class FCMDevice(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="fcm_devices" ) registration_token = models.CharField(max_length=255, unique=True) device_type = models.CharField( max_length=10, choices=[("ios", "iOS"), ("android", "Android"), ("web", "Web")] ) is_active = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True)
后续写个对应的DRF序列化器和仅登录用户可访问的接口,接收客户端上传的token即可。
管理后台发测试通知报错的排查方向
从你提供的报错信息来看,核心错误为Requested entity was not found,按优先级排查以下问题即可:
- 优先检查你填的测试token是否有效:如果你填的是自己随便编的假token、或者是已经失效的旧token,必然会报这个错。必须用客户端SDK真实生成的、和当前Firebase项目匹配的有效token才能测试成功
- 检查Firebase Admin SDK初始化配置是否正确,参考标准初始化代码:
import firebase_admin from firebase_admin import credentials, messaging # 替换为你从Firebase后台下载的服务账号密钥文件的本地路径 cred = credentials.Certificate("path/to/your/firebase-service-account-key.json") if not firebase_admin._apps: firebase_admin.initialize_app(cred)
要确保你用的服务账号密钥,和客户端集成SDK时用的是同一个Firebase项目,跨项目的token完全无法使用
3. 检查对应云项目下的Firebase Cloud Messaging API是否已经启用,不要用已经废弃的Legacy Cloud Messaging接口
4. 如果用真实有效token测试仍然报错,就检查你使用的第三方DRF推送包(如果你是用第三方包对接FCM而非自己实现Admin SDK逻辑)的版本是否过旧,配置项是否和包要求的一致。
内容的提问来源于stack exchange,提问作者Just Silent
相关产品推荐
相关产品推荐

