MsgGetMsgList
功能介绍
获取历史消息列表
从 msg_getmsglist_param_last_msg 指定的消息开始获取本地消息列表,msg_getmsglist_param_count 为要获取的消息数目。msg_getmsglist_param_last_msg 可以不指定,不指定时表示以会话最新的消息为 LastMsg 。
若指定 kTIMMsgGetMsgListParamIsRamble 为true则本地消息获取不够指定数目时,会去获取云端漫游消息。
kTIMMsgGetMsgListParamIsForward 为true时表示获取比 msg_getmsglist_param_last_msg 新的消息,为false时表示获取比 msg_getmsglist_param_last_msg 旧的消息
拉取 C2C 消息时,只能使用 msg_getmsglist_param_last_msg 作为消息的拉取起点;如果没有指定 msg_getmsglist_param_last_msg,默认使用会话的最新消息作为拉取起点
拉取 Group 消息时,除了可以使用 msg_getmsglist_param_last_msg 作为消息的拉取起点外,也可以使用 msg_getmsglist_param_last_msgSeq 来指定消息的拉取起点,二者的区别在于:
使用 msg_getmsglist_param_last_msg 作为消息的拉取起点时,返回的消息列表里不包含 msg_getmsglist_param_last_msg;
使用 msg_getmsglist_param_last_msgSeq 作为消息拉取起点时,返回的消息列表里包含 msg_getmsglist_param_last_msgSeq 所表示的消息;
在拉取 Group 消息时
如果同时指定了 msg_getmsglist_param_last_msg 和 msg_getmsglist_param_last_msgSeq,SDK 优先使用 msg_getmsglist_param_last_msg 作为消息的拉取起点
如果 msg_getmsglist_param_last_msg 和 msg_getmsglist_param_last_msgSeq,SDK 都未指定,消息的拉取起点分为如下两种情况:
如果设置了拉取的时间范围,SDK 会根据 msg_getmsglist_param_time_begin 所描述的时间点作为拉取起点
如果未设置拉取的时间范围,SDK 默认使用会话的最新消息作为拉取起点
只有会议群(Meeting)才能拉取到进群前的历史消息,更多关于群消息的限制,详见 消息能力差异 。
直播群(AVChatRoom)消息不存云端漫游和本地数据库,调用这个接口无效。
在拉取云端历史消息时,如果检测到网络异常,SDK 会返回本地存储的历史消息。
本地存储的历史消息无时间显示,但云端存储的历史消息有存储时长的限制:
体验版:免费存储 7 天,不支持延长
专业版:免费存储 7 天,支持延长
旗舰版:免费存储 30 条,支持延长
延长历史消息存储时长是增值服务,您可以登录 即时通信 IM 控制台 修改相关配置,具体计费说明请参加 增值服务资费 。
富媒体消息(图片、文件、语音等)对应的文件存储时长,与历史消息存储时长保持一致。
SDK 内部已对消息拉取做了性能优化,您如果碰到消息卡顿的情况,可以先尝试减少拉取的消息数 msg_getmsglist_param_count ,如果还是不能解决问题,欢迎加入 QQ 群(764231117)反馈。
常见问题的解决方案
参数详解
重载1
参数名称 | 参数类型 | 是否必填 | 描述 |
---|---|---|---|
conv_id | string | 是 | 会话ID |
conv_type | TIMConvType | 是 | 会话类型 |
get_message_list_param | MsgGetMsgListParam | 是 | 获取历史消息参数 |
callback | ValueCallback< List< Message > > | 是 | 异步回调 返回值的json_param的格式为json |
重载2
参数名称 | 参数类型 | 是否必填 | 描述 |
---|---|---|---|
conv_id | string | 是 | 会话ID |
conv_type | TIMConvType | 是 | 会话类型 |
get_message_list_param | MsgGetMsgListParam | 是 | 获取历史消息参数 |
callback | ValueCallback< string > | 是 | 异步回调 返回值的json_param的格式为string |
返回模板
TIMResult
调用成功后回调函数参数:
code:int
desc:string
json_param:
'[
{
"message_client_time" : 1551080111,
"message_conv_id" : "user2",
"message_conv_type" : 1,
"message_elem_array" : [
{
"elem_type" : 0,
"text_elem_content" : "123213213"
}
],
"message_is_from_self" : true,
"message_is_read" : true,
"message_rand" : 2130485001,
"message_sender" : "user1",
"message_seq" : 1,
"message_server_time" : 1551080111,
"message_status" : 2
},
...
]'// Json Key请参考[Message]
user_data:string
返回值详解
名称 | 数值类型 | 描述 |
---|---|---|
TIMResult | TIMResult | 调用接口的返回值 |
code | int | 值为ERR_SUCC表示成功,其他值表示失败。详情请参考 错误码 |
desc | string | 错误描述字符串 |
json_param | string | Json字符串,不同的接口,Json字符串不一样 Json Key请参考Message |
user_data | string | ImSDK负责透传的用户自定义数据,未做任何处理 |
代码示例
using UnityEngine;
using UnityEngine.UI;
using com.tencent.im.unity.demo.types;
using com.tencent.imsdk.unity;
using com.tencent.imsdk.unity.types;
using com.tencent.imsdk.unity.enums;
using System;
using com.tencent.im.unity.demo.utils;
using EasyUI.Toast;
using System.Collections;
using System.Text;
using System.Collections.Generic;
public class MsgGetMsgList : MonoBehaviour
{
public Text Header;
public Text LastMessageID;
public Dropdown SelectedFriend;
public Dropdown SelectedGroup;
public Text Result;
public Button Submit;
public Button Copy;
private List<string> GroupList;
private List<string> FriendList;
private Message LastMessage;
string[] Labels = new string[] { "SelectFriendLabel", "SelectGroupLabel" };
void Start()
{
foreach (string label in Labels)
{
GameObject.Find(label).GetComponent<Text>().text = Utils.t(label);
}
GroupGetJoinedGroupListSDK();
FriendshipGetFriendProfileListSDK();
Header = GameObject.Find("HeaderText").GetComponent<Text>();
LastMessageID = GameObject.Find("LastMessageID").GetComponent<Text>();
SelectedFriend = GameObject.Find("Friend").GetComponent<Dropdown>();
SelectedGroup = GameObject.Find("Group").GetComponent<Dropdown>();
SelectedGroup.onValueChanged.AddListener(delegate
{
GroupDropdownValueChanged(SelectedGroup);
});
SelectedFriend.onValueChanged.AddListener(delegate
{
FriendDropdownValueChanged(SelectedFriend);
});
Result = GameObject.Find("ResultText").GetComponent<Text>();
Submit = GameObject.Find("Submit").GetComponent<Button>();
Copy = GameObject.Find("Copy").GetComponent<Button>();
Copy.GetComponentInChildren<Text>().text = Utils.t("Copy");
Submit.onClick.AddListener(MsgGetMsgListSDK);
Copy.onClick.AddListener(CopyText);
if (CurrentSceneInfo.info != null)
{
Header.text = Utils.IsCn() ? CurrentSceneInfo.info.apiText + " " + CurrentSceneInfo.info.apiName : CurrentSceneInfo.info.apiName;
Submit.GetComponentInChildren<Text>().text = CurrentSceneInfo.info.apiName;
}
}
void GroupDropdownValueChanged(Dropdown change)
{
if (change.value > 0)
{
SelectedFriend.value = 0;
}
}
void FriendDropdownValueChanged(Dropdown change)
{
if (change.value > 0)
{
SelectedGroup.value = 0;
}
}
void GetGroupList(params object[] parameters)
{
try
{
GroupList = new List<string>();
SelectedGroup.ClearOptions();
string text = (string)parameters[1];
List<GroupBaseInfo> List = Utils.FromJson<List<GroupBaseInfo>>(text);
Dropdown.OptionData option = new Dropdown.OptionData();
GroupList.Add("");
option.text = "";
SelectedGroup.options.Add(option);
foreach (GroupBaseInfo item in List)
{
print(item.group_base_info_group_id);
GroupList.Add(item.group_base_info_group_id);
option = new Dropdown.OptionData();
option.text = item.group_base_info_group_id;
SelectedGroup.options.Add(option);
}
}
catch (Exception ex)
{
Toast.Show(Utils.t("getGroupListFailed"));
}
}
void GetFriendList(params object[] parameters)
{
try
{
FriendList = new List<string>();
SelectedFriend.ClearOptions();
string text = (string)parameters[1];
List<FriendProfile> List = Utils.FromJson<List<FriendProfile>>(text);
Dropdown.OptionData option = new Dropdown.OptionData();
FriendList.Add("");
option.text = "";
SelectedFriend.options.Add(option);
foreach (FriendProfile item in List)
{
print(item.friend_profile_identifier);
FriendList.Add(item.friend_profile_identifier);
option = new Dropdown.OptionData();
option.text = item.friend_profile_identifier;
SelectedFriend.options.Add(option);
}
}
catch (Exception ex)
{
Toast.Show(Utils.t("getFriendListFailed"));
}
}
void GroupGetJoinedGroupListSDK()
{
TIMResult res = TencentIMSDK.GroupGetJoinedGroupList(Utils.addAsyncStringDataToScreen(GetGroupList));
print($"GroupGetJoinedGroupListSDK {res}");
}
void FriendshipGetFriendProfileListSDK()
{
TIMResult res = TencentIMSDK.FriendshipGetFriendProfileList(Utils.addAsyncStringDataToScreen(GetFriendList));
print($"FriendshipGetFriendProfileListSDK {res}");
}
void MsgGetMsgListSDK()
{
var get_message_list_param = new MsgGetMsgListParam
{
msg_getmsglist_param_count = 20
};
if (LastMessage != null)
{
get_message_list_param.msg_getmsglist_param_last_msg = LastMessage;
}
if (SelectedGroup.value > 0)
{
print(GroupList[SelectedGroup.value]);
TIMResult res = TencentIMSDK.MsgGetMsgList(GroupList[SelectedGroup.value], TIMConvType.kTIMConv_Group, get_message_list_param, Utils.addAsyncStringDataToScreen(GetResult));
Result.text = Utils.SynchronizeResult(res);
}
else if (SelectedFriend.value > 0)
{
print(FriendList[SelectedFriend.value]);
TIMResult res = TencentIMSDK.MsgGetMsgList(FriendList[SelectedFriend.value], TIMConvType.kTIMConv_C2C, get_message_list_param, Utils.addAsyncStringDataToScreen(GetResult));
Result.text = Utils.SynchronizeResult(res);
}
}
void GetResult(params object[] parameters)
{
Result.text += (string)parameters[0];
List<Message> messages = Utils.FromJson<List<Message>>((string)parameters[1]);
if (messages.Count > 0)
{
LastMessage = messages[messages.Count - 1];
LastMessageID.text = messages[messages.Count - 1].message_msg_id;
print("有lastMsg");
}
else
{
LastMessage = null;
LastMessageID.text = "";
}
}
void CopyText()
{
Utils.Copy(Result.text);
}
void OnApplicationQuit()
{
TencentIMSDK.Uninit();
}
}