最近在集成融云 SDK 的时候,碰到了一个跟未读数有关的问题,现象是这样的:
比如我在其中 Web 端已经清除了某个会话的未读数然后退出,再换个设备登入,这个时候未读数还有,并没有清除掉,我就纳闷了,我明明已经清除了会话未读数的呀,怎么换个设备登入就又有了呢? 肯定是融云的 BUG ,所以我立马就提了一个工单,暗想:哈哈,给我逮着了一个 BUG (有点理解测试人员的快乐来源了)
可是事与愿违,跟融云技术人员沟通后才发现是我这边需要做多端同步未读数同步的操作
先讲讲会话未读数是什么?
- 从字面上就看出来是指某一个会话中未读消息的数量,在会话数据中 unreadMessageCount 表示当前会话的未读消息数
未读消息存在 localStorage 中,未读消息数是针对当前端的未读消息数,服务器不存未读消息数量
- 清除浏览器缓存会导致会话未读数不准确
- 若浏览器不支持或禁用 localStorage,未读消息数将不会保存,浏览器页面刷新未读消息数将不会存在
为什么需要多端同步未读数?
原因是换端登入,融云这边有消息补偿机制,即换端重新登录时,获取当天收发的所有消息,在收消息的过程中,经过 SDK 内部逻辑处理,会累加会话未读数且存在 localStorage 中 所以,如果不同步的话就会出现多端未读数不一致的情况
怎么多端同步未读数(重点来咯)
1、调用 conversation.read() 清除未读数。 2、清除成功后发送 RC:SRSMsg 类型消息进行未读数同步。 3、其他端接受到 RC:SRSMsg 类型消息,掉用 conversation.read() 方法进行本地未读数清除
看代码:
清除端
// 清除未读数
let conversation = im.Conversation.get({
targetId: '接收方的 userId',
type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.read().then(function(count) {
console.log('获取指定会话未读数成功', count);
// 发送同步消息
conversation.send({
messageType: 'RC:SRSMsg',
content: {
//从消息里获取服务器端时间,以最近一条已读 message 为准
lastMessageSendTime: message.sentTime;
}
}).then(function(message){
console.log('发送同步消息成功', message);
});
});
同步端
// 其他端在消息监听中接收到同步消息后,调用清除未读数做更新处理
// 收到同步消息进行未读数清除操作 调用 conversation.getUnreadCount() 成功后不需要再在发送 RC:SRSMsg
类型消息。
let conversation = im.Conversation.get({
targetId: '接收方的 userId',
type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.read().then(function(count) {
console.log('获取指定会话未读数成功', count);
});
总结:就是在清除未读数的时候,发送 RC:SRSMsg 类型消息,这样在其他端就能收到 RC:SRSMsg 类型消息,收到后调用清除未读数方法即可 注意:其他端不管在线或者不在线都可以监听到 RC:SRSMsg 类型消息,别忘了我们上面说的融云有消息补偿机制,想了解这个机制的话,请点击这里!
也可以参考融云的官方文档:https://docs.rongcloud.cn/v4/views/im/noui/guide/private/conversation/unreadcount/web.html#clearUnreadCount
好了,分享就这些,不足的地方还请留言指教,如果喜欢的记得点赞哦!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。