跳到主要内容

发送消息

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 的推送属性配置 MessagePushConfigpushContentpushData 会覆盖此处配置,并提供更多配置能力,例如自定义推送通知的标题。详见自定义消息推送通知
参数类型说明
messageRCMessage要发送的消息体。必填属性包括会话类型(conversationType),会话 ID(targetId),消息内容(content)。详见消息介绍 中对 RCMessage 的结构说明。
pushContentNSString修改或指定远程消息推送通知栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
  • 如果希望使用融云默认推送通知内容,可以填 nil。注意自定义消息类型无默认值。
  • 如果要为该条消息指定个性化的离线推送通知,必须在以上任一处向融云提供 pushContent 字段内容。
  • 如果您自定义的消息类型需要离线推送服务,必须在以上任一处向融云提供 pushContent 字段内容,否则用户无法收到离线推送通知。
pushDataNSStringPush 附加信息。可设置为 nil。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
successBlockBlock消息发送成功回调。
errorBlockBlock消息发送失败回调。

发送媒体消息

媒体消息 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 的推送属性配置 MessagePushConfigpushContentpushData 会覆盖此处配置,并提供更多配置能力,例如自定义推送通知的标题。详见自定义消息推送通知
参数类型说明
messageRCMessage要发送的消息体。必填属性包括会话类型(conversationType),会话 ID(targetId),消息内容(content)。详见消息介绍 中对 RCMessage 的结构说明。
pushContentNSString修改或指定远程消息推送通知栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
  • 如果希望使用融云默认推送通知内容,可以填 nil。注意自定义消息类型无默认值。
  • 如果要为该条消息指定个性化的离线推送通知,必须在以上任一处向融云提供 pushContent 字段内容。
  • 如果您自定义的消息类型需要离线推送服务,必须在以上任一处向融云提供 pushContent 字段内容,否则用户无法收到离线推送通知。
pushDataNSStringPush 附加信息。可设置为 nil。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
progressBlockBlock媒体上传进度的回调。
successBlockBlock消息发送成功回调。
errorBlockBlock消息发送失败回调。
cancelBlock取消发送的回调。
提示

如果媒体文件已经成功上传,可以直接当做普通消息发送。

发送多媒体消息并且上传到自己的服务器

提示

SDK 从 5.3.5 版本开始提供该功能。

IMKit SDK 从 5.3.5 开始,支持由 App 自行处理媒体文件上传逻辑(可上传到自己的服务器),再发送消息。同时 SDK 会更新 UI 状态。您需要在 sendMessageMessageuploadPrepareBlock 中自行实现媒体文件上传。

  • 上传媒体文件的过程中,可调用 RCUploadMediaStatusListenerupdateBlockerrorBlock,通知 IMKit SDK 当前上传媒体文件的进度和状态,SDK 会更新 UI。
  • 上传完毕后,取得网络文件 URL。通过 RCUploadMediaStatusListenercurrentMessage 属性获取当前 RCMessage 对象,将 RCMessage 对象的 content 中的对应 URL 字段设置成上传成功的网络文件 URL。
  • 调用 RCUploadMediaStatusListenersuccessBlock,通知 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) {
//取消
}];
参数类型说明
messageRCMessage要发送的消息体。必填属性包括会话类型(conversationType),会话 ID(targetId),消息内容(content)。详见消息介绍 中对 RCMessage 的结构说明。
pushContentNSString修改或指定远程消息推送通知栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
  • 如果希望使用融云默认推送通知内容,可以填 nil。注意自定义消息类型无默认值。
  • 如果要为该条消息指定个性化的离线推送通知,必须在以上任一处向融云提供 pushContent 字段内容。
  • 如果您自定义的消息类型需要离线推送服务,必须在以上任一处向融云提供 pushContent 字段内容,否则用户无法收到离线推送通知。
pushDataNSStringPush 附加信息。可设置为 nil。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
uploadPrepareBlockBlock发送多媒体消息并上传到自己服务器的回调。
progressBlockBlock媒体上传进度的回调。
successBlockBlock消息发送成功回调。
errorBlockBlock消息发送失败回调。
cancelBlock取消发送的回调。

为消息禁用推送通知

在接收者未上线时,融云服务端默认触发推送服务,将消息通过推送通道下发(服务端是否触发推送也会收到应用级别、用户级别免打扰设置的影响)。

有时 App 用户可能希望在发送消息时就指定该条消息不需要触发推送。IMKit 提供该能力,但并未在 UI 上实现。如有需要,可通过以下方式实现:

  1. 在 App 继承的会话页面 RCConversationViewController 子类中,通过 willSendMessage 回调拦截消息,详见 IMKit 会话页面的页面事件监听。如果不在会话页面拦截,您也可以通过单独设置消息拦截代理实现,详见消息拦截

  2. 获取 RCMessage 消息对象。

    • 如果 SDK < 5.3.5,您需要利用回调中获取的消息内容 RCMessageContent,组装 RCMessage 对象。
    • 如果 SDK ≧ 5.3.5,您可以直接通过消息拦截获取 RCMessage 对象。
  3. messageConfigdisableNotification 设置为 YES 禁用该条消息的推送通知。接收方再次上线时会通过融云服务端的离线消息缓存(最多缓存 7 天)自动收取单聊、群聊、系统会话消息。

    RCMessage *message = [[RCMessage alloc]
    initWithType:ConversationType_PRIVATE
    targetId:@"targetId"
    direction:MessageDirection_SEND
    content:someMsg];

    message.messageConfig.disableNotification = YES;
  4. 调用发送消息方法重新发送消息。

自定义消息推送通知

IMKit 支持对单条消息的推送行为添加个性化配置(RCMessagePushConfig),但并未在 UI 上实现。如有需要,您可以在发送时拦截消息添加配置。拦截方式与为消息禁用推送通知一致。

RCMessagePushConfig 可提供以下能力,具体说明详见「APNs 推送开发指南」中的配置消息的推送属性

  • 自定义推送标题、推送通知内容
  • 自定义通知栏图标
  • 添加远程推送附加信息
  • 越过接收客户端的配置,强制在推送通知内显示通知内容
  • 其他 APNs 或 Android 推送通道支持的个性化配置