即时通信 IM Unity(历史消息)

这篇说说腾讯云IM拉取历史消息的接口MsgGetMsgList,支持单聊和群聊,可拉取本地或云端消息,云端存储时长因版本而异(体验版/专业版7天,旗舰版30天,企业版90天),网络异常时自动返回本地消息。 拉取单聊/群聊历史消息:调用MsgGetMsgList接口,支持分页拉取,首次last_msg设为null,后续用返回的最后一条消息续拉。 分页拉取:通过last_msg和count参数实现,建议count设为20。

相关产品
即时通信 IM 产品页,含版本规格、价格与购买入口。

一、功能描述

·拉取历史消息的接口为 MsgGetMsgList (点击查看详情)

·支持单聊、群聊历史消息的拉取。

·除了支持单独拉取本地历史消息外,还支持拉取云端历史消息。

注意:说明:

注意:在拉取云端历史消息时,如果检测到网络异常,SDK 会返回本地存储的历史消息。

本地存储的历史消息无时间显示,但云端存储的历史消息有存储时长的限制:

·体验版:免费存储 7 天,不支持延长。

·专业版:免费存储 7 天,支持延长。

·旗舰版:免费存储 30 天,支持延长。

·企业版:免费存储 90 天,支持延长。

注意:说明:

二、拉取单聊历史消息

你可以调用接口 MsgGetMsgList (点击查看详情) 获取单聊历史消息。
在网络正常的情况下会拉取最新的云端数据。如果网络出现异常,SDK 会返回本地存储的历史消息。

本接口支持分页拉取,参考:分页拉取。

示例代码如下:

// 拉取单聊历史消息// 首次拉取,msg_getmsglist_param_last_msg 设置为 null// 再次拉取时,msg_getmsglist_param_last_msg 可以使用返回的消息列表中的最后一条消息var get_message_list_param = new MsgGetMsgListParam { msg_getmsglist_param_last_msg = LastMessage };TIMResult res = TencentIMSDK.MsgGetMsgList(conv_id, TIMConvType.kTIMConv_C2C, get_message_list_param, (int code, string desc, string user_data) => { // 处理回调逻辑});

三、拉取群聊历史消息

你可以调用接口 MsgGetMsgList (点击查看详情) 获取群聊历史消息。
在网络正常的情况下会拉取最新的云端数据。如果网络出现异常,SDK 会返回本地存储的历史消息。

本接口支持分页拉取,参考:分页拉取。

示例代码如下:

// 拉取群聊历史消息// 首次拉取,msg_getmsglist_param_last_msg 设置为 null// 再次拉取时,msg_getmsglist_param_last_msg 可以使用返回的消息列表中的最后一条消息var get_message_list_param = new MsgGetMsgListParam { msg_getmsglist_param_last_msg = LastMessage };TIMResult res = TencentIMSDK.MsgGetMsgList(conv_id, TIMConvType.kTIMConv_Group, get_message_list_param, (int code, string desc, string user_data) => { // 处理回调逻辑});

四、分页拉取

拉取单聊历史消息、拉取群聊历史消息 均可以按照相同的方式实现分页,即使用 msg_getmsglist_param_last_msg 和 msg_getmsglist_param_count 来实现。

·通过 msg_getmsglist_param_last_msg 和 msg_getmsglist_param_count 来实现分页。第一次拉取时 msg_getmsglist_param_last_msg 可以设置为空,使用消息列表中返回来最后一条消息作为下一次拉取的 msg_getmsglist_param_last_msg 从而拉取下一页数据。

·当 msg_getmsglist_param_last_msg 设置为空时,SDK 会默认从最新的消息开始返回。

·当设置 msg_getmsglist_param_last_msg 后,返回的消息列表不包含设置的 msg_getmsglist_param_last_msg。

·返回的消息列表中,越新的消息越靠前。

注意:1. 为了不影响历史消息拉取速度,建议分页时 msg_getmsglist_param_count 设置为 20。

注意:2. 由于返回的消息列表会包含 msg_getmsglist_param_last_msg_seq 所对应的消息,所以在拉取群聊历史消息时,不建议使用 msg_getmsglist_param_last_msg_seq 来续拉。

五、跳转到群 @ 消息后拉取

在群聊会话中,收到群 @ 消息后,一般需要通过点击群 @ 提示条,跳转到群 @ 消息的位置,并拉取附近的消息列表用于显示。
由于群 @ 消息本身也需要显示,可以将 msg_getmsglist_param_last_msg_seq 设置成群 @ 消息的 sequence ,并使用 MsgGetMsgList 来拉取。

六、拉历史消息时,日志中出现 "total msg_getmsglist_param_count of request cloud message exceed max limit" 信息

SDK 目前的策略是:

1. 当 getType 设置成拉云端历史消息,且拉取 x 条消息时,SDK 会从云端拉取 x 条消息。

2. SDK 会过滤无效的消息,例如消息被删除、非当前用户关心的消息等。

3. 当云端历史消息中无效的消息过多,就会触发 SDK 多次分页拉取。
为了提供系统的稳定性和健壮性,SDK 最多触发 3 次自动分页。当超过限制后,会出现 “total msg_getmsglist_param_count of request cloud message exceed max limit” 的日志信息。

为了尽可能的减少此类限频机制对业务层的影响,你可以使用如下措施来减少无效消息的产生:

·你可以使用在线消息,也就是说在发送消息时 message_is_online_msg 字段设置为 YES/true 。

·如果是群聊消息,可以使用群定向消息指定消息的接收者,避免产生无效消息。

七、拉云端历史消息时,消息 “丢失” ?

当 getType 设置成拉云端历史消息,且拉取 msg_getmsglist_param_count 条消息时,SDK 会做如下操作:

1. SDK 先从本地拉取 msg_getmsglist_param_count 条消息。

2. SDK 再次云端拉取 msg_getmsglist_param_count 条消息,过滤掉被删除等无效的消息,如果不够 msg_getmsglist_param_count 条,SDK 内部触发分页拉取。

3. 将本地和云端消息进行合并,更新消息状态等信息。

4. 从合并的消息列表中,返回 msg_getmsglist_param_count 条消息。

一般出现消息 “丢失” 时,指的是在第 2 步中拉取的无效消息过多,导致触发了 问题 1 中的限频机制 ,从而导致实际拉取的云端消息不够。

建议按照 问题 1 中的解决方法 来处理,如果仍然无法解决,可 提交工单。

八、拉取的历史消息,群名片等群成员信息没有实时更新?

·SDK 会在消息产生时,更新当前的群名片、role 等群成员信息并存储在本地数据库中。

·当拉取群历史消息时,会直接返回消息产生时的群成员信息,不会实时更新。

如果你需要获取最新的群成员信息,你可以使用 GroupGetMemberInfoList(点击查看详情)。

九、拉取历史消息时卡顿

SDK 内部已对消息拉取做了性能优化,你如果碰到消息卡顿的情况,可以先尝试减少拉取的消息数 msg_getmsglist_param_count 。

赞 (0)
上一篇 4天前
下一篇 4天前