发送消息
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 | 取消发送的回调。 |
为消息禁用推送通知
在接收者未上线时,融云服务端默认触发推送服务,将消息通过推送通道下发(服务端是否触发推送也会收到应用级别、用户级别免打扰设置的影响)。
有时 App 用户可能希望在发送消息时就指定该条消息不需要触发推送。IMKit 提供该能力,但并未在 UI 上实现。如有需要,可通过以下方式实现:
-
在 App 继承的会话页面
RCConversationViewController
子类中,通过willSendMessage
回调拦截消息,详见 IMKit 会话页面的页面事件监听。如果不在会话页面拦截,您也可以通过单独设置消息拦截代理实现,详见消息拦截。 -
获取 RCMessage 消息对象。
-
将
messageConfig
的disableNotification
设置为YES
禁用该条消息的推送通知。接收方再次上线时会通过融云服务端的离线消息缓存(最多缓存 7 天)自动收取单聊、群聊、系统会话消息。RCMessage *message = [[RCMessage alloc]
initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:someMsg];
message.messageConfig.disableNotification = YES; -
调用发送消息方法重新发送消息。
自定义消息推送通知
IMKit 支持对单条消息的推送行为添加个性化配置(RCMessagePushConfig),但并未在 UI 上实现。如有需要,您可以在发送时拦截消息添加配置。拦截方式与为消息禁用推送通知一致。
RCMessagePushConfig
可提供以下能力,具体说明详见「APNs 推送开发指南」中的配置消息的推送属性。
- 自定义推送标题、推送通知内容
- 自定义通知栏图标
- 添加远程推送附加信息
- 越过接收客户端的配置,强制在推送通知内显示通知内容
- 其他 APNs 或 Android 推送通道支持的个性化配置