跳转至

发送消息

消息结构

消息数据结构:

字段名 类型 说明
type Number 会话类型
targetId String 目标 id
senderUserId String 发送者 id
content Object 消息内容
messageType String 消息标识
messageUId String 服务端存储的消息 id
messageDirection Number 消息方向. 发送: 1, 接收: 2
isOffLineMessage Boolean 是否为离线消息
sentTime Number 消息在融云服务端的发送时间
receivedTime Number 消息接收时间. isOffLineMessage 为 true 时, receivedTime 无效
isPersited Boolean 消息是否存储在服务端
isCounted Boolean 消息是否计数

发送参数

参数 类型 必填 默认值 说明 最低版本
messageType String 消息类型. 与移动端 objectName 一致 3.0.0
content String 消息内容 3.0.0
isPersited Boolean true 是否存储在服务端 3.0.0
isCounted Boolean true 是否计数. 计数消息接收端接收后未读数加 1 3.0.0
isMentiond Boolean false 是否为 @ 消息 3.0.0
mentiondType Number 1 @ 类型. 1: @ 所有人 2: @ 指定用户 3.0.0
mentiondUserIdList Array @ 用户 id 列表 3.0.0
pushContent String Push 显示内容 3.0.0
pushData String Push 通知时附加信息 3.0.0
isVoipPush String false 为 ture 时, 对端不在线的 iOS 会收到 Voip Push. Android 无影响 3.0.0
directionalUserIdList Array 接收定向消息的用户 id 列表. 仅群组有效 3.0.0
isStatusMessage Boolean false 是否发送状态消息 3.0.0

消息接收

消息接收详见 im.watch

文本消息

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.send({
  messageType: RongIMLib.MESSAGE_TYPE.TEXT, // 'RC:TxtMsg'
  content: {
    content: 'Hello RongCloud' // 文本内容
  }
}).then(function(message){
  console.log('发送文字消息成功', message);
});

图片消息

注意事项

  1. 略缩图(content 字段)必须是 base64 字符串, 类型必须为 jpg
  2. base64 略缩图必须不带前缀
  3. base64 字符串大小不可超过 100 k
  4. 可通过 FileReader 或者 canvas 对图片进行压缩, 生成压缩后的 base64 字符串

图片上传请参考:上传

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.send({
  messageType: RongIMLib.MESSAGE_TYPE.IMAGE, // 'RC:ImgMsg'
  content: {
    content: '/9j/4AAQSBAAD/2wBDDBAYEBAQEB....', // // 压缩后的 base64 略缩图, 用来快速展示图片
    imageUri: 'https://www.rongcloud.cn/images/newVersion/log_wx.png' // 上传到服务器的 url. 用来展示高清图片
  }
}).then(function(message){
  console.log('发送图片消息成功', message);
});

文件消息

文件上传请参考:上传插件

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
var name = 'RongIMLib.js';  // 文件名
var size = 1024;  // 文件大小
var type = 'js';  // 文件类型
var fileUrl = 'https://cdn.ronghub.com/RongIMLib.js';  // 文件地址
conversation.send({
  messageType: RongIMLib.MESSAGE_TYPE.FILE, // 'RC:FileMsg'
  content: {
    name: name,
    size: size,
    type: type,
    fileUrl: fileUrl
  }
}).then(function(message){
  console.log('发送文件消息成功', message);
});

语音消息

注: SDK 目前不提供录音功能, 开发者需生成语音 url 后, 传入发送消息接口, 发送语音消息

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.send({
  messageType: RongIMLib.MESSAGE_TYPE.HQ_VOICE, // 'RC:HQVCMsg'
  content: {
    remoteUrl: 'https://rongcloud-audio.cn.ronghub.com/audio_amr__RC-2020-03-17_42_1584413950049.aac?e=1599965952&token=CddrKW5AbOMQaDRwc3ReDNvo3-sL_SO1fSUBKV3H:CDngyWj7ZApNmAfoecng7L_3SaU=', // 音频 url, 建议格式: aac
    duration: 6, // 音频时长
    type: 'aac'
  }
}).then(function(message){
  console.log('发送语音消息成功', message);
});

