消息状态及处理方式?

消息的状态指的是阅读状态,就是平常所说的已读、未读,消息状态是基于会话的概念,某个会话有几条未读消息,阅读和更改状态也都是基于会话做操作。

请注意,融云服务器端消息是没有状态的,具体状态是根据消息的发送时间(消息达到服务器端的时间)和用户阅读时间戳(用户已读的最后一条消息的发送时间)的关系来计算得知的,用户的阅读时间戳在浏览器做本地缓存(根据浏览器类型使用localStorage或者cookie),请注意保护相应缓存。

简述:

己端读消息(清未读数)后, 在清除未读数的会话中发送一条同步消息, 告知自己其他端: 此会话未读数已清空, 请调用本地清除未读数方法.

其他端收到同步消息后, 根据 会话类型(conversationType) 和 目标 id(targetId) 调用对应清除未读数方法

总结一下,状态的基本操作流程是(以 2.X SDK 为例):

1、接收到新消息后,获取某个会话的未读数

var getUnreadCount = RongIMClient.getInstance().getUnreadCount;
getUnreadCount(conversationtype,targetId,{
    onSuccess:function(count) {
        //count 会话未读数
    },
    onError:function(error){}
});

2、清理会话里的未读消息数,具体什么时机取决于对已读的界定,一般在进入会话时执行

var clearUnreadCount = RongIMClient.getInstance().clearUnreadCount;
clearUnreadCount(conversationType, targetId, {
    onSuccess: function () {},
    onError: function (errorCode) {}
});

3、同步消息状态到其他端

// 从消息里获取服务器端时间,以最近一条已读 message 为准
var msg = {
    lastMessageSendTime: message.sentTime
};
msg = new RongIMLib.SyncReadStatusMessage(msg);
var sendSyncStutus = RongIMClient.getInstance().sendMessage;
sendSyncStutus(conversationType, targetId, msg, {
    onSuccess: function () {
    },
    onError: function () {}
});

4、其他端接受并同步状态

// 其他端接收到同步消息后,调用清除未读数做更新处理
var clearUnreadCount = RongIMClient.getInstance().clearUnreadCount;
clearUnreadCount(conversationType, targetId, {
    onSuccess: function () {},
    onError: function (errorCode) {}
});

文档地址:http://doc.rongcloud.cn/im/Web/2.X/guide/private/conversation/unreadcount/web#clearUnreadCount

最后请注意:

1:清除缓存要谨慎,尽小范围的清除,绝对禁止使用localStorage.clear()这样简单粗暴的方式

2:在新的浏览器里登录时,可能会因为消息太多没法第一时间获取同步状态的消息,虽然最后结果一定会是正确,只是可能会有一个先未读再变成已读的现象。