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();
  }
}

results matching ""

    No results matching ""