发送消息
本文主要描述了如何使用 IMLib SDK 向单聊会话、群聊会话、聊天室会话中发送消息。
如发送超级群消息,请参见超级群群文档 收发消息。
消息内容类型简介
IMLib SDK 定义的 RCMessage 对象的 content
属性中可包含两大类消息内容:普通消息内容和媒体消息内容。普通消息内容父类是 RCMessageContent,媒体消息内容父类是 RCMediaMessageContent。发送媒体消息和普通消息的接口是不一样的,本质的区别为是否有上传媒体数据的过程。
功能 | 消息内容的类型 | 父类 | 描述 |
---|---|---|---|
文本消息 | RCTextMessage | RCMessageContent | 文本消息的内容。 |
引用回复 | RCReferenceMessage | RCMessageContent | 引用消息的内容,用于实现引用回复功能。 |
图片消息 | RCImageMessage | RCMediaMessageContent | 图片消息的内容,支持发送原图。 |
GIF 消息 | RCGIFMessage | RCMediaMessageContent | GIF 消息的内容。 |
文件消息 | RCFileMessage | RCMediaMessageContent | 文件消息的内容。 |
语音消息 | RCHQVoiceMessage | RCMediaMessageContent | 高清语音消息的内容。 |
提及他人(@ 消息) | 不适用 | 不适用 | @消息并非预定义的消息类型。详见如何发送 @ 消息。 |
以上为 IMLib SDK 内置的部分消息内容类型。您还可以创建自定义的消息内容类型,如果您创建的自定义消息是普通消息类型请选择使用 sendMessage
方法,如果您创建的是媒体消息类型请选择使用 sendMediaMessage
方法发送。详见自定义消息类型。
- 发送普通消息请使用
sendMessage
方法,发送媒体消息请使用sendMediaMessage
方法。- 客户端 SDK 发送消息存在频率限制,每秒最多只能发送 5 条消息。
普通消息
普通消息指文本消息、引用消息等不涉及媒体文件上传的消息。普通消息的消息内容为 RCMessageContent
的子类的消息,例如文本消息内容(RCTextMessage),或自定义类型的普通消息内容。
构造普通消息
您在发送普通消息前,需要先通过设置会话类型(单聊、群聊、聊天室)、会话的 Target ID、消息方向(发送或接收),消息内容来构造 RCMessage 对象。以下示例中构造了一条包含文本消息内容(RCTextMessage)的消息对象。
RCMessaage
的disableUpdateLastMessage
属性,可以控制是否将该消息更新到会话最新一条消息,默认 NO: 会更新到会话最后一条消息中,YES: 不更新到会话的最后一条消息中。
RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"测试文本消息"];
RCConversationType conversationType = ConversationType_PRIVATE
RCMessage *message = [[RCMessage alloc]
initWithType:conversationType
targetId:@"targetId"
direction:MessageDirection_SEND
content:messageContent];
发送普通消息
如果 RCMessage 对象中的消息内容是普通消息内容,请使用 IMLib SDK 核心类 RCCoreClient
的 sendMessage
方法发送消息。
接口原型
- (void)sendMessage:(RCMessage *)message
pushContent:(nullable NSString *)pushContent
pushData:(nullable NSString *)pushData
attached:(nullable void(^)(RCMessage *_Nullable message))attachedBlock
successBlock:(nullable void (^)(RCMessage *successMessage))successBlock
errorBlock:(nullable void (^)(RCErrorCode nErrorCode, RCMessage *errorMessage))errorBlock;
sendMessage 方法中直接提供了用于控制消息推送通知内容(pushContent
)和推送附加信息(pushData
)的参数。除了使用这种方式外,还可以使用消息推送属性配置 RCMessagePushConfig,其中包含了 pushContent
和 pushData
,并提供更多推送通知配置能力,例如推送标题、推送内容、推送图标、或其他第三方厂商个性化配置。详见远程推送通知。
关于是否需要配置 sendMessage
接口中的 pushContent
参数或 RCMessage
的 messagePushConfig
属性中 pushContent
,请参考以下内容:
- 如果消息类型为即时通讯服务预定义消息类型中的用户内容类消息格式,例如 RCTextMessage,
pushContent
可设置为null
。一旦消息触发离线推送通知时,远程推送通知默认使用服务端预置的推送通知内容。关于各类型消息的默认推送通知内容,详见用户内容类消息格式。 - 如果消息类型为即时通讯服务预定义消息类型中通知类、信令类("撤回命令消息" 除外),且需要支持远程推送通知,则必须填写
pushContent
,否则收件人不在线时无法收到远程推送通知。如无需触发远程推送,可不填该字段。 - 如果消息类型为自 定义消息类型,请参考自定义消息如何支持远程推送。
- 请注意,聊天室会话不支持离线消息机制,因此也不支持离线消息转推送。
参数说明
参数 | 类型 | 说明 |
---|---|---|
message | RCMessage | 要发送的消息体。必填属性包括会话类型(conversationType ),会话 ID(targetId ),消息内容(content )。详见[消息介绍] 中对 RCMessage 的结构说明。 |
pushContent | NSString | 修改或指定远程消息推送通知栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。 |
pushData | NSString | Push 附加信息。可设置为 nil 。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。 |
attachedBlock | Block | 消息已成功存入消息数据库的回调。 |
successBlock | Block | 消息发送成功回调。 |
errorBlock | Block | 消息发送失败回调。 |
您可以通过 RCCoreClient
的 sendMessage
方法的回调确认您的消息是否已成功发送到融云服务器。当因任何问题导致发送失败时,可通过回调方法获取到返回的异常。
示例代码
RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"测试文本消息"];
RCMessage *message = [[RCMessage alloc]
initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:messageContent];
[[RCCoreClient sharedRCCoreClient]
sendMessage:message
pushContent:nil
pushData:nil
attached:^(RCMessage *successMessage) {
//入库成功
}
successBlock:^(RCMessage *successMessage) {
//成功
}
errorBlock:^(RCErrorCode nErrorCode, RCMessage *errorMessage) {
//失败
}];
- 关于如何个性化配置接收方离线时收到的远程推送通知,详见下文远程推送通知。
- 自定义消息类型默认不支持离线消息转推送机制。如需支持,详见下文自定义消息如何支持远程推送。
媒体消息
媒体消息指图片、GIF、文件等需要处理媒体文件上传的消息。媒体消息的消息内容类型为 RCMeidaMessageContent
的子类,例如高清语音消息内容(RCHQVoiceMessage),或您自定义类型的媒体消息内容。
构造媒体消息
在发送前,需要先构造 RCMessage 对象。媒体消息 RCMessage
对象的 content
字段必须传入 RCMediaMessageContent 的子类对象,表示媒体消息内容。例如图片消息内容(RCImageMessage)、GIF 消息内容(RCGIFMessage),或继承自 RCMediaMessageContent 的自定义媒体消息内容。
以构造图片消息为例,您可以选择使用 messageWithImageURI:
方法,通过传入有效的本地图片路径来构造图片消息内容(RCImageMessage),图片消息内容支持设置为发送原图。
RCMessaage
的disableUpdateLastMessage
属性,可以控制是否将该消息更新到会话最新一条消息,默认 NO: 会更新到会话最后一条消息中,YES: 不更新到会话的最后一条消息中。
RCImageMessage *mediaMessageContent = [RCImageMessage messageWithImageURI:@"path/to/image"];
mediaMessageContent.full YES; // 图片消息支持设置以原图发送
RCMessage *message = [[RCMessage alloc] initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:mediaMessageContent];
在发送前,图片会被压缩质量,以及生成缩略图,在聊天界面中展示。GIF 无缩略图,也不会被压缩。
- 图片消息的缩略图:IMLib SDK 会以原图 30% 质量生成符合标准大小要求的大图后再上传和发送。压缩后最长边不超过 240 px。缩略图用于在聊天界面中展示。
- 图片:发送消息时如未选择发送原图,IMLib SDK 会以原图 85% 质量生成符合标准大小要求的大图后再上传和发送。压缩后最长边不超过 1080 px。
- 一般情况下不建议修改 IMLib SDK 图片的默认压缩配置,IMLib SDK 5.16.1 版本之后,SDK 新增了 RCLocalConfiguration 类,通过
[RCLocalConfiguration sharedInstance]
方法调用相关属性可以配置图片的压缩质量;5.16.1 之前的版本,如需调整 IMLib SDK 图片的压缩质量,详见知识库文档如何修改 SDK 默认的图片与视频压缩配置。
发送媒体消息
发送媒体消息需要使用 sendMediaMessage
方法。IMLib SDK 会为图片、小视频等媒体生成缩略图,根据默认压缩配置进行压缩,再将图片、小视频等媒体文件上传到融云默认的文件服务器(文件存储时长),上传成功之后再发送消息。图片消息如已设置为发送原图,则不会进行压缩。
接口原型
- (void)sendMediaMessage:(RCMessage *)message
pushContent:(nullable NSString *)pushContent
pushData:(nullable NSString *)pushData
attached:(nullable void(^)(RCMessage * _Nullable message))attachedBlock
uploadPrepare:(nullable void (^)(RCUploadMediaStatusListener *uploadListener))uploadPrepareBlock
progress:(nullable void (^)(int progress, long messageId))progressBlock
success:(nullable void (^)(long messageId))successBlock
error:(nullable void (^)(RCErrorCode errorCode, long messageId))errorBlock
cancel:(nullable void (^)(long messageId))cancelBlock;
sendMediaMessage 方法中直接提 供了用于控制推送通知内容(pushContent
)和推送附加信息(pushData
)的参数。除了使用这种方式外,还可以使用消息推送属性配置 RCMessagePushConfig,其中包含了 pushContent
和 pushData
,并提供更多推送通知配置能力,例如推送标题、推送内容、推送图标、或其他第三方厂商个性化配置。详见远程推送通知。
关于是否需要配置 sendMediaMessage
接口中的 pushContent
参数或 RCMessage
的 messagePushConfig
属性中 pushContent
,请参考以下内容:
- 如果消息类型为即时通讯服务预定义消息类型中的用户内容类消息格式,例如 RCImageMessage,
pushContent
可设置为nil
。一旦消息触发离线推送通知时,远程推送通知默认使用服务端预置的推送通知内容。关于各类型消息的默认推送通知内容,详见用户内容类消息格式。 - 如果消息类型为自定义消息类型,请参考自定义消息如何支持远程推送。
- 请注意,聊天室会话不支持离线消息机制,因此也不支持离线消息转推送。
参数说明
参数 | 类型 | 说明 |
---|---|---|
message | RCMessage | 要发送的消息体。必填属性包括会话类型(conversationType ),会话 ID(targetId ),消息内容(content )。详见[消息介绍] 中对 RCMessage 的结构说明。 |
pushContent | NSString | 修改或指定远程消息推送通知栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。 |
pushData | NSString | Push 附加信息。可设置为 nil 。您也可以在 RCMessage 的推送属性(RCMessagePushConfig )中配置,会覆盖此处配置,详见配置消息的推送属性。 |
attachedBlock | Block | 消息已成功存入消息数据库的回调。 |
progressBlock | Block | 媒体上传进度的回调。 |
successBlock | Block | 消息发送成功回调。 |
errorBlock | Block | 消息发送失败回调。 |
cancel | Block | 取消发送的回调。 |
示例代码
[[RCCoreClient sharedCoreClient] sendMediaMessage:message
pushContent:nil
pushData:nil
attached:^(RCMessage *successMessage) {
//入库成功
}
progress:^(int progress, RCMessage *progressMessage) {
//媒体上传进度
}
successBlock:^(RCMessage *successMessage) {
//成功
}
errorBlock:^(RCErrorCode nErrorCode, RCMessage *errorMessage) {
//失败
}
cancel:^(RCMessage *cancelMessage) {
//取消
}];