获取历史消息
获取历史消息时,您可以选择仅从本地数据中获取、仅从远端获取或者同时从本地与远端获取。 超级群会话没有离线消息,如果想获取用户离线时候的消息需要您根据超级群会话最后一条消息去获取远端的历史消息。
- 如果您的应用/环境在 2022.10.13 日及以后开通超级群服务,超级群业务中会包含一个 ID 为
RCDefault
的默认频道。如果发消息时不指定频道 ID,则该消息会发送到RCDefault
频道中。在获取RCDefault
频道的历史消息时,需要传入该频道 ID。 - 如果您的应用/环境在 2022.10.13 日前已开通超级群服务,在发送消息时如果不指定频道 ID,则该消息不属于任何频道。获取历史消息时,如果不传入频道 ID,可获取不属于任何频道的消息。融云支持客户调整服务至最新行为。该行为调整将影响客户端、服务端收发消息、获取会话、清除历史消息、禁言等多个功能。如有需要,请提交工单咨询详细方案。
- 从远端获取单群聊历史消息是指从融云服务端获取历史消息,该功能要求 App Key 已启用融云提供的单群聊消息云端存储服务。您可以在控制台 IM 服务管理页面为当前使用的 App Key 开启服务。如果使用生产环境的 App Key,请注意仅 IM 旗舰版或 IM 尊享版可开通该服务。具体功能与费用以融云官方价格说明页面及计费说明文档为准
获取本地与远端历史消息
您可以通过 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 | 超级群频道 channelId |
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
的消息,返回的列表中的消息按发送时间从旧到新排列。默认值为降序。
示例代码
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
对象列表。
接口原型
- (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
传入,以便遍历整个会话的消息历史记录。
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型 |
targetId | NSString | 会话 targetId |
channelId | NSString | 超级群频道 channelId |
oldestMessageId | long | 以此 messageId 为界,获取发送时间更小的 count 条消息。ID 不存在时,设置为 -1,表示获取最新的 count 条消息。 |
count | int | 需要获取的消息数量。 |
completion | Block | 获取的消息的回调。 |
示例代码
[[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
oldestMessageId:-1
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {
}];
获取指定时间戳前后的消息
超级群业务从 5.3.0 开始支持该功能。
异步获取会话中指定时间戳之前之后、指定数量的最新消息实体,并返回消息实体 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 | 会话 targetId |
channelId | NSString | 超级群频道 channelId |
sentTime | long long | 以此时间戳为界,获取早于或晚于该时间的消息。 |
beforeCount | int | 需要获取的发送时间早于指定时间戳的消息数量。 |
afterCount | int | 需要获取的发送时间晚于指定时间戳的消息数量。 |
completion | Block | 获取的消息的回调。 |
示例代码
[[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
sentTime:0
beforeCount:10
afterCount:10 completion:^(NSArray<RCMessage *> * _Nullable messages) {
}];
获取会话中指定消息类型的消息
接口原型
- (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;
参数说明
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型 |
targetId | NSString | 会话 targetId |
channelId | NSString | 超级群频道 channelId |
objectName | NSString | 消息类型标识。内置消息类型的标识可参见消息类型概述。 |
oldestMessageId | long | 以此 messageId 为界,获取发送时间更小的 count 条消息。ID 不存在时,设置为 -1,表示获取最新的 count 条消息。 |
count | int | 需要获取的消息数量。 |
completion | Block | 获取的消息的回调。 |
示例代码
[[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
objectName:@"RC:TxtMsg"
oldestMessageId:-1
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {
}];
如果需要获取早于或晚于指定消息的历史消息,可以使用以下带 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 | 会话 targetId |
channelId | NSString | 超级群频道 channelId |
objectName | NSString | 消息类型标识列表。内置消息类型的标识可参见消息类型概述。 |
baseMessageId | long | 以此消息 ID 为界,获取早于或晚于该消息的历史消息。 |
isForward | BOOL | YES 表示获取早于传入时间戳的消息。NO 表示获取晚于传入时间戳的消息。 |
count | int | 需要获取的消息数量。 |
completion | Block | 获取的消息的回调。 |
示例代码
[[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
objectName:@"RC:TxtMsg"
baseMessageId:-1
isForward:true
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {
}];
获取指定多个消息类型的历史消息
您可以获取会话中,从指定消息之前或之后、指定数量的、多个消息类型的最新消息实体,异步返回消息实体 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 | 会话 targetId |
channelId | NSString | 超级群频道 channelId |
objectNames | NSArray | 消息类型标识列表。内置消息类型的标识可参见消息类型概述。 |
sentTime | long long | 以此时间戳为界,获取早于或晚于该时间的消息。 |
isForward | BOOL | YES 表示获取早于传入时间戳的消息。NO 表示获取晚于传入时间戳的消息。 |
count | int | 需要获取的消息数量。 |
completion | Block | 获取的消息的回调。 |
示例代码
[[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 支 持使用 RCChannelClient
的 getRemoteHistoryMessages
方法直接查询指定超级群会话存储在超级群消息云端存储中的历史消息。
用户是否可以获取在加入超级群之前的群聊历史消息取决于对应 App Key 在融云控制台的设置。默认新入群用户只能看到他们入群后的群聊消息。配置方法详见开通超级群服务。
自定义获取会话的远端历史消息
您可以通过 RCRemoteHistoryMsgOption
自定义 getRemoteHistoryMessages
方法获取远端历史消息的行为。IMLib SDK 会按照指定条件直接查询单群聊消息云端存储中的满足查询条件的历史消息。
- 因为默认
getRemoteHistoryMessages
方法返回的消息会跟本地消息排重后返回,建议先使用getHistoryMessages
获取所有在本地数据库消息后,再以最后一条本地消息的 sentTime 作为 recordTime 获取远端历史消息。此方式无法获取断档消息,如果想获取断档消息,请使用getMessages
接口获取本地与远端历史消息.
接口原型
- (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
中包含多个配置项,其中 count
与 recordTime
参数分别是获取历史消息的数量与分页查询时间戳。order
参数用于控制获取历史消息的时间方向,可选择获取早于或者晚于给定的 recordTime
的消息。includeLocalExistMessage
参数控制返回消息列表中是否需要包含本地数据库已存在的消息。
RCRemoteHistoryMsgOption
默认按消息发送时间降序查询会话中的消息,且默认会并将查询结果与本地数据库对比,排除重复的消息后,再返回消息对象列表。在 includeLocalExistMessage
设置为 NO
的情况下,建议 App 层先使用 getHistoryMessages
,在本地数据库消息全部获取完之后,再获取远端历史消息,否则可能会获取不到本地存在的消息。
如需按消息发送时间升序查询会话中的消息,建议获取返回结果中最新一条消息的 sentTime
,并在下一次调用时作为 recordTime
的值传入,以便遍历整个会话的消息历史记录。升序查询消息一般可用于跳转到会话页面指定消息位置后需要查询更新的历史消息的场景。
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 会话类型 |
targetId | NSString | 超级群会话 targetId |
channelId | NSString | 超级群频道 channelId |
option | RCRemoteHistoryMsgOption | 可配置的参数,包括拉取数量、拉取顺序等 |
successBlock | Block | 获取成功的回调 |
errorBlock | Block | 获取失败的回调 |
-
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
说明:回调参数 回调类型 说明 messages NSArray 获取到的历史消息数组 isRemaining BOOL 是否还有剩余消息 -
error
说明:回调参数 回调类型 说明 status RCErrorCode 获取失败的错误码