发送FCM通知前如何校验接收方当前用户角色(买家/卖家)
解决方案
你可以通过以下三种成熟方案解决身份切换导致的推送错发问题,其中方案1完全满足你「发送前校验接收方当前身份」的需求:
方案1:服务端维护设备当前登录状态(发送前校验)
- 调整你的用户表逻辑,新增
当前登录身份、当前绑定用户ID两个字段,和设备token做关联 - 客户端每次执行登录/登出/身份切换操作时,主动调用服务端接口,更新该设备token对应的有效身份、绑定的用户ID
- 发送通知前,先查询目标token对应的当前身份,与待发送通知的目标身份匹配再发起推送,不匹配直接终止推送流程
- 优势:完全在服务端完成校验,无额外客户端逻辑,不浪费推送配额
方案2:客户端接收后静默过滤(改造成本最低)
- 不要使用FCM的
notification类型消息,将你的代码中notificationData.put("notification",data);改为notificationData.put("data",data);,改用数据类型消息 - 数据类型消息不会被系统直接弹出通知,所有消息都会先经过你客户端的FCM消息接收服务处理
- 客户端收到推送后,先对比当前登录的身份和通知目标身份,匹配才弹出系统通知,不匹配直接丢弃消息即可
- 优势:不需要调整服务端逻辑,只需要改动少量客户端和推送代码即可快速上线
// 你的推送代码修改后核心部分如下 JSONObject data = new JSONObject(); data.put("title","You have an Enquiry from: "+ name); data.put("body", enquiry); // 新增目标身份字段,用于客户端校验 data.put("targetRole", "seller"); JSONObject notificationData =new JSONObject(); // 把notification改成data notificationData.put("data",data); notificationData.put("to",token);
方案3:token绑定用户而非设备(长期最优方案)
- 调整绑定逻辑:用户登录时,将当前设备token和当前登录的用户ID做唯一绑定;用户登出时,直接解除该用户ID和当前token的绑定关系
- 发送通知时,不再直接根据token发送,而是先根据目标用户ID查询其当前绑定的有效token,再发起推送
- 优势:逻辑更规范,后续可以支持单用户多设备登录、多端同步推送等扩展需求,也从根源上避免了身份错发的问题
不推荐使用主题推送方案:除了官方的1000条推送限制外,用户切换身份时需要频繁执行订阅/退订操作,很容易出现客户端和服务端状态不同步的问题,反而增加故障概率。
内容的提问来源于stack exchange,提问作者user16881253
相关产品推荐
相关产品推荐

