V2TIMManager
and V2TIMManager+Message (for Objective-C)
and V2TIMMessageManager (Java and C++)
classes.getC2CHistoryMessageList
API (Java / Swift / Objective-C) to get historical one-to-one messages.
When the network is normal, the latest cloud data will be pulled; when it is abnormal, the SDK will return the locally stored historical messages.// Pull historical one-to-one messages// Set `lastMsg` to `null` for the first pull// `lastMsg` can be the last message in the returned message list for the second pull.V2TIMManager.getMessageManager().getC2CHistoryMessageList(#your user id#, 20, null, new V2TIMValueCallback<List<V2TIMMessage>>() {@Overridepublic void onError(int code, String desc) {Log.i("imsdk", "fail, " + code + ", " + desc);}@Overridepublic void onSuccess(List<V2TIMMessage> v2TIMMessages) {// Record the `lastMsg` for the next pullV2TIMMessage lastMsg = v2TIMMessages.get(v2TIMMessages.size() - 1);Log.i("imsdk", "success");}});
// Pull historical one-to-one messages// Set `lastMsg` to `null` for the first pull// `lastMsg` can be the last message in the returned message list for the second pull.V2TIMManager.shared.getC2CHistoryMessageList(userID: "userID", count: 100, lastMsg: lastMessage) { msgs inmsgs.forEach { item inprint("\\(item.description)")}// Record the `lastMsg` for the next pulllastMessage = msgs.last} fail: { code, desc inprint("fail \\(code), \\(desc)")}
// Pull historical one-to-one messages// Set `lastMsg` to `nil` for the first pull// `lastMsg` can be the last message in the returned message list for the second pull.[V2TIMManager.sharedInstance getC2CHistoryMessageList:#your user id# count:20 lastMsg:nil succ:^(NSArray<V2TIMMessage *> *msgs) {// Record the `lastMsg` for the next pullV2TIMMessage *lastMsg = msgs.lastObject;NSLog(@"success, %@", msgs);} fail:^(int code, NSString *desc) {NSLog(@"fail, %d, %@", code, desc);}];
getGroupHistoryMessageList
API (Java / Swift / Objective-C) to get historical group messages.
When the network is normal, the latest cloud data will be pulled; when it is abnormal, the SDK will return the locally stored historical messages.onRecvNewMessage
callback after successfully joining the audio-video group. New members of an audio-video group can view up to 20 messages in the past 24 hours before they join the group.// Pull historical group messages// Set `lastMsg` to `null` for the first pull// `lastMsg` can be the last message in the returned message list for the second pull.V2TIMManager.getMessageManager().getGroupHistoryMessageList(#your group id#, 20, null, new V2TIMValueCallback<List<V2TIMMessage>>() {@Overridepublic void onError(int code, String desc) {Log.i("imsdk", "fail, " + code + ", " + desc);}@Overridepublic void onSuccess(List<V2TIMMessage> v2TIMMessages) {// Record the `lastMsg` for the next pullV2TIMMessage lastMsg = v2TIMMessages.get(v2TIMMessages.size() - 1);Log.i("imsdk", "success");}});
// Pull historical group messages// Set `lastMsg` to `null` for the first pull// `lastMsg` can be the last message in the returned message list for the second pull.V2TIMManager.shared.getGroupHistoryMessageList(groupID: "groupID", count: 100, lastMsg: lastMessage) { msgs inmsgs.forEach { item inprint("\\(item.description)")}// Record the `lastMsg` for the next pulllastMessage = msgs.last} fail: { code, desc inprint("fail \\(code), \\(desc)")}
// Pull historical group messages// Set `lastMsg` to `null` for the first pull// `lastMsg` can be the last message in the returned message list for the second pull.[V2TIMManager.sharedInstance getGroupHistoryMessageList:#your group id# count:20 lastMsg:nil succ:^(NSArray<V2TIMMessage *> *msgs) {// Record the `lastMsg` for the next pullV2TIMMessage *lastMsg = msgs.lastObject;NSLog(@"success, %@", msgs);} fail:^(int code, NSString *desc) {NSLog(@"fail, %d, %@", code, desc);}];
getHistoryMessageList
(Java / Swift / Objective-C / C++).public abstract void getHistoryMessageList(V2TIMMessageListGetOption option, V2TIMValueCallback<List<V2TIMMessage>> callback);
public func getHistoryMessageList(option: V2TIMMessageListGetOption, succ: V2TIMMessageListSucc?, fail: V2TIMFail?)
- (void)getHistoryMessageList:(V2TIMMessageListGetOption *)optionsucc:(V2TIMMessageListSucc)succfail:(V2TIMFail)fail;
virtual void GetHistoryMessageList(const V2TIMMessageListGetOption& option,V2TIMValueCallback<V2TIMMessageVector>* callback) = 0;
V2TIMMessageListGetOption
class are as described below:Parameter | Description | Valid for One-to-One Chat | Valid for Group Chat | Required | Remarks |
getType | Source and sequence of the message pull, which can be set to local/cloud and reverse chronological order/chronological order respectively. | YES | YES | YES | When the pull source is set to the cloud, the local message list and cloud message list will be merged and returned. If there is no network connection, the local message list will be returned. |
userID | The specified user ID with which to pull historical one-to-one messages | YES | NO | NO | To pull one-to-one messages with a certain user, you need to specify only the userID . |
groupID | The specified group ID with which to pull historical group messages | NO | YES | NO | To pull group messages from a certain group, you need to specify only the groupID . |
count | Number of messages per pull | YES | YES | YES | We recommend you set it to 20 ; otherwise, the pull speed may be affected. |
messageTypeList | Pulled message type set | YES | YES | NO | 1. It is supported only for local pull, that is, it is valid only when getType is V2TIM_GET_LOCAL_OLDER_MSG or V2TIM_GET_LOCAL_NEWER_MSG .2. If this field is left empty, messages of all types will be pulled. 3. For more information on the supported message types, see V2TIMElemType (Java / Swift / Objective-C / C++). |
lastMsg | Last message | YES | YES | NO | This parameter applies to historical message pull. 1. It can be used for both one-to-one and group chats. 2. If it is set as the start point for the message pull, the message will not be included in the returned message list. 3. If it is left empty, the latest message in the conversation will be used as the start point for pull. |
lastMsgSeq | seq of the last message | NO | YES | NO | This parameter applies to historical message pull or locating. 1. It can be used only for group chats. 2. If it is set as the start point for the message pull, the message will be included in the returned message list. 3. If both lastMsg and lastMsgSeq are specified, the SDK will use lastMsg .4. If neither lastMsg nor lastMsgSeq is specified, the start point for pull will be determined based on whether the getTimeBegin is set. If yes, the set range will be used as the start point; if no, the latest message will be used as the start point. |
getTimeBegin | Start time for the message pull. It is a UTC timestamp in seconds. | YES | YES | NO | It defaults to 0 , indicating to pull messages from the current time. |
getTimePeriod | Time range for the message pull in seconds. | YES | YES | NO | 1. It defaults to 0 , indicating that there is no time range limit.2. It is a closed range including the start and end time: If getType specifies the reverse chronological order, the time range is [getTimeBegin - getTimePeriod , getTimeBegin ].If getType specifies the chronological order, the time range is [getTimeBegin , getTimeBegin + getTimePeriod ]. |
lastMsg
and count
:lastMsg
empty. In this case, the SDK will pull the latest message.lastMsg
. In this case, the lastMsg
will not be included in the returned message list.count
to 20
to enhance the loading efficiency and save network traffic.lastMsgSeq
to pull historical messages, the message corresponding to lastMsgSeq
will be included in the returned message list.
Therefore, we recommend you not use lastMsgSeq
if you are not pulling historical group messages for the first time (subsequent pull); otherwise, the same message may be pulled repeatedly.
For example, there are eight historical messages: msg1
, msg2
, msg3
, msg4
, msg5
, msg6
, msg7
, and msg8
.
If four messages are pulled each time, you will get msg1
, msg2
, msg3
, and msg4
for the first pull. If you use the lastMsgSeq
of msg4
to start another pull, msg4
, msg5
, msg6
, and msg7
will be pulled. In this case, msg4
is pulled twice.
If you need to use lastMsgSeq
for subsequent pulls, we recommend you set the logic of message deduplication.getTimeBegin
and getTimePeriod
to specify the time range for the message pull.
The start and end timestamps of the time range are related to getType
, as shown below:1640966400
) in reverse chronological order.V2TIMMessageListGetOption option = new V2TIMMessageListGetOption();option.setGetType(V2TIMMessageListGetOption.V2TIM_GET_CLOUD_OLDER_MSG); // Pull older cloud messagesoption.setGetTimeBegin(1640966400); // Start from 2022-01-01 00:00:00option.setGetTimePeriod(1 * 24 * 60 * 60); // Pull the messages of the whole dayoption.setCount(Integer.MAX_VALUE); // Return all the messages within the time rangeoption.setGroupID(#you group id#); // Pull group messagesV2TIMManager.getMessageManager().getHistoryMessageList(option, new V2TIMValueCallback<List<V2TIMMessage>>() {@Overridepublic void onSuccess(List<V2TIMMessage> v2TIMMessages) {Log.i("imsdk", "success");}@Overridepublic void onError(int code, String desc) {Log.i("imsdk", "failure, code:" + code + ", desc:" + desc);}});
let option = V2TIMMessageListGetOption()option.getType = .V2TIM_GET_CLOUD_OLDER_MSG// Pull older cloud messagesoption.getTimeBegin = 1640966400 // Start from 2022-01-01 00:00:00option.getTimePeriod = 1 * 24 * 60 * 60 // Pull the messages of the whole dayoption.groupID = "#your group id#"option.count = UInt(INT_MAX) // Return all the messages within the time rangeV2TIMManager.shared.getHistoryMessageList(option: option) { msgs inmsgs.forEach { item in}print("success")} fail: { code, desc inprint("fail \\(code), \\(desc)")}
V2TIMMessageListGetOption *option = [[V2TIMMessageListGetOption alloc] init];option.getType = V2TIM_GET_CLOUD_OLDER_MSG; // Pull cloud messages in reverse chronological orderoption.getTimeBegin = 1640966400; // Start from 2022-01-01 00:00:00option.getTimePeriod = 1 * 24 * 60 * 60; // Pull the messages of the whole dayoption.count = INT_MAX; // Return all the messages within the time rangeoption.groupID = #your group id#; // Pull group messages[V2TIMManager.sharedInstance getHistoryMessageList:option succ:^(NSArray<V2TIMMessage *> *msgs) {NSLog(@"success");} fail:^(int code, NSString *desc) {NSLog(@"failure, code:%d, desc:%@", code, desc);}];
template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public:using SuccessCallback = std::function<void(const T&)>;using ErrorCallback = std::function<void(int, const V2TIMString&)>;ValueCallback() = default;~ValueCallback() override = default;void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {success_callback_ = std::move(success_callback);error_callback_ = std::move(error_callback);}void OnSuccess(const T& value) override {if (success_callback_) {success_callback_(value);}}void OnError(int error_code, const V2TIMString& error_message) override {if (error_callback_) {error_callback_(error_code, error_message);}}private:SuccessCallback success_callback_;ErrorCallback error_callback_;};V2TIMMessageListGetOption option;option.getType = V2TIMMessageGetType::V2TIM_GET_CLOUD_OLDER_MSG; // Pull older cloud messagesoption.getTimeBegin = 1640966400; // Start from 2022-01-01 00:00:00option.getTimePeriod = 1 * 24 * 60 * 60; // Pull the messages of the whole dayoption.count = std::numeric_limits<uint64_t>::max(); // Return all the messages within the time rangeoption.groupID = "your group id"; // Pull group messagesauto callback = new ValueCallback<V2TIMMessageVector>{};callback->SetCallback([=](const V2TIMMessageVector& messageList) {std::cout << "success" << std::endl;delete callback;},[=](int error_code, const V2TIMString& error_message) {std::cout << "error" << std::endl;delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->GetHistoryMessageList(option, callback);
lastMsg
/lastMsgSeq
for the message pull at the same time. And the SDK will respond as follows:getTimeBegin
/getTimePeriod
and lastMsg
/lastMsgSeq
are set, the overlapping part of the messages pulled based on the start message and the messages pulled based on the time range will be returned.getTimeBegin
/getTimePeriod
nor lastMsg
/lastMsgSeq
is set, messages will be pulled from the latest message based on the sequence and method specified by getType
.1640966400
) in reverse chronological order.// Define a variable to record the cursor of each pullprivate V2TIMMessage m_lastMsg = null; // It is `null` for the first pull.// Logic of pulling by pageV2TIMMessageListGetOption option = new V2TIMMessageListGetOption();option.setGetType(V2TIMMessageListGetOption.V2TIM_GET_CLOUD_OLDER_MSG); // Pull older cloud messagesoption.setGetTimeBegin(1640966400); // Start from 2022-01-01 00:00:00option.setGetTimePeriod(1 * 24 * 60 * 60); // Pull the messages of the whole dayoption.setCount(20); // 20 messages per pageoption.setLastMsg(m_lastMsg); // Position of the last pull (the last message in the returned message list each time)option.setGroupID(#you group id#); // Pull group messagesV2TIMManager.getMessageManager().getHistoryMessageList(option, new V2TIMValueCallback<List<V2TIMMessage>>() {@Overridepublic void onSuccess(List<V2TIMMessage> v2TIMMessages) {Log.i("imsdk", "success");// Record the `lastMsg` for the next pullm_lastMsg = v2TIMMessages.get(v2TIMMessages.size() - 1);}@Overridepublic void onError(int code, String desc) {Log.i("imsdk", "failure, code:" + code + ", desc:" + desc);}});
// Define a variable to record the cursor of each pullvar lastMsg: V2TIMMessage?// Logic of pulling by pagelet option = V2TIMMessageListGetOption()option.getType = .V2TIM_GET_CLOUD_OLDER_MSG // Pull cloud messages in reverse chronological orderoption.getTimeBegin = 1640966400 // Start from 2022-01-01 00:00:00option.getTimePeriod = 1 * 24 * 60 * 60 // Pull the messages of the whole dayoption.count = 20 // 20 messages per pageoption.lastMsg = self.lastMsg; // Position of the last pull (the last message in the returned message list each time)option.groupID = "#your group id#" // Pull group messagesV2TIMManager.shared.getHistoryMessageList(option: option) { msgs inmsgs.forEach { item in}print("success")} fail: { code, desc inprint("fail \\(code), \\(desc)")}
// Define a variable to record the cursor of each pull@property (nonatomic, copy) V2TIMMessage *lastMsg;// Logic of pulling by pageV2TIMMessageListGetOption *option = [[V2TIMMessageListGetOption alloc] init];option.getType = V2TIM_GET_CLOUD_OLDER_MSG; // Pull cloud messages in reverse chronological orderoption.getTimeBegin = 1640966400; // Start from 2022-01-01 00:00:00option.getTimePeriod = 1 * 24 * 60 * 60; // Pull the messages of the whole dayoption.count = 20; // 20 messages per pageoption.lastMsg = self.lastMsg; // Position of the last pull (the last message in the returned message list each time)option.groupID = #your group id#; // Pull group messages__weak typeof(self) weakSelf = self;[V2TIMManager.sharedInstance getHistoryMessageList:option succ:^(NSArray<V2TIMMessage *> *msgs) {NSLog(@"success");// Record the `lastMsg` for the next pullweakSelf.lastMsg = msgs.lastObject;} fail:^(int code, NSString *desc) {NSLog(@"failure, code:%d, desc:%@", code, desc);}];
template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public:using SuccessCallback = std::function<void(const T&)>;using ErrorCallback = std::function<void(int, const V2TIMString&)>;ValueCallback() = default;~ValueCallback() override = default;void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {success_callback_ = std::move(success_callback);error_callback_ = std::move(error_callback);}void OnSuccess(const T& value) override {if (success_callback_) {success_callback_(value);}}void OnError(int error_code, const V2TIMString& error_message) override {if (error_callback_) {error_callback_(error_code, error_message);}}private:SuccessCallback success_callback_;ErrorCallback error_callback_;};// Define a variable to record the cursor of each pullV2TIMMessage lastMsg;// Logic of pulling by pageV2TIMMessageListGetOption option;option.getType = V2TIMMessageGetType::V2TIM_GET_CLOUD_OLDER_MSG; // Pull older cloud messagesoption.getTimeBegin = 1640966400; // Start from 2022-01-01 00:00:00option.getTimePeriod = 1 * 24 * 60 * 60; // Pull the messages of the whole dayoption.count = 20; // 20 messages per pageoption.lastMsg = First pull? nullptr : &lastMsg; // Position of the last pull (the last message in the returned message list each time)option.groupID = "your group id"; // Pull group messagesauto callback = new ValueCallback<V2TIMMessageVector>{};callback->SetCallback([=](const V2TIMMessageVector& messageList) mutable {std::cout << "success" << std::endl;// Record the `lastMsg` for the next pulllastMsg = messageList[messageList.Size() - 1];delete callback;},[=](int error_code, const V2TIMString& error_message) {std::cout << "error" << std::endl;delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->GetHistoryMessageList(option, callback);
getType
to pull only local messages:getType
is set to V2TIM_GET_LOCAL_OLDER_MSG
, locally stored messages will be pulled in reverse chronological order.getType
is set to V2TIM_GET_LOCAL_NEWER_MSG
, locally stored messages will be pulled in chronological order.V2TIMMessageListGetOption option = new V2TIMMessageListGetOption();option.setGetType(V2TIMMessageListGetOption.V2TIM_GET_LOCAL_OLDER_MSG); // Pull local messages in reverse chronological orderoption.setLastMsg(null); // Set to pull from the latest messageoption.setCount(20); // Pull 20 messagesoption.setUserID(#you user id#); // Pull one-to-one messagesV2TIMManager.getMessageManager().getHistoryMessageList(option, new V2TIMValueCallback<List<V2TIMMessage>>() {@Overridepublic void onSuccess(List<V2TIMMessage> v2TIMMessages) {Log.i("imsdk", "success");}@Overridepublic void onError(int code, String desc) {Log.i("imsdk", "failure, code:" + code + ", desc:" + desc);}});
let option = V2TIMMessageListGetOption()option.getType = .V2TIM_GET_LOCAL_OLDER_MSG // Pull local messages in reverse chronological orderoption.lastMsg = nil // Set to pull from the latest messageoption.count = 20 // Pull 20 messagesoption.userID = "userID" // Pull one-to-one messagesV2TIMManager.shared.getHistoryMessageList(option: option) { msgs inmsgs.forEach { item in}print("success")} fail: { code, desc inprint("fail \\(code), \\(desc)")}
V2TIMMessageListGetOption *option = [[V2TIMMessageListGetOption alloc] init];option.getType = V2TIM_GET_LOCAL_OLDER_MSG; // Pull local messages in reverse chronological orderoption.lastMsg = nil; // Set to pull from the latest messageoption.count = 20; // Pull 20 messagesoption.userID = #your user id#; // Pull one-to-one messages[V2TIMManager.sharedInstance getHistoryMessageList:option succ:^(NSArray<V2TIMMessage *> *msgs) {NSLog(@"success");} fail:^(int code, NSString *desc) {NSLog(@"failure, code:%d, desc:%@", code, desc);}];
template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public:using SuccessCallback = std::function<void(const T&)>;using ErrorCallback = std::function<void(int, const V2TIMString&)>;ValueCallback() = default;~ValueCallback() override = default;void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {success_callback_ = std::move(success_callback);error_callback_ = std::move(error_callback);}void OnSuccess(const T& value) override {if (success_callback_) {success_callback_(value);}}void OnError(int error_code, const V2TIMString& error_message) override {if (error_callback_) {error_callback_(error_code, error_message);}}private:SuccessCallback success_callback_;ErrorCallback error_callback_;};V2TIMMessageListGetOption option;option.getType = V2TIMMessageGetType::V2TIM_GET_LOCAL_OLDER_MSG; // Pull older local messagesoption.count = 20; // Pull 20 messagesoption.userID = "you user id"; // Pull one-to-one messagesauto callback = new ValueCallback<V2TIMMessageVector>{};callback->SetCallback([=](const V2TIMMessageVector& messageList) mutable {std::cout << "success" << std::endl;delete callback;},[=](int error_code, const V2TIMString& error_message) {std::cout << "error" << std::endl;delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->GetHistoryMessageList(option, callback);
V2TIMElemType
(Java / Swift / Objective-C / C++). The advanced API getHistoryMessageList
allows setting messageTypeList
to specify the message type for pull.messageTypeList
is left empty, messages of all types will be pulled.// Pull image and text messagesArrayList<Integer> messageTypeList = new ArrayList<Integer>();messageTypeList.add(V2TIM_ELEM_TYPE_IMAGE);messageTypeList.add(V2TIM_ELEM_TYPE_TEXT);V2TIMMessageListGetOption option = new V2TIMMessageListGetOption();option.setGetType(V2TIMMessageListGetOption.V2TIM_GET_CLOUD_OLDER_MSG); // Pull older cloud messagesoption.setCount(20);option.setMessageTypeList(messageTypeList);option.setGroupID("you group id");V2TIMManager.getMessageManager().getHistoryMessageList(option, new V2TIMValueCallback<List<V2TIMMessage>>() {@Overridepublic void onSuccess(List<V2TIMMessage> v2TIMMessages) {Log.i("imsdk", "success");}@Overridepublic void onError(int code, String desc) {Log.i("imsdk", "failure, code:" + code + ", desc:" + desc);}});
let option = V2TIMMessageListGetOption()option.getType = .V2TIM_GET_LOCAL_OLDER_MSGoption.messageTypeList = [.V2TIM_ELEM_TYPE_IMAGE, .V2TIM_ELEM_TYPE_TEXT]option.count = 20option.groupID = "your group id";V2TIMManager.shared.getHistoryMessageList(option: option) { msgs inmsgs.forEach { item in}print("success")} fail: { code, desc inprint("fail \\(code), \\(desc)")}
V2TIMMessageListGetOption *option = [[V2TIMMessageListGetOption alloc] init];option.getType = V2TIM_GET_CLOUD_OLDER_MSG;// Pull image and text messagesoption.messageTypeList = @[@(V2TIM_ELEM_TYPE_IMAGE), @(V2TIM_ELEM_TYPE_TEXT)];option.count = 20;option.groupID = @"your group id";[V2TIMManager.sharedInstance getHistoryMessageList:option succ:^(NSArray<V2TIMMessage *> *msgs) {NSLog(@"success");} fail:^(int code, NSString *desc) {NSLog(@"failure, code:%d, desc:%@", code, desc);}];
template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public:using SuccessCallback = std::function<void(const T&)>;using ErrorCallback = std::function<void(int, const V2TIMString&)>;ValueCallback() = default;~ValueCallback() override = default;void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {success_callback_ = std::move(success_callback);error_callback_ = std::move(error_callback);}void OnSuccess(const T& value) override {if (success_callback_) {success_callback_(value);}}void OnError(int error_code, const V2TIMString& error_message) override {if (error_callback_) {error_callback_(error_code, error_message);}}private:SuccessCallback success_callback_;ErrorCallback error_callback_;};V2TIMMessageListGetOption option;option.getType = V2TIMMessageGetType::V2TIM_GET_CLOUD_OLDER_MSG; // Pull older cloud messagesoption.count = 20; // Pull 20 messagesoption.messageTypeList.PushBack(V2TIMElemType::V2TIM_ELEM_TYPE_IMAGE); // Pull image messagesoption.messageTypeList.PushBack(V2TIMElemType::V2TIM_ELEM_TYPE_TEXT); // Pull text messagesoption.userID = "you group id"; // Pull group messagesauto callback = new ValueCallback<V2TIMMessageVector>{};callback->SetCallback([=](const V2TIMMessageVector& messageList) mutable {std::cout << "success" << std::endl;delete callback;},[=](int error_code, const V2TIMString& error_message) {std::cout << "error" << std::endl;delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->GetHistoryMessageList(option, callback);
seq
field of the V2TIMMessage object;getType
is set to poll from the cloud, the local stored message list and the cloud stored message list will be merged and returned; if there is no network, the local message list will be returned directly;getType
is set to poll from local, the local message list will be returned directly;getType
is set to poll older messages, the message list is in reverse chronological order, i.e., messages are sorted from large to small by timestamp;getType
is set to poll updated messages, the message list is in chronological order, i.e., messages are sorted from small to large by timestamp.ArrayList<Long> sequenceList = new ArrayList<>();sequenceList.add(1L);sequenceList.add(3L);sequenceList.add(5L);sequenceList.add(9L);V2TIMMessageListGetOption option = new V2TIMMessageListGetOption();option.setGroupID("your groupID");option.setMessageSeqList(sequenceList);option.setGetType(V2TIMMessageListGetOption.V2TIM_GET_CLOUD_OLDER_MSG;);V2TIMManager.getMessageManager().getHistoryMessageList(option, new V2TIMValueCallback<List<V2TIMMessage>>() {@Overridepublic void onSuccess(List<V2TIMMessage> v2TIMMessages) {}@Overridepublic void onError(int code, String desc) {}});
option.getType = .V2TIM_GET_LOCAL_OLDER_MSGoption.groupID = "your group id"option.messageSeqList = [1,3,5,9]V2TIMManager.shared.getHistoryMessageList(option: option) { msgs inmsgs.forEach { item in}print("success")} fail: { code, desc inprint("fail \\(code), \\(desc)")}
V2TIMMessageListGetOption *option = [[V2TIMMessageListGetOption alloc] init];option.getType = V2TIM_GET_CLOUD_OLDER_MSG;option.groupID = @"your groupID";option.messageSeqList = @[@(1), @(3), @(5), @(9)];[V2TIMManager.sharedInstance getHistoryMessageList:option succ:^(NSArray<V2TIMMessage *> *msgs) {} fail:^(int code, NSString *desc) {}];
template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public:using SuccessCallback = std::function<void(const T&)>;using ErrorCallback = std::function<void(int, const V2TIMString&)>;ValueCallback() = default;~ValueCallback() override = default;void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {success_callback_ = std::move(success_callback);error_callback_ = std::move(error_callback);}void OnSuccess(const T& value) override {if (success_callback_) {success_callback_(value);}}void OnError(int error_code, const V2TIMString& error_message) override {if (error_callback_) {error_callback_(error_code, error_message);}}private:SuccessCallback success_callback_;ErrorCallback error_callback_;};V2TIMUInt64Vector sequence_list;sequence_list.PushBack(1);sequence_list.PushBack(3);sequence_list.PushBack(5);sequence_list.PushBack(9);V2TIMMessageListGetOption option;option.getType = V2TIMMessageGetType::V2TIM_GET_CLOUD_OLDER_MSG;option.messageSeqList = sequence_list;option.groupID = "your group id";auto callback = new ValueCallback<V2TIMMessageVector>{};callback->SetCallback([=](const V2TIMMessageVector& messageList) {std::cout << "success" << std::endl;delete callback;},[=](int error_code, const V2TIMString& error_message) {std::cout << "error" << std::endl;delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->GetHistoryMessageList(option, callback);
sequence
as the lastMsgSeq
and use the advanced API getHistoryMessageList
to pull messages.// Get the `sequence` of the group @ messagelong atSequence = 1081;// Pull the group @ message and earlier messagesV2TIMMessageListGetOption beforeOption = new V2TIMMessageListGetOption();beforeOption.setGetType(V2TIMMessageListGetOption.V2TIM_GET_CLOUD_OLDER_MSG); // Pull messages earlier than the group @ messagebeforeOption.setCount(20); // Pull 20 messagesbeforeOption.