最近在集成融云 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
好了,分享就这些,有余的中央还请留言指教,如果喜爱的记得点赞哦!