当前知识库站点已不再维护。请移步新版知识库:https://help.rongcloud.cn/

如何在 IMLib 中实现消息已读回执?

如何在 IMLib 中实现消息已读回执?
发布时间: 2016-01-25 15:21

回答:

消息已读回执功能是指,您可以在用户查看了某个会话中的未读消息之后,向对方发送已读回执,接收方可以根据此回执,在 UI 中更新消息的显示。

比如:B 用户给 A 用户发送了单聊消息,A 查看了 B 发过来的消息后,向 B 用户发送已读回执,B 用户所在客户端可以根据此回执更新 UI 上此条消息的状态(如由“未读”改为“已读”)。

注意:消息已读回执支持单聊、群聊会话功能。

通过下面两步,即可以实现消息已读回执功能。

1、在用户查看了某单聊会话的未读消息后,调用 sendReadReceiptMessage 发送已读回执

/**
* 发送某个会话中消息阅读的回执.
* 消息回执功能目前只支持单聊, 如果使用Lib可以注册监听 setReadReceiptListener ,
* 使用kit直接设置 rc_config.xml中rc_read_receipt为true
* @param conversationType 会话类型
* @param targetId 目标会话 ID
* @param timestamp 会话中用户已经阅读的最后一条消息的发送时间戳
(Message 的 sentTime 属性),代表用户已经阅读了该会话中此消息之前的所有消息。
*/public void sendReadReceiptMessage(Conversation.ConversationType conversationType, String targetId, long timestamp)

2、通过 setReadReceiptListener() 设置消息回执监听器。这样在收到消息回执时,会回调到该监听器的 onReadReceiptReceived() 方法,从而您可以在该方法里刷新对应的消息界面等。

/**
* 消息回执监听器
*/public interface ReadReceiptListener {
  /**
   * 收到消息回执
   * @param message 封装了一个 ReadReceiptMessage
   */
  void onReadReceiptReceived (Message message);
}

/**
* 设置消息回执监听器
* @param listener 消息回执监听器
*/public static void setReadReceiptListener(final ReadReceiptListener listener)

3、在 onReadReceiptReceived() 回调里,请先判断 message.getConversationType() 和 message.getTargetId() 和当前会话一致,然后在 UI 里把该会话中发送时间戳之前的所有已发送消息状态置为已读(底层数据库消息状态已经改为已读)。

void onReadReceiptReceived (Message message) {   
if (mConversation != null && mConversation.getTargetId().equals(message.getTargetId()) && mConversation.getConversationType() == message.getConversationType()) {

      ReadReceiptMessage content = (ReadReceiptMessage) message.getContent();        
      long ntfTime = content.getLastMessageSendTime();    //获取发送时间戳  
    
      ... //自行进行UI处理,把会话中发送时间戳之前的所有已发送消息状态置为已读
  }
}