发送消息
IMKit 内置会话页面已实现了发送各类型消息的功能和 UI(部分消息类型需要插件支持)。当您在自定义页面需要发送消息时,可使用 IMKit 核心类 RCIM
下发送消息的方法。这些方法除了提供发送消息的功能外,还会触发 IMKit 内置页面的更新。
IMKit 支持发送普通消息和媒体类消息(参考消息介绍),普通消息父类是 RCMessageContent,媒体消息父类是 RCMediaMessageContent。发送媒体消息和普通消息本质的区别为是否有上传数据过程。
重要
- 请务必使用 IMKit 核心类
RCIM
下发送消息的方法,否则不会触发页面刷新。发送普通消息使用sendMessage
方法,发送媒体消息使用sendMediaMessage
方法。- 客户端 SDK 发送消息存在频率限制,每秒最多只能发送 5 条消息。
发送普通消息
在发送消息前,需要构造 RCMessage 对象。RCMessage
对象中包含要发送的普通消息内容,即 RCMessageContent
的子类,例如文本消息(RCTextMessage)。
调用 RCIM
的发送消息方法时,SDK 会触发内置的会话列表和会话页面的更新。
RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"测试文本消息"];
RCMessage *message = [[RCMessage alloc]
initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:messageContent];
[[RCIM sharedRCIM]
sendMessage:message
pushContent:nil
pushData:nil
successBlock:^(RCMessage *successMessage) {
//成功
}
errorBlock:^(RCErrorCode nErrorCode, RCMessage *errorMessage) {
//失败
}];
sendMessage
中直接提供了用于控制推送通知内容(pushContent
)和推送附加信息(pushData
)的参数。不过,如果您需要更精细地控制离线推送通知,例如标题、内容、图标、或其他第三方厂商个性化配置,请使用消息推送属性进行配置,详见自定义消息推送通知。请注意,聊天室会话不支持离线消息机制,因此也不支持离线消息转推送。
- 如果发送的消息属于 SDK 内置消息类型,例如 RCTextMessage,这两个参数可设置为
nil
。一旦消息触发离线推送通知时,融云服务端会使用各个内置消息类型默认的pushContent
值。关于各类型消息的默认推送通知内容,详见用户内容类消息格式。 - 如果消息类型为自定义消息类型,且需要支持离线推送通知,则必须向融云提供
pushContent
字段,否则用户无法收到离线推送通知。 - 如果消息类型为自定义消息类型,但不需要支持远程推送通知(例如通过自定义消息类型实现的 App 业务层操作指令),可将
pushContent
字段留空。 RCMessage
的推送属性配置MessagePushConfig
的pushContent
和pushData
会覆盖此处配置,并提供更多配置能力,例如自定义推送通知的标题。详见自定义消息推送通知。
参数 | 类型 | 说明 |
---|---|---|
message | RCMessage | 要发送的消息体。必填属性包括会话类型(conversationType ),会话 ID(targetId ),消息内容(content )。详见消息介绍 中对 RCMessage 的结构说明。 |
pushContent | NSString | 修改或指定远程消息推送通知栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。
|
pushData | NSString | Push 附加信息。可设置为 nil 。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。 |
successBlock | Block | 消息发送成功回调。 |
errorBlock | Block | 消息发送失败回调。 |
发送媒体消息
媒体消息 RCMessage
对象的 content
字段必须传入 RCMediaMessageContent 的子类对象,表示媒体消息内容。例如图片消息(RCImageMessage)、GIF 消息(RCGIFMessage)等。其他内置媒体消息类型包括文件消息(RCFileMessage)、位置消息(RCLocationMessage)、高清语音消息(RCHQVoiceMessage)、小视频消息(RCSightMessage),建议先集成相应的 IMKit 插件。
图片消息内容(RCImageMessage)支持设置为发送原图。
RCImageMessage *mediaMessageContent = [RCImageMessage messageWithImageURI:@"path/to/image"];
mediaMessageContent.full YES; // 图片消息支持设置以原图发送
RCMessage *message = [[RCMessage alloc] initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:mediaMessageContent];
发送媒体消息需要使用 sendMediaMessage
方法。SDK 会为图片、小视频等生成缩略图,根据默认压缩配置进行压缩,再将图片、小视频等媒体文件上传到融云默认的文件服务器(文件存储时长),上传成功之后再发送消息。图片消息如已设置为发送原图,则不会进行压缩。
调用 RCIM
的发送消息方法时,SDK 会触发内置的会话列表和会话页面的更新。
[[RCIM sharedRCIM] sendMediaMessage:message
pushContent:nil
pushData:nil
progress:^(int progress, RCMessage *progressMessage) {
//媒体上传进度
}
successBlock:^(RCMessage *successMessage) {
//成功
}
errorBlock:^(RCErrorCode nErrorCode, RCMessage *errorMessage) {
//失败
}
cancel:^(RCMessage *cancelMessage) {
//取消
}];
sendMediaMessage
中直接提供了用于控制推送通知内容(pushContent
)和推送附加信息(pushData
)的参数。不过,如果您需要更精细地控制离线推送通知,例如标题、内容、图标、或其他第三方厂商个性化配置,请使用消息推送属性进行配置,详见自定义消息推送通知。请注意,聊天室会话不支持离线消息机制,因 此也不支持离线消息转推送。
- 如果发送的消息属于 SDK 内置消息类型,例如 RCImageMessage,这两个参数可设置为
nil
。一旦消息触发离线推送通知时,融云服务端会使用各个内置消息类型默认的pushContent
值。关于各类型消息的默认推送通知内容,详见用户内容类消息格式。 - 如果消息类型为自定义消息类型,且需要支持离线推送通知,则必须向融云提供
pushContent
字段,否则用户无法收到离线推送通知。 - 如果消息类型为自定义消息类型,但不需要支持远程推送通知(例如通过自定义消息类型实现的 App 业务层操作指令),可将
pushContent
字段留空。 RCMessage
的推送属性配置MessagePushConfig
的pushContent
和pushData
会覆盖此处配置,并提供更多配置能力,例如自定义推送通知的标题。详见自定义消息推送通知。
参数 | 类型 | 说明 |
---|---|---|
message | RCMessage | 要发送的消息体。必填属性包括会话类型(conversationType ),会话 ID(targetId ),消息内容(content )。详见消息介绍 中对 RCMessage 的结构说明。 |
pushContent | NSString | 修改或指定远程消息推送通知栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。
|
pushData | NSString | Push 附加信息。可设置为 nil 。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。 |
progressBlock | Block | 媒体上传进度的回调。 |
successBlock | Block | 消息发送成功回调。 |
errorBlock | Block | 消息发送失败回调。 |
cancel | Block | 取消发送的回调。 |
如果媒体文件已经成功上传,可以直接当做普通消息发送。
发送多媒体消息并且上传到自己的服务器
SDK 从 5.3.5 版本开始提供该功能。
IMKit SDK 从 5.3.5 开始,支持由 App 自行处理媒体文 件上传逻辑(可上传到自己的服务器),再发送消息。同时 SDK 会更新 UI 状态。您需要在 sendMessageMessage
的 uploadPrepareBlock
中自行实现媒体文件上传。
- 上传媒体文件的过程中,可调用 RCUploadMediaStatusListener 的
updateBlock
、errorBlock
,通知 IMKit SDK 当前上传媒体文件的进度和状态,SDK 会更新 UI。 - 上传完毕后,取得网络文件 URL。通过 RCUploadMediaStatusListener 的
currentMessage
属性获取当前RCMessage
对象,将RCMessage
对象的content
中的对应 URL 字段设置成上传成功的网络文件 URL。 - 调用 RCUploadMediaStatusListener 的
successBlock
,通知 SDK 文件上传完成。
RCImageMessage *mediaMessageContent = [RCImageMessage messageWithImageURI:@"path/to/image"];
mediaMessageContent.full = YES; // 图片消息支持设置以原图发送
RCMessage *message = [[RCMessage alloc] initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:mediaMessageContent];
[[RCIM sharedRCIM] sendMediaMessage:message
pushContent:nil
pushData:nil
uploadPrepare:^(RCUploadMediaStatusListener *uploadListener) {
RCMessage *currentMessage = uploadListener.currentMessage;
// App 在上传媒体文件时,需要在监听中调用 updateBlock、successBlock 与 errorBlock,通知 IMKit SDK 当前上传媒体文件的进度和状态,SDK 会更新 UI。
if ([currentMessage.content isKindOfClass:[RCImageMessage class]]) {
RCImageMessage *content = (RCImageMessage *)currentMessage.content;
content.remoteUrl = remoteUrl;
uploadListener.successBlock(content)};
}
progress:^(int progress, RCMessage *progressMessage) {
//媒体上传进度
}
successBlock:^(RCMessage *successMessage) {
//成功
}
errorBlock:^(RCErrorCode nErrorCode, RCMessage *errorMessage) {
//失败
}
cancel:^(RCMessage *cancelMessage) {
//取消
}];
参数 | 类型 | 说明 |
---|---|---|
message | RCMessage | 要发送的消息体。必填属性包括会话类型(conversationType ),会话 ID(targetId ),消息内容(content )。详见消息介绍 中对 RCMessage 的结构说明。 |
pushContent | NSString | 修改或指定远程消息推送通知 栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。
|
pushData | NSString | Push 附加信息。可设置为 nil 。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。 |
uploadPrepareBlock | Block | 发送多媒体消息并上传到自己服务器的回调。 |
progressBlock | Block | 媒体上传进度的回调。 |
successBlock | Block | 消息发送成功回调。 |
errorBlock | Block | 消息发送失败回调。 |
cancel | Block | 取消发送的回调。 |