firebase Realtime Database在线计数异常下聊天app push notification实现咨询
Firebase 在线计数异常解决方案
使用Firebase Realtime Database自带的*存在检测(Presence)*能力即可解决客户端异常断开的计数不准问题,该能力由服务端自动监听连接状态,不需要依赖客户端主动上报操作,具体实现逻辑如下:
- 废弃原有的单整数字段
online,新增节点online_users,每个进入聊天界面的用户在该节点下创建独立子节点,key使用用户唯一UID,value可存进入时间戳或布尔值true - 进入聊天界面时,先为当前用户的子节点注册断开自动删除操作:
firebase.database().ref('online_users/' + currentUid).onDisconnect().remove(),该规则会预先提交到Firebase服务端,只要服务端检测到客户端断开连接(杀应用、断网、进程被清理等场景),就会自动删除对应子节点,无需客户端触发 - 监听
online_users节点的子节点数量,该数值即为当前活跃在聊天界面的人数,直接替代原online字段的逻辑即可 - 正常点击内置返回按钮退出聊天界面时,主动删除当前用户的
online_users下对应子节点即可,服务端会自动取消预先注册的断开删除规则 - 如果是一对一聊天场景,可直接判断目标用户的
online_users/{targetUid}节点是否存在,比统计总人数的准确性更高,可避免多用户场景的计数偏差
Push Notification 通用工作原理
推送通知依赖厂商/第三方推送服务商维持的系统级长连接通道实现,不需要应用在后台存活也能接收通知,通用流程如下:
- 应用首次启动时向推送服务商(iOS为APNs,安卓为各厂商推送服务、FCM等)注册,获取当前设备的唯一推送令牌(Token),应用将该Token上传到业务服务端,和用户ID绑定存储
- 业务服务端需要下发通知时,将通知内容、目标用户对应的推送Token打包为请求,发送到推送服务商的服务端接口
- 推送服务商校验Token有效性后,通过自身和目标设备维持的系统级长连接,将通知内容下发到设备
- 设备系统收到通知后,不需要启动对应应用,直接在系统通知栏展示内容,用户点击通知后才会唤起对应应用执行后续逻辑
补充说明:安卓设备如果用户关闭了应用的通知权限、或者将应用加入后台活跃限制名单,可能会无法收到推送;iOS设备如果用户关闭了应用的通知权限,也会收不到推送。
内容的提问来源于stack exchange,提问作者Sawan
相关产品推荐
相关产品推荐

