获取历史消息
获取历史消息时,您可以选择仅从本地数据中获取、仅从远端获取或者同时从本地与远端获取。 超级群会话没有离线消息,如果想获取用户离线时候的消息需要您根据超级群会话最后一条消息去获取远端的历史消息。
提示
- 如果您的应用/环境在 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;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| 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的消息,返回的列表中的消息按发送时间从旧到新排列。默认值为降序。
示例代码
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 传入,以便遍历整个会话的消息历史记录。
| 参数 | 类型 | 说明 |
|---|---|---|
| conversationType | RCConversationType | 会话类型 |
| targetId | NSString | 会话 targetId |
| channelId | NSString | 超级群频道 channelId |
| oldestMessageId | long | 以此 messageId 为界,获取发送时间更小的 count 条消息。ID 不存在时,设置为 -1,表示获取最新的 count 条消息。 |
| count | int | 需要获取的消息数量。 |
| completion | Block | 获取的消息的回调。 |
示例代码
Objective C
[[RCChannelClient sharedChannelManager] getHistoryMessages:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
oldestMessageId:-1
count:10
completion:^(NSArray<RCMessage *> * _Nullable messages) {
}];