在实现了 多端未读数同步 下,还出现了下面问题:
-
多端登入情况下,多端未读数不一致
-
web 获取总未读数与每个会话展示的数据累计不一致,一般是总未读数会大于所有会话未读数累加
分析(根因分析、需求分析)
web 没有本地数据库,未读数是根据离线消息或者补偿消息累加计算到浏览器缓存( localstorage)中,受到离线消息存储时间(1 - 7 天)影响,个别场景下,无法做到未读数多端完全一致,也会出现获取总未读数接口与每个会话累加的未读数出现不一致的情况。
-
多端登入情况下,多端未读数不一致场景:
比如:A 用户在设备1的 B 会话未读数有 10 个没有清除,这个时候设备 1 下线,在设备 2 登入,清除B会话未读数。7 天后,重新再设备 1 重新登入,因为过了离线存储时间,设备 1 收不动设备 2 发过来的未读数同步消息,所以设备1 无法进行清除,未读数还是 10 -
web 获取总未读数与每个会话展示的数据累计不一致场景:
从上面未读数存储逻辑已知是存储浏览器缓存中,所以总未读数接口也是将缓存中的所有会话未读数累加后再返回给业务层。出现不一致的情况肯定是浏览器缓存的会话数据大于了实际获取会话列表数据。一般下面操作会造成这种现象:
a. 用户有删除会话动作,但是删除会话前没有清空该会话的未读数
b. web 只能拉取远端 1000 个会话,但是离线消息中有 10001 个会话的消息,那么该情况总未读数会大于每个会话未读数累加之和
c. 浏览器缓存数据影响
下图是如何在 localstorage 中确认会话的未读数:
4371721960324_.pic1097×745 57.6 KB
解决方案
未读数不一致的情况,实际就是缓存数据没有对应上,但是受离线消息影响也的确无法做到实时一致。只能清空浏览器会话缓存数据,让后续的未读数能累加正确,所以 SDK 提供了清除所有会话接口,详情请参考:会话未读数 | 融云开发者文档