# 实现IM即时消息

本章将介绍如何实现IM即时消息。

# IM消息介绍

IM消息主要涉及以下几个的类

名称 描述
JCCloudManager (opens new window) 主要用于初始化、管理与cloud相关的所有回调和会话管理
JCCloudDatabase (opens new window) 会话信息的数据库操作(如获取会话相关的信息、查询、搜索、保存会话信息以及会话的管理等)
JCMessageWrapper (opens new window) 主要用于消息管理,包括发送消息,重发、转发、回复、消息已读、撤回、拉取消息、获取会话列表等

更多类的详细信息请参考 API Reference (opens new window)

# 发送文本消息

文本消息包括文字、Emoji、地理位置消息以及 @ 消息,上层可通过 contentType 参数定义消息类型

[JCMessageWrapper sendText:JCMessageChannelType1To1 serverUid:@"会话服务器 id" contentType:@"Text" content:@"文本内容" extraParams:nil atAll:false atServerUidList:nil];

输入参数介绍:

参数 类型 说明
type JCMessageChannelType 消息所属会话类型
serverUid NSString 会话服务器 id,一对一必须先获得对方 userId 的 serverUid,群聊必须先获得群的 serverUid
contentType NSString 消息类型
content NSString 消息内容
extra NSDictionaryNSString, NSObject 额外信息
atAll bool 是否@全体成员,针对群消息
atServerUidList NSArrayNSString @成员的serverUid列表 针对群消息

其中,JCMessageChannelType(消息类型)有:

/// 一对一消息
JCMessageChannelType1To1,
/// 群组消息
JCMessageChannelTypeGroup,

# 发送文件消息

文件消息包括文件、图片、视频、语音消息。均通过 sendFile 方法发送,并通过 contentType 参数进行不同消息类型的标识。具体如下

//发送图片
[JCMessageWrapper sendFile:JCMessageChannelType1To1 serverUid:@"会话服务器 id" contentType:@"Image" filePath:@"文件路径" thumbPath:@"缩略图路径" size:size duration:0 extraParams:@{"width":"oringinImage.size.width","height":"oringinImage.size.height"} expiredSeconds:expiredSeconds atAll:true atServerUidList:nil];

//发送视频
[JCMessageWrapper sendFile:JCMessageChannelType1To1 serverUid:@"会话服务器 id" contentType:@"Video" filePath:@"文件路径" thumbPath:@"缩略图路径" size:size duration:seconds extraParams:@{"width":"thumbImage.size.width","height":"thumbImage.size.height"} expiredSeconds:expiredSeconds atAll:true atServerUidList:nil];

//发送音频
[JCMessageWrapper sendFile:JCMessageChannelType1To1 serverUid:@"会话服务器 id" contentType:@"Audio" filePath:@"文件路径" thumbPath:nil size:size duration:seconds extraParams:nil expiredSeconds:expiredSeconds atAll:true atServerUidList:nil];

输入参数介绍:

参数 类型 说明
type JCMessageChannelType 消息所属会话类型
serverUid NSString 话服务器 id,一对一必须先获得对方 userId 的 serverUid,群聊必须先获得群的 serverUid
contentType NSString 消息类型
filePath NSString 文件本地路径
thumbPath NSString 缩略图本地路径
size int 文件大小
duration int 文件时长
extraParams NSDictionaryNSString, NSObject 额外信息
expiredSeconds int 过期秒数,-1表示永久
atAll bool 是否@全体成员,针对群消息
atServerUidList NSArrayNSString @成员的serverUid列表 针对群消息

# 删除消息

# 删除单条消息

//删除消息
[JCCloudDatabase deleteMessage:messageId];

输入参数介绍:

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

# 删除多条消息

[JCCloudDatabase deleteMessages:messageIds];

输入参数介绍:

参数 类型 说明
messageIds NSArrayNSNumber 消息数据库id列表

# 删除会话所有消息

[JCCloudDatabase deleteMessagesByConversationId:conversationId];

输入参数介绍:

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

# 更新消息

# 更新消息状态

消息状态包括消息发送的状态、收到消息、已读以及撤回。更新消息状态调用下面的接口

//更新消息状态为已收到消息
[JCCloudDatabase updateMessageState:messageId state:JCMessageChannelItemStateRecveived];

输入参数介绍:

参数 类型 说明
messageId long 消息数据库id
state JCMessageChannelItemState 消息状态

其中,JCMessageChannelItemState (opens new window) 请参考 API reference 中的 JCMessageChannelConstants 类。

# 标为已读

开发者可使用此功能将会话中的所有消息标为已读和未读状态。

例如,当 A 向 B 发送了一条消息,B 在未阅读之前,A 用户显示此消息未读,当 B 用户阅读并调用发送标为已读接口之后,A 用户可在相关回调中收到通知,此时可根据对应的数据内容将发送的消息显示为已读。

将一个会话的所有消息置为已读接口如下:

// 将该会话所有消息置为已读,并按照内部逻辑设置服务器已读
[JCMessageWrapper markRead:conversationId];

输入参数介绍:

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

# 相关回调

消息更新会触发 onConversationMessageUpdate(消息更新)的回调:

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

参数介绍:

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

# 查询消息

# 查询单条消息

[JCCloudDatabase queryMessage:messageId];

输入参数介绍:

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

返回值介绍:

返回值类型 说明
JCConversationMessageData 消息对象, 没有则返回 nil

其中,JCConversationMessageData (opens new window) 对象原型请查看 API reference 中的 JCCloudDatabase (opens new window) 类。