使用OneSignal向特定分组推送通知的技术实现咨询
搞定按用户分组推送通知的方案
核心思路
咱要实现精准的分组推送,关键就是把用户设备的推送令牌(Push Token)和用户所属的分组在服务器端做关联绑定——之前全量推送是因为服务器不知道哪些设备属于哪个分组,绑完之后就能精准定位目标设备了。
具体操作步骤
1. 用户登录时,绑定设备令牌和分组
用户登录成功后,前端得把当前设备的推送令牌(比如APNs的deviceToken、FCM的registrationToken)和用户信息一起传给服务器。服务器收到后,在数据库里存好关联关系:
- 如果是新设备,就把
用户ID、设备令牌、用户的分组编号(从登录返回的用户信息里拿)存入专门的设备关联表; - 如果是老设备,就更新对应的分组信息(防止用户换了分组还收到旧分组的通知)。
前端可以这么写(在登录成功的回调里加这段逻辑):
// 假设登录成功后拿到了用户信息userInfo,设备令牌存在localStorage里 function onLoginSuccess(userInfo) { const pushToken = localStorage.getItem('devicePushToken'); if (pushToken) { // 发请求给服务器绑定 fetch('/api/bind-device-group', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userId: userInfo.id, pushToken: pushToken, groupId: userInfo.groupId // 从用户信息里取分组编号 }) }); } }
2. 服务器端建个设备-分组映射表
建议在数据库里新增一张表,比如叫device_group_mapping,字段至少要有:
id(主键)user_id(关联你的用户表)push_token(设备的推送令牌)group_id(关联你的分组表)created_at、updated_at(记录时间戳,方便排查问题)
这样以后要发分组通知时,直接根据group_id就能查出所有对应的设备令牌,不用再全量推送了。
3. 修改推送逻辑,按分组筛选令牌
把原来全量推送的代码改成按分组筛选令牌的逻辑,举个Node.js的例子:
// 服务器端推送逻辑示例 async function sendGroupNotification(groupId, notificationContent) { // 从映射表中捞该分组下所有的设备令牌 const deviceTokens = await db.query( 'SELECT push_token FROM device_group_mapping WHERE group_id = ?', [groupId] ); // 调用推送服务商的接口发通知(这里以FCM为例) if (deviceTokens.length > 0) { await fcm.sendMulticast({ tokens: deviceTokens.map(item => item.push_token), notification: notificationContent }); } }
4. 处理分组变更的情况
如果用户的分组变了,得及时更新服务器端的映射表:
- 可以在后端修改用户分组的接口里,同步更新该用户所有绑定设备的
group_id; - 或者前端每次启动应用、用户登录时,都重新发一次绑定请求,确保分组信息是最新的,这样更稳妥。
几个要注意的点
- 设备令牌会变:像iOS的deviceToken,用户重装应用、系统更新后可能会变,所以应用启动时要重新获取令牌,然后同步给服务器更新;
- 注销登录要解绑:用户注销后,服务器最好把该设备的关联记录标记为无效,避免给已注销的用户发通知;
- 权限校验不能少:服务器推送前要确认用户确实属于目标分组,防止数据同步出问题导致推错人。
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

