会话列表分页拉取实现方案?
会话列表加载及刷新方案如下:
1. 首次打开应用登录 IM,通过分页拉取会话列表,只分页调用
getConversationList
拉取数据一次(建议条数:100 条),等用户上滑至底部再拉取下一页会话列表数据。2. 之后有新增会话或会话更新时,上层通过 IM
V2TIMConversationListener
监听回调处理:2.1
onNewConversation
:当上层收到此回调时,可直接把新增的会话添加到会话列表适配器内,也就是调用 .addxxx
添加数据。2.2
onConversationChanged
:当上层收到此回调时需要对已加载的会话数据做更新,可能存在当前 UI 层 还没有加载到对应会话数据的情况,因此要分开处理:触发
onConversationChanged
的会话已在 UI 层加载,则更新下拉列表中对应已加载的会话数据并刷新 UI。触发
onConversationChanged
的会话还没添加到适配器内,判断不存在时,也走 .addxxx
添加数据逻辑。2.3
onConversationDeleted
:当上层收到此回调时,需要移除对应的会话 item 数据,也可能存在当前 UI 层还没有加载到对应会话数据的情况,因此要分开处理:触发
onConversationDeleted
的会话已在 UI 层加载,则移除对应的会话数据,并刷新 UI。触发
onConversationDeleted
的会话还没添加到适配器内,判断不存在时,忽略不处理。PC 端如何实现类似微信/企微首次进入聊天页面,自动生成仅本地存在一个临时会话需求?
具体方案:
通过 IM 搜索能力,搜索到匹配数据后发起聊天,点击进入聊天页面,先调用
TIMConvGetConvInfo
接口,判断本地是否已经存在对应的会话缓存。本地已存在情况:走当前默认逻辑,不做任何处理。
本地暂不存在缓存情况:调用
TIMMsgSaveMsg
接口插入一条“本地自定义消息”,消息内容 Message -> kTIMMsgExcludedFromLastMessage
设置为true
(此条消息不计入会话 lastMessage
),该消息仅作为激活会话能力,不做实际显示。最终表现:
只要不卸载重装、清除缓存或更换设备,后续再登录依然也能拉取到。
首次打开应用登录,当会话未读数发生变化时,不触发 onTotalUnreadMessageCountChanged
(会话未读总数监听回调),如何解决?
对于
onTotalUnreadMessageCountChanged
未读总数监听回调,需要先主动调用一次 getTotalUnreadMessageCount
获取会话未读总数接口才会触发。客户端怎么实现:删除不在群内或群已解散的会话?
具体方案如下:
1. 大多数情况下,被踢或群解散,都会收到
V2TIMGroupListener
对应的监听回调,业务层在收到回调后调用 deleteConversation
接口删除对应会话即可。2. 不过也会出现收不到回调的情况,例如在多台设备都登录过同一账号且本地都有已解散的群会话缓存,因为回调只会触发一次,所以只有其中一个设备会收到,其他设备自然也就无法通过回调删除。
这种情况下业务层需要做补充处理:
方案一:调用
getGroupMemberList
只获取群主的资料,如果报错了,说明已经不在群内或群已解散,再调用 deleteConversation
接口删除会话。方案二:调用
getJoinedGroupList
接口获取已加群列表与 getConversationList
返回的会话数据做比对,如会话列表数据中的某个群会话并不在当前加群列表内,则删除会话。发送群消息时,已经设置了“不计入未读”,但对方接收消息后,未读数依然产生,是什么原因?
1. IM 服务端对于忽略未读消息计数有数量限制,1000条以内的消息,最多储存100条忽略未读计数的消息数量。
2. 当群内陆续产生的忽略未读数的消息过多,总量超过100条时,受 IM 服务端当前限制所致,就算接收到的消息设置了不计入未读或消息为定向消息,依然会产生未读数。
3. 群会话未读数计算方式:未读数 = 群 lastSequence - readSequence - ignore_sequence
此问题的处理方案:建议客户做已读上报处理。
调用 getConversationList
总是返回 data
为空,该如何处理?
