收发消息
本文介绍了如何从客户端发送超级群消息。超级群收发消息需要使用 RCCoreClient
下的方法。
前置条件
建议先阅读超级群概述和超级群私有频道概述,了解在 App 业务中如何使用频道和超级群频道功能特性。
- 通过服务端 API 创建超级群
- 通过服务端 API 创建频道,或使用默认频道 ID
RCDefault
- 通过服务端 API 将发件人加入超级群
- 如不确定发件人是否在超级群中,请通过服务端 API 查询用户是否为群成员
- 如向超级群私有频道中发送消息,请确认已通过服务端 API 添加私有频道成员
当前频道聊天页面发送与接收消息,需要同时检查超级群 ID 和频道 ID。如果超级群 ID 和频道 ID 和当前频道聊天页面对应,才能在当前频道页面进行展示处理,否则就不处理。如果消息出现在其他聊天页面,一般是因为超级群 ID 或者频道 ID 发生错误。
构造消息对象
在发送消息前,需要构造 RCMessage 对象。消息的 conversationType
字段必须填写超级群业务的会话类型 ConversationType_ULTRAGROUP
。消息的 targetId
字段表示超级群 ID,channelId
表示超级群频道 ID。
RCMessage
对象中可包含普通消息内容或媒体消息内容。普通消息内容指 RCMessageContent
的子类,例如文本消息(RCTextMessage)。
RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"测试超级群消息"];
RCMessage *message = [[RCMessage alloc] initWithType:ConversationType_ULTRAGROUP targetId:@"超级群 id" channelId:@"频道 id" direction:MessageDirection_SEND content:messageContent];
媒体消息内容指 RCMediaMessageContent
的子类,例如图片消息(RCImageMessage)、GIF 消息(RCGIFMessage)等。
RCImageMessage *mediaMessageContent = [RCImageMessage messageWithImageURI:@"path/to/image"];
mediaMessageContent.full YES; // 图片消息支持设置以原图发送
RCMessage *message = [[RCMessage alloc] initWithType:ConversationType_ULTRAGROUP targetId:@"超级群 id" channelId:@"频道 id" direction:MessageDirection_SEND content:mediaMessageContent];
- 如果您的应用/环境在 2022.10.13 日及以后开通超级群服务,超级群业务中会包含一个 ID 为
RCDefault
的默认频道。如果发消息时不指定频道 ID,则该消息会发送到RCDefault
频道中。 - 如果您的应用/环境在 2022.10.13 日前已开通超级群服务,在发送消息时如果不指定频道 ID,则该消息不属于任何频道。融云支持客户调整服务至最新行为。该行为调整将影响客户端、服务端收发消息、获取会话、清除历史消息、禁言等多个功能。如有需要,请提交工单咨询详细方案。
发送普通消息
从 5.3.0 版本 RCCoreClient
开始,建议使用下方异步返回结果的接口,原同步接口同时废弃。
发送超级群普通消息需要使用 RCCoreClient
中的提供的 sendMessage
方法。
[[RCCoreClient sharedCoreClient]
sendMessage:message
pushContent:nil
pushData:nil
attached:^(RCMessage * _Nullable message) {
// 消息发出前已存入数据库的消息实体
}
success:^(RCMessage * _Nonnull successMessage) {
//成功
}
error:^(RCErrorCode nErrorCode, RCMessage * _Nonnull 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 | String | 远程推送附加信息。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性。 |
attachedBlock | Block | 入库回调 |
successBlock | Block | 消息发送成功回调 |
errorBlock | Block | 消息发送失败回调 |
发送媒体消息
从 5.3.0 版本 RCCoreClient
开始,建议使用下方异步返回结果的接口,原同步接口同时废弃。
媒体消息 RCMessage
对象的 content
字段必须传入 RCMediaMessageContent 的子类对象,表示媒体消息内容。例如图片消息内容(RCImageMessage)、GIF 消息内容(RCGIFMessage),或继承自 RCMediaMessageContent 的自定义媒体消息内容。
图片消息内容(RCImageMessage)支持设置为发送原图。
RCImageMessage *mediaMessageContent = [RCImageMessage messageWithImageURI:@"path/to/image"];
mediaMessageContent.full YES; // 图片消息支持设置以原图发送
RCMessage *message = [[RCMessage alloc] initWithType:ConversationType_ULTRAGROUP
targetId:@"targetId"
channelId:@"channelId"
direction:MessageDirection_SEND
content:mediaMessageContent];
向超级群中发送媒体消息需要使用 sendMediaMessage
方法。SDK 会为图片、小视频等生成缩略图,根据默认压缩配置进行压缩,再将图片、小视频等媒体文件上传到融云默认的文件服务器(文件存储时长),上传成功之后再发送消息。图片消息如已设置为发送原图,则不会进行压缩。
[[RCCoreClient sharedCoreClient] sendMediaMessage:message
pushContent:nil
pushData:nil
attached:^(RCMessage * _Nullable message) {
// 消息发出前已存入数据库的消息实体
}
progress:^(int progress, RCMessage *progressMessage) {
//媒体上传进度
}
success:^(RCMessage *successMessage) {
//成功
}
error:^(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 | String | 远程推送附加信息。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性。 |
attachedBlock | Block | 入库回调 |
progressBlock | Block | 发送进度的回调 |
successBlock | Block | 消息发送成功回调 |
errorBlock | Block | 消息发送失败回调 |
cancel | Block | 取消发送的回调 |
接收消息
消息接收监听的设置在 RCCoreClient
中
设置监听
- (void)addReceiveMessageDelegate:(id<RCIMClientReceiveMessageDelegate>)delegate
实现监听代理方法
- (void)onReceived:(RCMessage *)message left:(int)nLeft object:(id)object
如何发送 @ 消息
@消息在融云即时通讯服务中不属于一种预定义的消息类型(详见服务端文档 消息类型概述)。融云通过在消息中携带 mentionedInfo
数据,帮助 App 实现提及他人(@)功能。
消息的 RCMessageContent
中的 RCMentionedInfo 字段存储了携带所 @ 人员的信息。无论是 SDK 内置消息类型,或者您自定义的消息类型,都直接或间接继承了 RCMessageContent 类。
融云支持在向群组和超级群中发消息时,在消息内容中添加 mentionedInfo
。消息发送前,您可以构造 MentionedInfo
,并设置到消息的 RCMessageContent
中。
RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"Test"];
messageContent.mentionedInfo = [[RCMentionedInfo alloc] initWithMentionedType:RC_Mentioned_Users userIdList:mentionedUserIdList mentionedContent:nil];