位置消息

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
var latitude = 40.0317727;
var longitude = 116.4175057;
var poi = '北苑路北辰·泰岳';
var content = '/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABsSFBcUERsXFhceHBsgKE';  // 位置图片 base64
conversation.send({
  messageType: RongIMLib.MESSAGE_TYPE.LOCATION, // 'RC:LBSMsg'
  content: {
    latitude: latitude,
    longitude: longitude,
    poi: poi,
    content: content
  }
}).then(function(message){
  console.log('发送位置消息成功', message);
});

图文消息

图文消息也称为富文本消息

图片上传请参考:上传

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
var title = '融云';  // 图文标题
var content = '为用户提供 IM 即时通讯和音视频通讯云服务';  // 图文内容
var imageUri = '';  // 上传到自己服务器的 url
var url = 'https://www.rongcloud.cn';  // 富文本消息点击后打开的 URL
conversation.send({
  messageType: RongIMLib.MESSAGE_TYPE.RICH_CONTENT, // 'RC:ImgTextMsg'
  content: {
    title: title,
    content: content,
    imageUri: imageUri,
    url: url
  }
}).then(function(message){
  console.log('发送图文消息成功', message);
});

其他消息

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.send({
  messageType: 's:person', // 填写开发者定义的 messageType
  content: { // 填写开发者定义的消息内容
    name: 'RongCloud',
    age: 12
  }
}).then(function(message){
  console.log('发送 s:person 消息成功', message);
});

正在输入消息

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.send({
  messageType: 'RC:TypSts',
  content: {
    typingContentType: 'RC:TxtMsg' // 正在输入的消息类型
  },
  isStatusMessage: true // 正在输入建议发送状态消息, 不存储、不计数, 且仅在线用户可收到
}).then(function(message){
  console.log('发送正在输入消息成功', message);
});

已读通知消息

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
var messageUId = '1301-NBJQ-MK31-3417';  // 消息唯一 Id, message 中的 messageUid
var lastMessageSendTime = 1550719033312;  // 最后一条消息的发送时间
var type = '1';  // 备用,默认赋值 1 即可
// 以上 3 个属性在会话的最后一条消息中可以获得
conversation.send({
  messageType: 'RC:ReadNtf',
  content: {
    messageUId: messageUId,
    lastMessageSendTime: lastMessageSendTime,
    type: type
  }
}).then(function(message){
  console.log('发送已读通知消息成功', message);
});

阅读状态同步

单聊会话中消息阅读状态处理详情请参考: 消息状态判定及处理方式

携带用户信息

Web 端如何展示用户信息 ?

一般展示用户信息的方法有两种:

通过开发者 App Server 获取用户信息

1、开发者 App Server 封装获取用户信息接口

2、通过 message.senderUserId 获取发送者 id

3、将发送者 id 传入 App Server 暴露的接口中, 获取对应用户信息

4、将用户信息展示到页面中

发消息时携带用户信息

1、获取当前用户(也就是发送者)的用户信息

2、发消息时携带当前用户信息

3、展示消息时, 通过消息体内的用户信息进行展示

以文本消息为例:

var conversation = im.Conversation.get({
  targetId: 'user1',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.send({
  messageType: RongIMLib.MESSAGE_TYPE.TEXT, // 'RC:TxtMsg'
  content: {
    content: 'Hello RongCloud', // 文本内容
    user: {
      id: 'user2',
      name: '用户二',
      portraitUri: 'https://www.rongcloud.cn/images/newVersion/log_wx.png'
    },
    extra: '' // 附加信息
  }
}).then(function(message){
  console.log('发送文字消息成功', message);
});