跳到主要内容

获取历史消息

获取历史消息时,您可以选择仅从本地数据中获取、仅从远端获取或者同时从本地与远端获取。 超级群会话没有离线消息,如果想获取用户离线时候的消息需要您根据超级群会话最后一条消息去获取远端的历史消息。

提示
  • 如果您的应用/环境在 2022.10.13 日及以后开通超级群服务,超级群业务中会包含一个 ID 为 RCDefault 的默认频道。如果发消息时不指定频道 ID,则该消息会发送到 RCDefault 频道中。在获取 RCDefault 频道的历史消息时,需要传入该频道 ID。
  • 如果您的应用/环境在 2022.10.13 日前已开通超级群服务,在发送消息时如果不指定频道 ID,则该消息不属于任何频道。获取历史消息时,如果不传入频道 ID,可获取不属于任何频道的消息。融云支持客户调整服务至最新行为。该行为调整将影响客户端、服务端收发消息、获取会话、清除历史消息、禁言等多个功能。如有需要,请提交工单咨询详细方案。
  • 从远端获取单群聊历史消息是指从融云服务端获取历史消息,该功能要求 App Key 已启用融云提供的单群聊消息云端存储服务。您可以在控制台 IM 服务管理页面为当前使用的 App Key 开启服务。如果使用生产环境的 App Key,请注意仅 IM 旗舰版IM 尊享版可开通该服务。具体功能与费用以融云官方价格说明页面及计费说明文档为准

获取本地与远端历史消息

您可以通过 getMessages 方法先从本地获取历史消息,本地有缺失的情况下会从服务端同步缺失的部分。当本地没有更多消息的时候,会从服务端拉取。

接口原型

Objective C
- (void)getMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(NSString *)channelId
option:(RCHistoryMessageOption *)option
complete:(void (^)(NSArray *messages,long long timestamp,BOOL isRemaining, RCErrorCode code))complete
error:(void (^)(RCErrorCode status))errorBlock;

参数说明

参数类型说明
conversationTypeRCConversationType会话类型
targetIdNSString会话 ID
channelIdNSString超级群频道 channelId
optionRCHistoryMessageOption可配置的参数,包括拉取数量、拉取顺序等
completeBlock获取消息的回调
errorBlock获取消息失败的回调
  • RCHistoryMessageOption 说明

    参数说明
    recordTime时间戳,用于控制分页查询消息的边界。默认值为 0
    count要获取的消息数量。如果 SDK < 5.4.1,范围为 [2-20];如果 SDK ≧ 5.4.1,范围为 [2-100];默认值为 0,表示不获取。
    order拉取顺序。RCHistoryMessageOrderDesc:降序,按消息发送时间递减的顺序,获取发送时间早于 recordTime 的消息,返回的列表中的消息按发送时间从新到旧排列。RCHistoryMessageOrderAsc: 升序,按消息发送时间递增的顺序,获取发送时间晚于 recordTime 的消息,返回的列表中的消息按发送时间从旧到新排列。默认值为降序。

示例代码

Objective C
RCHistoryMessageOption *option = [[RCHistoryMessageOption alloc] init];
option.order = RCHistoryMessageOrderDesc;
option.count = 20;
option.recordTime = message.sentTime; // 如果获取最新的 20 条消息,可以传 0。
[[RCChannelClient sharedChannelManager] getMessages:ConversationType_ULTRAGROUP targetId:@"targetId" channelId:@"channelId" option:option complete:^(NSArray *messages, RCErrorCode code) {
if (code == 0) {
// 成功
} else {
// 失败
}
}];

从本地数据库中获取消息

您可以通过 getHistoryMessages 方法分页查询指定会话存储在本地数据库中的历史消息,并获取到异步返回的消息对象列表。列表中的消息按发送时间从新到旧排列。

获取超级群中指定消息 messageId 前的消息

异步获取会话中指定消息之前、指定数量的最新消息实体,返回消息实体 RCMessage 对象列表。

接口原型

