获取历史消息
- 如果您的应用/环境在 2022.10.13 日及以后开通超级群服务,超级群业务中会包含一个 ID 为
RCDefault
的默认频道。如果发消息时不指定频道 ID,则该消息会发送到RCDefault
频道中。在获取RCDefault
频道的历史消息时,需要传入该频 道 ID。- 如果您的应用/环境在 2022.10.13 日前已开通超级群服务,在发送消息时如果不指定频道 ID,则该消息不属于任何频道。获取历史消息时,如果不传入频道 ID,可获取不属于任何频道的消息。融云支持客户调整服务至最新行为。该行为调整将影响客户端、服务端收发消息、获取会话、清除历史消息、禁言等多个功能。如有需要,请提交工单咨询详细方案。
获取本地与远端历史消息
getMessages 方法先从本地获取历史消息,本地有缺失的情况下会从服务端同步缺失的部分。当本地没有更多消息的时候,会从服务端拉取。
- (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;
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型 |
targetId | NSString | 会话 ID |
channelId | NSString | 超级群频道 ID |
option | RCHistoryMessageOption | 可配置的参数,包括拉取数量、拉取顺序等 |
complete | Block | 获取消息的回调 |
error | Block | 获取消息失败的回调 |
-
RCHistoryMessageOption
说明:参数 说明 recordTime 时间戳,用于控制分页查询消息的边界。默认值为 0
。count 要获取的消息数量。如果 SDK < 5.4.1,范围为 [2-20];如果 SDK ≧ 5.4.1,范围为 [2-100];默认值为 0
,表示不获取。order 拉取顺序。 RCHistoryMessageOrderDesc
:降序,按消息发送时间递减的顺序,获取发送时间早于recordTime
的消息,返回的列表中的消息按发送时间从新到旧排列。RCHistoryMessageOrderAsc
: 升序,按消息发送时间递增的顺序,获取发送时间晚于recordTime
的消息,返回的列表中的消息按发送时间从旧到新排列。默认值为降序。
从本地数据库中获取消息
使用 getHistoryMessages
方法可分页查询指定会话存储在本地数据库中的历史消息,并返回消息对象列表。列表中的消息按发送时间从新到旧排列。
获取指定消息 ID 前的消息
异步获取会话中指定消息之前、指定数量的最新消息实体,返回消息实体 RCMessage
对象列表。
- (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。
建议获取返回结果中最早一条消息的 ID,并在下一次调用时作为 oldestMessageId
传入,以便遍历整个会话的消息历史记录。
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型 |
targetId | NSString | 会话 ID |
channelId | NSString | 超级群频道 ID |
oldestMessageId | long | 以此 messageId 为界,获取发送时间更小的 count 条消息。ID 不存在时,设置为 -1,表示获取最新的 count 条消息。 |
count | int | 需要获取的消息数量。 |
completion | Block | 获取的消息的回调。 |
获取指定时间戳前后的消息
超级群业务从 5.4.5 开始支持该功能。
异步获取会话中指定时间戳之前之后、指定数量的最新消息实体,返回消息实体 RCMessage
对象列表。
- (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;
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型 |
targetId | NSString | 会话 ID |
channelId | NSString | 超级群频道 ID |
sentTime | long long | 以此时间戳为界,获取早于或晚于该时间的消息。 |
beforeCount | int | 需要获取的发送时间早于指定时间戳的消息数量。 |
afterCount | int | 需要获取的发送时间晚于指定时间戳的消息数量。 |
completion | Block | 获取的消息的回调。 |
获取指定单个消息类型的历史消息
以下方法从指定消息之前的特定类型的最新消息实体,异步返回消息实体 RCMessage
对象列表。
- (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;
count
参数表示返回列表中应包含多少消息。oldestMessageId
参数用于控制分页的边界。每次调用 getHistoryMessages
方法时,SDK 会以 oldestMessageId
参数指向的消息为界,继续在下一页返回指定数量的消息。如果需要获取会话中最新的 count
条消息,可以将 oldestMessageId
设置为 -1。
建议获取返回结果中最早一条消息的 ID,并在下一次调用时作为 oldestMessageId
传入,以便遍历整个会话的消息历史记录。
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型 |
targetId | NSString | 会话 ID |
channelId | NSString | 超级群频道 ID |
objectName | NSString | 消息类型标识。内置消息类型的标识可参见消息类型概述。 |
oldestMessageId | long | 以此 messageId 为界,获取发送时间更小的 count 条消息。ID 不存在时,设置为 -1,表示获取最新的 count 条消息。 |
count | int | 需要获取的消息数量。 |
completion | Block | 获取的消息的回调。 |
如果需要获取早于或晚于指定消息的历史消息,可以使用以下带 isForward
参数的方法:
- (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;
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型。 |
targetId | NSString | 会话 ID |
channelId | NSString | 超级群频道 ID |
objectName | NSString | 消息类型标识列表。内置消息类型的标识可参见消息类型概述。 |
baseMessageId | long | 以此消息 ID 为界,获取早于或晚于该消息的历史消息。 |
isForward | BOOL | YES 表示获取早于传入时间戳的消息。NO 表示获取晚于传入时间戳的消息。 |
count | int | 需要获取的消息数量。 |
completion | Block | 获取的消息的回调。 |
获取指定多个消息类型的历史消息
获取会话中,从指定消息之前或之后、指定数量的、多个消息类型的最新消息实体,异步返回消息实体 RCMessage
对象列表。
- (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;
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型。 |
targetId | NSString | 会话 ID |
channelId | NSString | 超级群频道 ID |
objectNames | NSArray | 消息类型标识列表。内置消息类型的标识可参见消息类型概述。 |
sentTime | long long | 以此时间戳为界,获取早于或晚于该时间的消息。 |
isForward | BOOL | YES 表示获取早于传入时间戳的消息。NO 表示获取晚于传入时间戳的消息。 |
count | int | 需要获取的消息数量。 |
completion | Block | 获取的消息的回调。 |
获取远端历史消息
从 5.6.4 开始,SDK 支持使用 RCChannelClient
的 getRemoteHistoryMessages
方法直接查询指定会话存储在超级群消息云端存储中的历史消息。
用户是否可以获取在加入超级群之前的群聊历史消息取决于 App 在控制台的设置。默认新入群用户只能看到他们入群后的群聊消息。配置方法详见开通超级群服务。
获取会话的远端历史消息
SDK 按照指定条件直接查询并获取超级群消息云端存储中的满足查询条件的历史消息。查询结果与本地数据库对比,排除重复的消息后,返回消息对象列表。返回的消息列表中的消息按发送时间从新到旧排列。因为默认该接口返回的消息会跟本地消息排重后返回,建议先使用 getHistoryMessages
,在本地数据库消息全部获取完之后,再获取远端历史消息。否则可能会获取不到指定的部分或全部消息。
RCRemoteHistoryMsgOption
中包含多个配置项,其中 count
与 recordTime
参数分别时获取历史消息的数量与分页查询时间戳。order
参数用于控制获取历史消息的时间方向,可选择获取早于或者晚于给定的 recordTime
的消息。includeLocalExistMessage
参数控制返回消息列表中是否需要包含本地数据库已存在的消息。
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) {
///
}];
RCRemoteHistoryMsgOption
默认按消息发送时间降序查询会话中的消息,且默认会并将查询结果与本地数据库对比,排除重复的消息后,再返回消息对象列表。在 includeLocalExistMessage
设置为 NO
的情况下,建议 App 层先使用 getHistoryMessages
,在本地数据库消息全部获取完之后,再获取远端历史消息,否则可能会获取不到指定的部分或全部消息。
如需按消息发送时间升序查询会话中的 消息,建议获取返回结果中最新一条消息的 sentTime
,并在下一次调用时作为 recordTime
的值传入,以便遍历整个会话的消息历史记录。升序查询消息一般可用于跳转到会话页面指定消息位置后需要查询更新的历史消息的场景。
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型 |
targetId | NSString | 会话 ID |
channelId | NSString | 频道 ID |
option | RCRemoteHistoryMsgOption | 可配置的参数,包括拉取数量、拉取顺序等 |
successBlock | Block | 获取成功的回调,其中包含获取到的历史消息数组。isRemaining 表示是否还有剩余消息。 |
errorBlock | Block | 获取失败的回调。status 中返回错误码 RCErrorCode。 |
-
RCRemoteHistoryMsgOption
说明:参数 说明 recordTime 时间戳,用于控制分页查询消息的边界。默认值为 0
。count 要获取的消息数量。如果 SDK < 5.4.1,范围为 [2-20];如果 SDK ≧ 5.4.1,范围为 [2-100];默认值为 0
,表示不获取。order 拉取顺序。 RCRemoteHistoryOrderDesc
:降序,按消息发送时间递减的顺序,获取发送时间早于recordTime
的消息,返回的列表中的消息按发送时间从新到旧排列。RCRemoteHistoryOrderAsc
:升序,按消息发送时间递增的顺序,获取发送时间晚于recordTime
的消息,返回的列表中的消息按发送时间从旧到新排列。默认值为1
。includeLocalExistMessage 是否包含本地数据库中的已有消息。 YES
:包含,查询结果不与本地数据库排除重复,直接返回。NO
:不包含,查询结果先与本地数据库排除重复,只返回本地数据库中不存在的消息。默认值为NO
。
强制从服务端获取特定批量消息
getBatchRemoteUltraGroupMessages:
接口会强制从服务端获取对应的消息。
- 0 < messages 个数 ≦ 20
- messages 所有数据必须是超级群类型且为同一个会话
- message 有效 值为 ConversationType,targetId,channelId,messageUid,sentTime
matchedMsgList 从服务获取的消息列表
notMatchMsgList 非法参数或者从服务没有拿到对应消息
- (void)getBatchRemoteUltraGroupMessages:(NSArray <RCMessage*>*)messages
success:(void (^)(NSArray *matchedMsgList, NSArray *notMatchMsgList))successBlock
error:(void (^)(RCErrorCode status))errorBlock
超级群还支持通过消息 UID 从本地数据库中提取消息。详见获取历史消息 中的通过消息 UID 获取消息。
统计本地历史消息数量
RCChannelClient
从 5.6.4 开始支持该能力。
您可以获取指定超级群在指定时间范围内的消息数量。该方法支持传入一个频道列表,如果不指定任何频道,则返回全部频道在本地的历史消息数量。
- (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;