默认
发表评论 7
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 求教RainbowChat-Web中如何实现IM消息的“已读”功能?
阅读(31253) | 评论(7 收藏 淘帖
知道对方是否阅读,在消息对话框增加显示已读功能,有好得建议?

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

推荐方案
评论 7
这个把逻辑理一下,无非是两件事情:
1)你界面上,该怎么介定哪条消息是被读过了;
2)读过的消息,你得通知对方“已读”;

实现上,无非就是:
1)应该通过JS来判定消息在UI上的可见性,这个具体的实现,是纯前端的事情,你去查一下资料,或找五些demo参考;
2)通知对方“已读”,你就需要加一条“已读”指令,以便及时通知对方。
A发送者,B接收者,C服务端,
A发送两条消息给B,而B没有查看消息,B用户首页消息显示好友A有两条未读的消息,如果B选中首页消息的好友A未读后对话消息显示,是在点击首页消息好友A触发通知对方A消息“已读”。
B用户如何去介定A发送这两条消息被读过(我意思如何拿到这两消息的key,当光标主动移到这里的时候,还是B用户主动点击了这里(首页消息好友item按钮),那就假定他已经看到了之前未读的消息,此时就发回执),加一条已读指令,在rbchat_config.js那个模块加下这条指令已读指令,拿到这两条消息msgid拼成json,去请求标记单聊消息已读接口,返回历史消息已读状态字段值改变,刷新历史聊天记录让对方A聊天UI刷新。
引用:ATONY 发表于 2019-11-20 16:04
A发送者,B接收者,C服务端,
A发送两条消息给B,而B没有查看消息,B用户首页消息显示好友A有两条未读的消息 ...

写了这么大一片,总结一下,你的问题:是不是你不知道怎么知道(或读取到)UI上显示的哪条消息它对应的消息ID?
选中后聊天对话如何取到未读的消息的msgId,是根据光标光标主动移到消息还是点击首页消息的好友item触发取到消息的msgid
所谓的消息已读回执,就是双方聊天时,如果对方看到了你新发的信息,这条消息在你这端就会标为“已读”,否则将是“未读”。
A发送一条消息给B,B接收了,如果B此时打开聊天主界面,查看了消息,B就再发一条“回执”(携带有B已读的消息Id)给A,A这时根据“回执”中的消息Id,标注已读。
那么根据整个功能流程,首先,增加一个状态位的属性toReadStatus,来区分消息是否被对方读了;还需要增加一个属性toReadMessageId,这个属性主要用在“回执”当中,用来告诉对方,我读了你的哪条消息,以便对方标注。
如果消息带有toReadMessageId,那么它就不是一条消息,而是一条“回执”,而“回执”是不需要显示在会话列表或聊天面板中的,因此,我们需要在接收消息的时候判断一下,如果是“回执”,则不显示也不存储到数据中。
因此在发送回执的时候也要根据场景分成两种情况,在会话列表中,我们肯定不能将消息状态置为已读,只有打开聊天主界面,并且此条消息在屏幕中时,才可以发送回执。因此,在我们打开主界面时,我们要判断一下有哪些消息是处于未读状态并且是处于当前屏幕上的,将这些状态的回执发给对方。  
引用:ATONY 发表于 2019-11-20 16:28
选中后聊天对话如何取到未读的消息的msgId,是根据光标光标主动移到消息还是点击首页消息的好友item触发取 ...

做这种功能,千万别靠猜,或者自已在这里瞎想,最好的办法就是找个主流的IM去研究一下它的实现思路,必竟人家是经过大量用户验证过的,不会有什么体验问题。

你可以去看看钉钉、旺旺这些有已读回执的im里,web端的实现思路,详细地研究一下。
要在node层加一条指令通知A,B收到A一条消息,B要通知消息已读,在node如何加一条指令通知A的逻辑
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部