Objective C
- (void)getHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
oldestMessageId:(long)oldestMessageId
count:(int)count
completion:(nullable void(^)(NSArray<RCMessage *> * _Nullable messages))completion;

参数说明

count 参数表示返回列表中应包含多少消息。oldestMessageId 参数用于控制分页的边界。每次调用 getHistoryMessages 方法时,SDK 会以 oldestMessageId 参数指向的消息为界,继续在下一页返回指定数量的消息。如果需要获取会话中最新的 count 条消息,可以将 oldestMessageId 设置为 -1。

提示

建议您通过获取返回结果中最早一条消息的 messageId,并在下一次调用时作为 oldestMessageId 传入,以便遍历整个会话的消息历史记录。

参数类型说明
conversationTypeRCConversationType会话类型
targetIdNSString会话 targetId
channelIdNSString超级群频道 channelId
oldestMessageIdlong以此 messageId 为界,获取发送时间更小的 count 条消息。ID 不存在时,设置为 -1,表示获取最新的 count 条消息。
countint需要获取的消息数量。
completionBlock获取的消息的回调。

示例代码

Objective C
[[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
oldestMessageId:-1
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {

}];

获取指定时间戳前后的消息

提示

超级群业务从 5.3.0 开始支持该功能。

异步获取会话中指定时间戳之前之后、指定数量的最新消息实体,并返回消息实体 RCMessage 对象列表。

接口原型

Objective C
- (void)getHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
sentTime:(long long)sentTime
beforeCount:(int)beforeCount
afterCount:(int)afterCount
completion:(nullable void(^)(NSArray<RCMessage *> * _Nullable messages))completion;

参数说明

参数类型说明
conversationTypeRCConversationType会话类型
targetIdNSString会话 targetId
channelIdNSString超级群频道 channelId
sentTimelong long以此时间戳为界,获取早于或晚于该时间的消息。
beforeCountint需要获取的发送时间早于指定时间戳的消息数量。
afterCountint需要获取的发送时间晚于指定时间戳的消息数量。
completionBlock获取的消息的回调。

示例代码

Objective C
 [[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
sentTime:0
beforeCount:10
afterCount:10 completion:^(NSArray<RCMessage *> * _Nullable messages) {

}];

获取会话中指定消息类型的消息

接口原型

Objective C
- (void)getHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
objectName:(nullable NSString *)objectName
oldestMessageId:(long)oldestMessageId
count:(int)count
completion:(nullable void(^)(NSArray<RCMessage *> * _Nullable messages))completion;

参数说明

参数类型说明
conversationTypeRCConversationType会话类型
targetIdNSString会话 targetId
channelIdNSString超级群频道 channelId
objectNameNSString消息类型标识。内置消息类型的标识可参见消息类型概述
oldestMessageIdlong以此 messageId 为界,获取发送时间更小的 count 条消息。ID 不存在时,设置为 -1,表示获取最新的 count 条消息。
countint需要获取的消息数量。
completionBlock获取的消息的回调。

示例代码

Objective C
[[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
objectName:@"RC:TxtMsg"
oldestMessageId:-1
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {

}];

如果需要获取早于或晚于指定消息的历史消息,可以使用以下带 isForward 参数的方法:

接口原型

Objective C
- (void)getHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
objectName:(nullable NSString *)objectName
baseMessageId:(long)baseMessageId
isForward:(BOOL)isForward
count:(int)count
completion:(nullable void(^)(NSArray<RCMessage *> * _Nullable messages))completion;

参数说明

参数类型说明
conversationTypeRCConversationType会话类型。
targetIdNSString会话 targetId
channelIdNSString超级群频道 channelId
objectNameNSString消息类型标识列表。内置消息类型的标识可参见消息类型概述
baseMessageIdlong以此消息 ID 为界,获取早于或晚于该消息的历史消息。
isForwardBOOLYES 表示获取早于传入时间戳的消息。NO 表示获取晚于传入时间戳的消息。
countint需要获取的消息数量。
completionBlock获取的消息的回调。

示例代码

Objective C
[[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
objectName:@"RC:TxtMsg"
baseMessageId:-1
isForward:true
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {

}];

获取指定多个消息类型的历史消息

您可以获取会话中,从指定消息之前或之后、指定数量的、多个消息类型的最新消息实体,异步返回消息实体 RCMessage 对象列表。

接口原型

Objective C
- (void)getHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
objectNames:(NSArray<NSString *> *)objectNames
sentTime:(long long)sentTime
isForward:(BOOL)isForward
count:(int)count
completion:(nullable void(^)(NSArray<RCMessage *> * _Nullable messages))completion;

参数说明

参数类型说明
conversationTypeRCConversationType会话类型。
targetIdNSString会话 targetId
channelIdNSString超级群频道 channelId
objectNamesNSArray消息类型标识列表。内置消息类型的标识可参见消息类型概述
sentTimelong long以此时间戳为界,获取早于或晚于该时间的消息。
isForwardBOOLYES 表示获取早于传入时间戳的消息。NO 表示获取晚于传入时间戳的消息。
countint需要获取的消息数量。
completionBlock获取的消息的回调。

示例代码

Objective C
[[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
objectNames:@[@"RC:TxtMsg"]
sendtTime:0
isForward:true
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {

}];

超级群还支持通过消息 messageUId 从本地数据库中提取消息。详见获取历史消息 中的通过消息 messageUId 获取消息

获取远端历史消息

从 5.6.4 开始,IMLib SDK 支持使用 RCChannelClientgetRemoteHistoryMessages 方法直接查询指定超级群会话存储在超级群消息云端存储中的历史消息。

提示

用户是否可以获取在加入超级群之前的群聊历史消息取决于对应 App Key 在融云控制台的设置。默认新入群用户只能看到他们入群后的群聊消息。配置方法详见开通超级群服务

自定义获取会话的远端历史消息

您可以通过 RCRemoteHistoryMsgOption 自定义 getRemoteHistoryMessages 方法获取远端历史消息的行为。IMLib SDK 会按照指定条件直接查询单群聊消息云端存储中的满足查询条件的历史消息。

提示
  • 因为默认 getRemoteHistoryMessages 方法返回的消息会跟本地消息排重后返回,建议先使用 getHistoryMessages 获取所有在本地数据库消息后,再以最后一条本地消息的 sentTime 作为 recordTime 获取远端历史消息。此方式无法获取断档消息,如果想获取断档消息,请使用 getMessages 接口获取本地与远端历史消息.

接口原型

Objective C
- (void)getRemoteHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
option:(RCRemoteHistoryMsgOption *)option
success:(nullable void (^)(NSArray<RCMessage *> *messages, BOOL isRemaining))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;

参数说明

RCRemoteHistoryMsgOption 中包含多个配置项,其中 countrecordTime 参数分别是获取历史消息的数量与分页查询时间戳。order 参数用于控制获取历史消息的时间方向,可选择获取早于或者晚于给定的 recordTime 的消息。includeLocalExistMessage 参数控制返回消息列表中是否需要包含本地数据库已存在的消息。

RCRemoteHistoryMsgOption 默认按消息发送时间降序查询会话中的消息,且默认会并将查询结果与本地数据库对比,排除重复的消息后,再返回消息对象列表。在 includeLocalExistMessage 设置为 NO 的情况下,建议 App 层先使用 getHistoryMessages,在本地数据库消息全部获取完之后,再获取远端历史消息,否则可能会获取不到本地存在的消息。

如需按消息发送时间升序查询会话中的消息,建议获取返回结果中最新一条消息的 sentTime,并在下一次调用时作为 recordTime 的值传入,以便遍历整个会话的消息历史记录。升序查询消息一般可用于跳转到会话页面指定消息位置后需要查询更新的历史消息的场景。

参数类型说明
conversationTypeRCConversationType会话类型
targetIdNSString超级群会话 targetId
channelIdNSString超级群频道 channelId
optionRCRemoteHistoryMsgOption可配置的参数,包括拉取数量、拉取顺序等
successBlockBlock获取成功的回调
errorBlockBlock获取失败的回调
  • RCRemoteHistoryMsgOption 说明

    参数说明
    recordTime时间戳,用于控制分页查询消息的边界。默认值为 0
    count要获取的消息数量。如果 SDK < 5.4.1,范围为 [2-20];如果 SDK ≧ 5.4.1,范围为 [2-100];默认值为 0,表示不获取。
    order拉取顺序。RCRemoteHistoryOrderDesc:降序,按消息发送时间递减的顺序,获取发送时间早于 recordTime 的消息,返回的列表中的消息按发送时间从新到旧排列。RCRemoteHistoryOrderAsc:升序,按消息发送时间递增的顺序,获取发送时间晚于 recordTime 的消息,返回的列表中的消息按发送时间从旧到新排列。默认值为 RCRemoteHistoryOrderDesc
    includeLocalExistMessage是否包含本地数据库中的已有消息。YES:包含,查询结果不与本地数据库排除重复,直接返回从服务端获取的历史消息。NO:不包含,查询结果先与本地数据库排除重复,只返回本地数据库中不存在的消息。默认值为 NO
  • success 说明:

    回调参数回调类型说明
    messagesNSArray获取到的历史消息数组
    isRemainingBOOL是否还有剩余消息
  • error 说明:

    回调参数回调类型说明
    statusRCErrorCode获取失败的错误码

示例代码

Objective C
RCRemoteHistoryMsgOption *option = [RCRemoteHistoryMsgOption new];
option.recordTime = recordTime;
option.count = 10;
option.order = RCRemoteHistoryOrderDesc;
option.includeLocalExistMessage = NO;

[[RCChannelClient sharedChannelManager] getRemoteHistoryMessages:ConversationType_ULTRAGROUP targetId:@"targetId" channelId:@"channelId" option:option success:^(NSArray<RCMessage *> * _Nonnull messages, BOOL isRemaining) {

} error:^(RCErrorCode status) {
///
}];

|

强制从服务端获取特定批量消息

您可以通过 getBatchRemoteUltraGroupMessages: 接口强制从服务端获取对应的消息,获取成功后会强制更新本地消息。

接口原型

Objective C
- (void)getBatchRemoteUltraGroupMessages:(NSArray <RCMessage*>*)messages
success:(void (^)(NSArray *matchedMsgList, NSArray *notMatchMsgList))successBlock
error:(void (^)(RCErrorCode status))errorBlock

参数说明

参数类型说明
messagesNSArray消息列表。最多查询 20 条,所有消息必须是超级群类型且为同一个会话,每个消息对象内的 ConversationType,targetId,channelId, messageUid,sentTime 需要为有效值。
successBlockBlock查询消息数量成功的回调,matchedMsgList 是从服务获取的消息列表;notMatchMsgList 有值则表示有消息含有非法参数,没有值表示从服务没有拿到对应消息。
errorBlockBlock查询消息数量失败的回调。

示例代码

统计本地历史消息数量

提示

RCChannelClient 从 5.6.4 开始支持该能力。

您可以获取指定超级群在指定时间范围内的消息数量。该方法支持传入一个频道列表,如果不指定任何频道,则返回全部频道在本地的历史消息数量。

接口原型

Objective C
- (void)getUltraGroupMessageCountByTimeRange:(NSString *)targetId
channelIds:(NSArray<NSString *> *)channelIds
startTime:(long long)startTime
endTime:(long long)endTime
success:(nullable void (^)(NSInteger count))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;

参数说明

参数类型说明
targetIdNSString超级群会话 targetId
channelIdsNSArray超级群频道 channelId 列表
sentTimelong long查询 startTime 之后的消息, startTime >= 0。
endTimelong long查询 endTime 之前的消息,endTime > startTime。
successBlockBlock查询消息数量成功的回调,返回对应消息数量。
errorBlockBlock查询消息数量失败的回调。

示例代码

Objective C
[[RCChannelClient sharedChannelManager] getUltraGroupMessageCountByTimeRange:@"targetId" channelIds:@[@"channelId"] startTime:0 endTime:endTime success:^(NSInteger count) {

} error:^(RCErrorCode status) {
}];