跳到主要内容

插入消息

SDK 支持在本地数据库中插入消息。本地插入的消息不会实际发送给服务器和对方

提示
  • 请确保所有插入消息的均为支持客户端本地存储的消息,否则会报错。详见了解消息存储策略
  • 插入消息的接口仅将消息插入本地数据库,所以 App 卸载重装或者换端登录时插入的消息不会从远端同步到本地数据库。

插入发送消息

开发者可通过下面接口在本地数据库被插入一条对外发送的消息。不支持聊天室会话类型。以下示例使用 RCChannelClient 下的 insertOutgoingMessage 方法。

提示

如果 sentTime 有问题会影响消息排序,慎用!

RCTextMessage *content = [RCTextMessage messageWithContent:@"测试文本消息"];

[[RCChannelClient sharedChannelManager]
insertOutgoingMessage:ConversationType_PRIVATE
targetId:@"targetId"
channelId:@"channelId"
canIncludeExpansion:YES
sentStatus:SentStatus_SENT
content:content
sentTime:sentTime
completion:completion];

插入本地数据库的消息如需支持消息扩展功能,必须使用 RCChannelClient 下的插入方法,否则无法打开消息的可扩展属性(canIncludeExpansion)。本地插入消息时不支持设置消息扩展信息数据。App 可以选择合适的时机为消息设置扩展数据。详见消息扩展

参数类型说明
conversationTypeRCConversationType会话类型。
targetIdNSString会话 ID
channelIdNSString所属会话的业务标识。
canIncludeExpansionBOOL是否支持消息扩展。YES表示可扩展;NO 表示不可扩展。
sentStatusRCSentStatus发送状态。
contentRCMessageContent消息的内容。
sentTimelong long消息发送的 Unix 时间戳,单位为毫秒(传 0 会按照本地时间插入)。
completionBlock异步回调,返回已插入的消息实体 RCMessage

插入接收消息

开发者可通过下面接口在本地数据库被插入一条接收的消息。

提示

如果 sentTime 有问题会影响消息排序,慎用!

RCTextMessage *content = [RCTextMessage messageWithContent:@"测试文本消息"];

[[RCCoreClient sharedCoreClient]
insertIncomingMessage:ConversationType_PRIVATE
targetId:@"targetId"
senderUserId:@"senderUserId"
receivedStatus:ReceivedStatus_READ
content:content
sentTime:sentTime
completion:completion];
参数类型说明
conversationTypeRCConversationType会话类型,单聊传入 ConversationType_PRIVATE
targetIdNSStringTarget ID 用于标识会话,称为目标 ID 或会话 ID。注意,因为单聊业务中始终使用对端用户 ID 作为标识本端会话的 Target ID,因此在单聊会话中插入本端接收的消息时,Target ID 始终是单聊对端用户 ID。群聊、超级群的会话 ID 分别为群组 ID、超级群 ID。详见消息介绍中关于 Target ID 的说明。
senderUserIdNSString发送者ID
sentStatusRCReceivedStatus接收状态
contentRCMessageContent消息的内容
sentTimelong long消息发送的Unix时间戳,单位为毫秒(传 0 会按照本地时间插入)
completionBlock异步回调,返回已插入的消息实体 RCMessage

批量插入消息

提示
  • 从 5.1.1 版本开始支持该功能。
  • 从 5.3.0 版本 RCCoreClient 开始,建议使用下方异步返回结果的接口,原同步接口同时废弃。

在本地数据库批量插入消息。由于批量插入失败时数据会使数据整体插入失败,建议分批插入。该接口不支持聊天室会话类型,不支持超级群会话类型。

RCMessage 的下列属性会被入库,其余属性会被抛弃:

  • conversationType:会话类型。
  • messageUId:消息全局唯一 ID,消息成功收发后会带有由服务端生成的全局唯一 ID。SDK 从 5.3.5 开始支持入库该属性,该字段一般用于迁移数据。
  • targetId:会话 ID。
  • messageDirection:消息方向。
  • senderUserId:发送者 ID。
  • receivedStatus:接收状态;如果消息方向为接收方,并且 receivedStatusReceivedStatus_UNREAD 时,该条消息未读。未读消息数会累加到会话的未读消息数上。
  • sentStatus:发送状态。
  • content:消息的内容。
  • sentTime:消息发送的 Unix 时间戳,单位为毫秒,会影响消息排序。
  • extra:消息附加信息
/*!
异步批量插入接收的消息(该消息只插入本地数据库,实际不会发送给服务器和对方)

@discussion 此方法不支持聊天室的会话类型。不支持超级群会话类型。每批最多处理 500 条消息,超过 500 条返回 NO
@discussion 消息的未读会累加到会话的未读数上

@remarks 消息操作
*/
- (void)batchInsertMessage:(NSArray<RCMessage *> *)msgs completion:(nullable void(^)(BOOL))completion;
参数类型说明
msgsNSArray消息实体 RCMessage 对象列表。单次操作最多插入 500 条消息,建议单次插入 10 条。注意,message 中必须包含正确有效的 sentTime(消息发送的 Unix 时间戳,单位为毫秒),否则无法通过获取历史消息接口从数据库中获取该消息。
completionBlock异步回调,返回是否插入成功

批量插入消息提供以下方法,设置 checkDuplicateYES 后,SDK 会在插入时检查当前 UID 是否与数据库中 UID 重复,并移除重复项。注意,App 应自行保证插入的消息数组内部无重复的 UID。

- (void)batchInsertMessage:(NSArray<RCMessage *> *)msgs checkDuplicate:(BOOL)checkDuplicate completion:(nullable void(^)(BOOL ret))completion;