发送消息
本文介绍了如何从客户端发送消息,适用于单聊、群聊、聊天室。
请注意,客户端 SDK 发送消息存在频率限制,每秒最多只能发送 5 条消息。
发送消息
sendMessage 是发送消息的基础接口,可用来发送 IMLib 中的内置类型消息或自定义消息。针对不同的特定消息类型,IMLib 还提供了多个便于调用的语法糖方法。
以调用 sendMessage 往群聊中发送 @张三的文本消息为例。
-
定义目标群聊会话,并实例化待发送消息。因为发送的是群聊 @ 消息,所以需要添加
mentionedInfo
。// 定义消息投送目标会话, 这里定义一个群组类型会话
const conversation = { conversationType: RongIMLib.ConversationType.GROUP, targetId: '<目标 Id>' }
// 实例化待发送消息,RongIMLib.TextMessage 为内置文本型消息
const message = new RongIMLib.TextMessage({
// 文本内容
content: '文本内容',
// (可选)消息中附加信息,透传到对端
extra: '消息中附加信息',
// 群组消息中,如果需要发送 @ 消息,可添加 mentionedInfo 字段
mentionedInfo: {
// @ 类型:全部、个人
type: RongIMLib.MentionedType.SINGAL,
// @ 用户列表
userIdList: [zhangsan],
// @ 内容
mentionedContent: ''
}
}) -
构造发送选项 ISendMessageOptions,用于定义发送行为中的一些可选配置。因为发送的是群聊 @ 消息,必须将
options
中的isMentioned
设置为true
。// 配置属性
const options = {
// 如果需要发送 @ 消息,isMentioned 需设置为 true
isMentioned: true,
// 消息发送前的回调,可以使用此回调返回的 message 用于列表渲染
onSendBefore: (message) => {
console.log('消息发送前的回调', message)
}
} -
发送消息。如果消息发送成功,可以根据返回结果中的
messageId
字段将列表中的该消息状态改为发送成功。// 发送消息
RongIMLib.sendMessage(conversation, message, options).then(res => {
if (res.code === RongIMLib.ErrorCode.SUCCESS) {
// 消息发送成功,可以根据返回结果中的 messageId 字段将列表中的该消息状态改为发送成功。
console.log('消息发送成功', res.data)
} else {
console.log('消息发送失败', res.code, res.msg)
}
}) -
如果消息发送失败,可以根据返回结果中的
messageId
字段将列表中的该消息状态改为发送失败,并重发消息。客户端遇到消息发送失败时,可能有以下情况:
- 消息未送达融云服务器,或送达融云服务端后返回发送失败的情况(其他人也没有收到)。
- 某些极端情况下(例如弱网环境),消息可能已成功送达收件方。但发送端未能及时收到融云服务端回执,超时后认为发送失败。此时客户端重发消息后会导致对方重复收到消息。关于该问题的详细解释可参考 FAQ。
-
重新发送消息。重发消息需与原始消息保持一致。
提示
SDK 从 5.5.1 版本开始,支持重发消息时在 options
中传入原消息的 messageId
。融云服务端不会去除重复消息,应用层可通过该 ID 自行判断消息是否属于重复消息,并进行相应处理。该 ID 可以从 onSendBefore
回调返回的 message
对象或返回结果中获取。
// 定义消息投送目标会话, 这里定义一个群组类型会话
const conversation = { conversationType: RongIMLib.ConversationType.GROUP, targetId: '<目标 Id>' }
// 实例化待发送消息,RongIMLib.TextMessage 为内置文本型消息
const message = new RongIMLib.TextMessage({ content: '文本内容' })
// 配置属性
const options = {
// 重发消息的 messageId, 可以从 onSendBefore 回调返回的 message 对象中 或 返回结果中获取
messageId: 0
}
RongIMLib.sendMessage(conversation, message, options).then(res => {
if (res.code === RongIMLib.ErrorCode.SUCCESS) {
// 消息发送成功,可以根据返回结果中的 messageId 字段将列表中的该消息状态改为发送成功。
console.log('消息发送成功', res.data)
} else {
// 消息发送失败,可以根据返回结果中的 messageId 字段将列表中的该消息状态改为发送失败。
console.log('消息发送失败', res.code, res.msg)
}
})