# 消息管理

SDK 中用于表示消息的对象为 JCConversationMessageData (opens new window) 。它是 IM 即时通讯中最关键最重要的类,是传递信息的基本模型。

JCConversationMessageData 对象包含消息id、会话id、发送消息的userId等属性。

消息支持的类型有:文字、文件、图片、表情、位置、语音消息、小视频。

# 转发/回复消息

# 消息转发

消息转发分为单条转发和合并转发。

  • 单条转发
// 获取messageId
long messageId = [JCCloudDatabase addMessage:type serverUid:serverUid senderUid:JCCloudManager.shared.client.serverUid contentType:contentType content:content extra:extraParams atAll:atAll atServerUidList:atServerUidList];
//转发消息,有文件url和文本消息都可以转发
[JCMessageWrapper forwordMessage:messageIds serverUids:serverUids];

输入参数介绍:

参数 类型 说明
messageIds NSArray<NSNumber*> 数据库消息 id 列表
serverUids NSArray 会话 serverUid 列表
  • 合并转发
//合并转发消息,有文件url和文本消息都可以转发
[JCMessageWrapper mergeForwordMessage:messageIds serverUids:serverUids title:@"标题"];

输入参数介绍:

参数 类型 说明
messageIds NSArray<NSNumber*> 数据库消息 id 列表
serverUids NSArray 会话 serverUid 列表
title NSString 标题

# 回复消息

[JCMessageWrapper replyMessage:messageId content:@"消息内容"];

输入参数介绍:

参数 类型 说明
messageId long 本地数据库消息 id
content NSString 回复内容

# 消息重发

调用下面的方法进行消息重发,只针对发送失败消息的情况,会删除原先消息并重新生成一条

// 获取messageId
long messageId = [JCCloudDatabase addMessage:type serverUid:serverUid senderUid:JCCloudManager.shared.client.serverUid contentType:contentType content:content extra:extraParams atAll:atAll atServerUidList:atServerUidList];
// 重发消息,只针对发送失败消息,会删除原先消息并重新生成一条
[JCMessageWrapper resendMessage:messageId];

输入参数介绍:

参数 类型 说明
messageId long 数据库消息 id

# 相关回调

发送消息会触发 onConversationMessageAdd(新增消息) 回调 和 onConversationMessageUpdate(消息更新)的回调

//新增消息回调
-(void)onConversationMessageAdd:(long)conversationId message:(JCConversationMessageData* __nonnull)message {
    NSLog(@"消息:%ld 新增", conversationId);
}

//消息更新回调
-(void)onConversationMessageUpdate:(long)conversationId message:(JCConversationMessageData* __nonnull)message {
    NSLog(@"消息:%ld 更新", conversationId);
}

参数介绍:

参数 类型 说明
conversationId long 会话数据库 id
message JCConversationMessageData 消息数据库对象

# 撤回消息

调用下面的方法撤回已发送成功的消息

[JCMessageWrapper withdrawalMessage:JCMessageChannelType1To1 serverUid:@" 会话服务器 id" dbMessageId:dbMessageId usingBlock:^(bool, int, NSObject * _Nullable) {
    NSLog(@"消息撤回");
}];

输入参数介绍:

参数 类型 说明
type JCMessageChannelType 消息所属会话类型
serverUid NSString 会话服务器 id
dbMessageId long 数据库消息id
block MessageOperationBlock 结果函数,obj 无数据返回

# 相关回调

发送消息会触发 onConversationMessageDelete(新增消息) 回调 和 onConversationMessageUpdate(消息更新)的回调

//消息删除回调
-(void)onConversationMessageDelete:(long)conversationId message:(JCConversationMessageData* __nonnull)message {
      NSLog(@"消息:%ld 删除", conversationId);
}

//消息更新回调
-(void)onConversationMessageUpdate:(long)conversationId message:(JCConversationMessageData* __nonnull)message {
    NSLog(@"消息:%ld 更新", conversationId);
}

参数介绍:

参数 类型 说明
conversationId long 会话数据库 id
message JCConversationMessageData 消息数据库对象

# 接收/查询消息

# 拉取历史消息

拉取历史消息是以某一条消息 Id 为起始向上拉去一定条数的消息,当 dbMessageId 为 -1 时表示从最新一条开始拉取

[JCMessageWrapper fetchMessages:@"会话服务器id" dbMessageId:dbMessageId count:5 usingBlock:^(bool, int, NSObject * _Nullable) {
    NSLog(@"拉取消息");
}];

