获取历史消息
获取历史消息时,您可以选择仅从本地数据中获取、仅从远端获取或者同时从本地与远端获取。
从 5.38.0 开始,如果返回的消息携带引用关系信息,应用可从返回的 RCMessage 对象的 quoteInfo 属性中读取。消息本身仍保持原消息类型,例如图片回复仍是图片消息,语音回复仍是语音消息。旧版引用消息仍通过 RCReferenceMessage(RC:ReferenceMsg)消息体返回。
开通服务
从远端获取单群聊历史消息是指从融云服务端获取历史消息,该功能要求 App Key 已启用融云提供的单群聊消息云端存储服务。您可以在控制台 IM 服务的服务购买页面为当前使用的 App Key 开启服务。如果使用生产环境的 App Key,请注意仅 IM 旗舰版或 IM 尊享版可开通该服务。具体功能与费用以融云官方价格说明页面及计费说明文档为准。
请注意区分历史消息记录与离线消息?。融云针对单聊、群聊、系统消息默认提供最多 7 天(可调整)的离线消息缓存服务。客户端上线时 SDK 会自动收取离线期间的消息,无需 App 层调用 API。详见管理离线消息存储配置。
从本地数据库中获取消息
您可以通过 getHistoryMessages 方法分页查询指定会话存储在本地数据库中的历史消息,并获取到异步返回的消息对象列表。列表中的消息按发送时间从新到旧排列。
IMLib SDK 从 5.3.0 版本开始支持异步获取消息列表,如果您版本低于 5.3.0 或者需要同步获取消息列表,可以在 IMLib SDK 查找使用 getHistoryMessages 的同名方法即可。
获取会话中指定消息 messageId 前的消息
接口原型
- (void)getHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
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 | 会话 Id |
| oldestMessageId | long | 用于控制分页的边界,以此 messageId 为界,获取发送时间更小的 count 条消息。设置为 -1 或 0,表示获取最新的 count 条消息。 |
| count | int | 需要获取的消息数量,按照消息发送时间从新到旧排列 |
| completion | Block | 异步回调,返回获取到的消息实体 RCMessage 数组 |
示例代码
[[RCCoreClient sharedCoreClient] getHistoryMessages:ConversationType_PRIVATE
targetId:@"targetId"
oldestMessageId:-1
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {
}];
获取指定时间戳前后的消息
异步获取会话中指定时间戳之前之后、指定数量的最新消息实体,并返回消息实体 RCMessage 对象列表。
接口原型
- (void)getHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
sentTime:(long long)sentTime
beforeCount:(int)beforeCount
afterCount:(int)afterCount
completion:(nullable void(^)(NSArray<RCMessage *> * _Nullable messages))completion;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| conversationType | RCConversationType | 会话类型 |
| targetId | NSString | 会话 ID |
| sentTime | long long | 以此时间戳为界,获取早于或晚于该时间的消息。 |
| beforeCount | int | 需要获取的发送时间早于指定时间戳的消息数量。 |
| afterCount | int | 需要获取的 发送时间晚于指定时间戳的消息数量。 |
| completion | Block | 获取的消息的回调。 |
示例代码
[[RCCoreClient sharedCoreClient] getHistoryMessages:ConversationType_PRIVATE
targetId:@"targetId"
sentTime:0
beforeCount:10
afterCount:10 completion:^(NSArray<RCMessage *> * _Nullable messages) {
}];
获取会话中指定消息类型的消息
接口原型
- (void)getHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
objectName:(nullable NSString *)objectName
oldestMessageId:(long)oldestMessageId
count:(int)count
completion:(nullable void(^)(NSArray<RCMessage *> *_Nullable messages))completion;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| conversationType | RCConversationType | 会话类型。 |
| targetId | NSString | 会话 ID。 |
| objectName | NSString | 消息类型标识,内置消息类型的标识可参见消息类型概述。 |
| oldestMessageId | long | 用于控制分页的边界,以此 messageId 为界,获取发送时间更小的 count 条消息。设置为 -1 或 0,表示获取最新的 count 条消息。 |
| count | int | 需要获取的消息数量,按照消息发送时间从新到旧排列 |
| completion | Block | 异步回调,返回获取到的消息实体 RCMessage 数组 |
示例代码
[[RCCoreClient sharedCoreClient] getHistoryMessages:ConversationType_PRIVATE
targetId:@"targetId"
objectName:@"RC:TxtMsg"
oldestMessageId:-1
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {
}];
如果需要获取早于或晚于指定消息的历史消息,可以使用以下带 isForward 参数的方法:
方法原型
- (void)getHistoryMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
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。 |
| objectName | NSString | 消息类型标识,内置消息类型的标识可参见消息类型概述。 |
| baseMessageId | long | 用于控制分页的边界,以此 messageId 为界,获取发送时间更小的 count 条消息。设置为 -1 或 0,表示获取最新的 count 条消息。 |
| isForward | BOOL | 查询方向,true 为向前,false 为向后。 |
| count | int | 需要获取的消息数量,按照消息发送时间从新到旧排列。 |
| completion | Block | 异步回调,返回获取到的消息实体 RCMessage 数组。 |
示例代码
[[RCCoreClient sharedCoreClient] getHistoryMessages:ConversationType_PRIVATE
targetId:@"targetId"
objectName:@"RC:TxtMsg"
baseMessageId:-1
isForward:true
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {
}];
通过消息 messageUId 获取消息
- SDK 从 5.2.5.1 版本开始支持通过消息的 messageUId 批量获取消息的接口。仅在
RCChannelClient类中提供。支持的会话类型包括单聊、群聊、聊天室、超级群。 - 如果 SDK 版本低于 5.2.5.1,可 以使用
RCCoreClient类中的getMessageByUId方法,该方法一次仅支持传入一个 messageUId。
消息的 messageUId 是由融云服务端生成的消息的全局唯一 ID。消息存入本地数据库后,您可以通过消息的 messageUId,从本地数据库中获取到该消息。
例如,您的用户希望收藏聊天记录中的部分消息,App 可以先记录消息的 messageUId,在需要展示时调用 getBatchLocalMessages,传入收藏消息的 messageUId,从本地数据库中提取消息。
接口原型
- (void)getBatchLocalMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
channelId:(nullable NSString *)channelId
messageUIDs:(NSArray<NSString *> *)messageUIDs
success:(nullable void (^)(NSArray<RCMessage *> *messages, NSArray<NSString *> *mismatch))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;