DRF集成django-push-notifications时GCMDevice的registration_id取值问题
registration_id 参数正确取值说明 django-push-notifications 库中GCMDevice模型的registration_id字段,必须存客户端侧通过FCM SDK生成的、和用户当前使用设备唯一绑定的FCM设备注册令牌(FCM Registration Token),绝对不能像你现在代码里那样硬编码写死为"token"字符串。
取值逻辑说明
- 这个值完全由FCM客户端SDK生成,后端无法自行生成,必须由前端/移动端客户端在完成FCM初始化后获取,再通过接口传递给后端。
- 安卓客户端可通过
FirebaseMessaging.getInstance().getToken()方法获取该令牌 - iOS客户端需先获取APNs推送令牌,再交给FCM SDK交换得到对应FCM注册令牌
- Web端可通过
firebase.messaging().getToken()方法获取该令牌
- 安卓客户端可通过
正确绑定流程
你现在的用户创建逻辑里直接硬编码token的写法是错误的,正确流程应该是:
- 用户在客户端完成登录后,客户端先初始化FCM服务,拿到当前设备的有效注册令牌
- 客户端调用后端专门开发的设备绑定接口,将拿到的真实令牌、设备信息等参数传给后端
- 后端校验用户身份后,将客户端传来的真实令牌作为
registration_id值,创建对应GCMDevice记录和用户做绑定
注意事项
- FCM注册令牌不是永久有效的,用户卸载重装APP、清除APP数据、恢复设备出厂设置、FCM服务端定期轮换令牌时,旧令牌都会失效。客户端必须监听FCM的令牌刷新事件,一旦拿到新令牌就要主动调用后端接口,更新对应用户对应设备的GCMDevice记录,避免推送投递失败。
- 同一用户如果在多台设备登录,每台设备会生成独立的注册令牌,需要为每台设备单独创建GCMDevice记录,不要覆盖该用户之前的设备记录,否则会导致用户其他设备收不到推送。
- 如果你使用的是较新版本的FCM HTTP v1接口,仅在settings中配置
FCM_API_KEY已经无法满足鉴权要求,需要额外配置服务账号凭证,但不影响当前registration_id的取值逻辑。
内容的提问来源于stack exchange,提问作者imgeaslikok
相关产品推荐
相关产品推荐