输入参数介绍:

参数 类型 说明
serverUid NSString 会话服务器id
dbMessageId long 起始本地数据库消息id, -1 表示从最新一条开始取
count int 消息条数不包括(dbMessageId)
block MessageOperationBlock 结果函数,obj 无数据返回

# 下载文件

  • 下载文件

当收到消息时会收到 onConversationMessageAdd 回调。

此时可以根据 message 对象的 direction 属性判断是接收消息还是发送消息,如果为 JCMessageChannelItemDirectionReceive 则为收到消息;

通过 message 对象的 content_type(可以自定义) 属性判断消息类型,如果消息类型为文件,则需要调用下面的接口下载文件。

-(void)onConversationMessageAdd:(long)conversationId message:(JCConversationMessageData* __nonnull)message {
    //下载文件
    [JCMessageWrapper downloadFile:message._id fileUrl:message.file_url savePath:@"保存路径"];
}

输入参数介绍:

参数 类型 说明
messageId long 数据库消息 id
fileUrl NSString 文件 url
savePath NSString 保存路径
  • 下载离线文件
//下载文件,只会更新消息进度,不会更新消息状态,用于离线发送文件下载
[JCMessageWrapper downloadFileOnly:messageId fileUrl:@"文件 url" savePath:@"保存路径"];

输入参数介绍:

参数 类型 说明
messageId long 数据库消息 id
fileUrl NSString 文件 url
savePath NSString 保存路径

# 查询本地数据库消息

NSArray<JCConversationMessageData*> *messageData = [JCCloudDatabase queryMessages:conversationId count:10 timestamp:lastTimestamp beforeTimestamp:false];

输入参数介绍:

参数 类型 说明
conversationId long 会话数据库id
count int 消息条数, -1 表示符合条件的所有消息
timestamp long 时间位置,-1 表示从最新开始查之前的
beforeTimestamp bool timestamp 不为 -1 才有意义, true 表示在 timestamp 值之前的消息,不包含该时间消息

返回值介绍:

返回值类型 说明
NSArray<JCConversationMessageData*> 消息列表

# 查询最后一条消息本地数据库 id

[JCCloudDatabase getLastMessageId:conversationId];

输入参数介绍:

参数 类型 说明
conversationId long 会话数据库 id

返回值介绍:

返回值类型 说明
long 本地数据库消息id

# 查询最后一条有服务器标识的消息服务器id

查询最后一条有服务器标识的消息服务器id 即会话的消息列表中 server_message_id 最大的一条消息(server_message_id 是从 0 开始递增的),所以该方法是查询会话中已经发送成功或者接收的最后一条消息

[JCCloudDatabase getLastServerMessageId:conversationId];

输入参数介绍:

参数 类型 说明
conversationId long 会话数据库id

返回值介绍:

返回值类型 说明
long 服务器消息id

# 消息搜索

# 搜索回复的消息

JCReplySearchData *searchData = [JCCloudDatabase searchReplyData:serverMessageId];

输入参数介绍:

参数 类型 说明
serverMessageId long 消息数据库id

其中,JCReplySearchData 原型请查看 API reference 中的 JCCloudDatabase 类。

返回值介绍:

返回值类型 说明
JCReplySearchData 回复消息搜索数据对象

# 搜索本地文本消息

通过搜索关键字以及消息内容类型搜索本地文本消息,接口如下

JCConversationMessageData *data = [JCCloudDatabase searchMessage:@"搜索关键字" contentTypes:@[@"Image", @"Text"] conversationId:conversationId];

输入参数介绍:

参数 类型 说明
key NSString 搜索关键字
contentTypes NSArray<NSString*> 内容类型
conversationId long 会话id,-1表示所有会话

返回值介绍:

返回值类型 说明
JCConversationMessageData 搜索到的消息对象

# 根据消息类型搜索本地消息

//根据消息类型搜索本地消息,一般用于搜索文件消息
NSArray<JCConversationMessageData*> *messageData = [JCCloudDatabase searchMessageByContentType:@[@"Image", @"Video"] conversationId:conversationId];

输入参数介绍:

参数 类型 说明
contentTypes NSArray<NSString*> 消息类型数组
conversationId long 会话id,-1表示所有会话

返回值介绍:

返回值类型 说明
NSArray<JCConversationMessageData*> 会话消息列表