发送消息
IMKit 内置会话页面已实现了发送各类型消息的功能和 UI(部分消息类型需要插件支持)。当您在自定义页面需要发送消息时,可使用 IMKit 核心类 RCIM 下发送消息的方法。这些方法除了提供发送消息的功能外,还会触发 IMKit 内置页面的更新。
IMKit 支持发送普通消息和媒体类消息(参考消息介绍),普通消息父类是 RCMessageContent,媒体消息父类是 RCMediaMessageContent。发送媒体消息和普通消息本质的区别为是否有上传数据过程。
- 请务必使用 IMKit 核心类
RCIM下发送消息的方法,否则不会触发页面刷新。 - 发送普通消息使用
sendMessage方法,发送媒体消息使用sendMediaMessage方法。 - IMKit SDK 发送消息存在频率限制,每秒最多只能发送 5 条消息。
发送普通消息
在发送消息前,需要构造 RCMessage 对象。RCMessage 对象中包含要发送的普通消息内容,即 RCMessageContent 的子类,例如文本消息(RCTextMessage)。
当您调用 RCIM 的发送消息方法时,SDK 会触发内置的会话列表和会话页面的更新。
接口说明
- (RCMessage *)sendMessage:(RCMessage *)message
pushContent:(nullable NSString *)pushContent
pushData:(nullable NSString *)pushData
successBlock:(nullable void (^)(RCMessage *successMessage))successBlock
errorBlock:(nullable void (^)(RCErrorCode nErrorCode, RCMessage *errorMessage))errorBlock;
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 | 消息发送失败回调。 |
示例代码
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) {
//失败
}];
发送媒体消息
媒体消息 RCMessage 对象的 content 字段必须传入 RCMediaMessageContent 的子类对象,表示媒体消息内容。例如图片消息(RCImageMessage)、GIF 消息(RCGIFMessage)等。其他内置媒体消息类型包括文件消息(RCFileMessage)、位置消息(RCLocationMessage)、高清语音消息(RCHQVoiceMessage)、小视频消息(RCSightMessage),建议先集成相应的 IMKit 插件。
图片消息内容(RCImageMessage)支持设置为发送原图。
发送媒体消息需要使用 sendMediaMessage 方法。SDK 会为图片、小视频等生成缩略图,根据默认压缩配置进行压缩,再将图片、小视频等媒体文件上传到融云默认 的文件服务器(文件存储时长),上传成功之后会更新消息的远端的媒体地址后再发送消息。图片消息如已设置为发送原图,则不会进行压缩。
当您调用 RCIM 的发送消息方法时,SDK 会触发内置的会话列表和会话页面的更新。
接口原型
- (RCMessage *)sendMediaMessage:(RCMessage *)message
pushContent:(nullable NSString *)pushContent
pushData:(nullable NSString *)pushData
progress:(nullable void (^)(int progress, RCMessage *progressMessage))progressBlock
successBlock:(nullable void (^)(RCMessage *successMessage))successBlock
errorBlock:(nullable void (^)(RCErrorCode nErrorCode, RCMessage *errorMessage))errorBlock
cancel:(nullable void (^)(RCMessage *cancelMessage))cancelBlock;
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 | 取消发送的回调。 |
示例代码
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
progress:^(int progress, RCMessage *progressMessage) {
//媒体上传进度
}
successBlock:^(RCMessage *successMessage) {
//成功
}
errorBlock:^(RCErrorCode nErrorCode, RCMessage *errorMessage) {
//失败
}
cancel:^(RCMessage *cancelMessage) {
//取消
}];
如果媒体文件已经成功上传,即媒体消息已经有远端的媒体地址,可以直接当做普通消息发送。
发送多媒体消息并且上传到自己的服务器
SDK 从 5.3.5 版本开始提供该功能。
IMKit SDK 从 5.3.5 开始,支持由 App 自行处理媒体文件上传逻辑(可上传到自己的服务器),再发送消息。同时 SDK 会更新 UI 状态。您需要在 sendMediaMessage 的 uploadPrepareBlock 中自行实现媒体文件上传。
- 上传媒体文件的过程中, 可调用 RCUploadMediaStatusListener 的
updateBlock、errorBlock,通知 IMKit SDK 当前上传媒体文件的进度和状态,SDK 会更新 UI。 - 上传完毕后,取得网络文件 URL。通过 RCUploadMediaStatusListener 的
currentMessage属性获取当前RCMessage对象,将RCMessage对象的content中的对应 URL 字段设置成上传成功的网络文件 URL。 - 调用 RCUploadMediaStatusListener 的
successBlock,通知 SDK 文件上传完成。
接口原型
- (RCMessage *)sendMediaMessage:(RCMessage *)message
pushContent:(nullable NSString *)pushContent
pushData:(nullable NSString *)pushData
uploadPrepare:(nullable void (^)(RCUploadMediaStatusListener *uploadListener))uploadPrepareBlock
progress:(nullable void (^)(int progress, long messageId))progressBlock
successBlock:(nullable void (^)(long messageId))successBlock
errorBlock:(nullable void (^)(RCErrorCode errorCode, long messageId))errorBlock
cancel:(nullable void (^)(long messageId))cancelBlock;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| 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 | 取消发送的回调。 |
示例代码
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) {
//取消
}];