IM 即时通讯
Web
动态与公告
IM UIKit 更新日志
NIM SDK 开发版更新日志
NIM SDK 稳定版更新日志
新手接入指南
产品介绍
简介
主要功能
产品优势
海外数据中心
IM平滑迁移方案
接口及业务限制
功能介绍
账号集成与登录
多端登录与互踢策略
基础消息功能
群组功能
聊天室功能
聊天室标签功能
质量数据监控台
体验 Demo
下载 SDK 与 Demo 源码
快速开始
跑通 IM Demo 源码
实现 IM 文本消息收发(不含 UI)
含 UI 集成
什么是 IM UIKit
IM UIKit 功能概览
快速集成 IM UIKit
非React框架快速集成
非React框架集成 IM UIKit
非 React 框架自定义渲染
组件导入
初始化
全局上下文
登录相关
会话列表相关
集成会话列表界面
自定义会话列表界面 UI
会话消息相关
集成会话消息界面
实现音视频通话
实现自定义消息收发
自定义会话界面 UI
用户资料相关
集成用户资料组件
通讯录相关
集成通讯录界面
自定义通讯录界面 UI
搜索组件相关
集成搜索组件
自定义搜索组件 UI
主题样式设置
语言设置
初始化(兼容 NIM SDK)
UIKit 功能实现方案
消息回复实现方案
UIKit 常见问题
如何解决样式冲突
不含 UI 集成
集成 SDK
浏览器环境集成
Node.js集成
初始化与登录相关
初始化与登录 IM
IM 连接相关
多端登录与互踢
消息相关
消息概述
消息收发
消息配置选项
广播消息收发
消息已读回执
消息撤回
消息重发与转发
本地消息
通知消息
群通知消息
超大群通知消息
历史消息
最近会话
用户资料托管
好友关系托管
用户关系托管
在线状态订阅
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
系统通知
系统通知概述
内置系统通知管理
内置系统通知未读数
自定义系统通知收发
开通聊天室功能
聊天室
反垃圾(内容审核)
域名高可用
融合存储方案
扩展功能
工具方法
接入第三方机器人
最佳实践
聊天室重要消息投递
API参考
SDK API (Web)
IM UIKit Store API
状态码/错误码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
开通聊天室功能
配置应用客户端标识
常见问题
FAQ
服务协议

消息收发

更新时间: 2022/12/21 15:55:40

参见 interface MsgServiceInterface

它的 API 都挂载在 msg 模块里,使用 nim.msg 访问

消息说明

  • 点对点或群组消息: 点对点或群组消息的收发,可分为消息、离线消息、漫游消息三类。
    • 离线消息、漫游消息只能收不能发送,在事件 syncOfflinemsgssyncRoamingmsgs 中获取
    • 消息可收可发,收消息在 msg 的事件中接收
  • 离线消息: 他人发给自己的消息,且自己的账号在任何客户端都未读过,则算离线消息;离线消息只要其它任何一端(包括自己)已读,则不会再收到对应消息。
  • 漫游消息: 他人发给自己的消息,在本客户端未读过,但在其他客户端如iOS/android/pc...读过,则算漫游消息;漫游消息只有本端已读,才不会再下推。

消息对象

参见 type IMMessage

重点有几个参数

类型 参数名 说明
string scene 消息场景,p2p、team、superTeam
string sessionId 所属会话 id
string status 来标明消息发送状态,见下文
string to 消息接收方, 帐号或群id
string from 消息发送方, 帐号
number time 消息发送成功的时间戳(单位毫秒)
string type 消息类型,见下文
string body 消息的文本部分的内容
object attach 附加消息
string idClient sdk 端测唯一标识,可做主键使用
string idServer 消息服务器测的标识

scene 来标明消息所属的场景, 具体场景如下:

  • 'p2p' (点对点消息)
  • 'team' (群消息)
  • 'superTeam' (超大群群消息)

type 来标明消息的类型, 与 IM 相关消息类型如下:

  • 'text' (文本消息)
  • 'image' (图片消息)
  • 'audio' (音频消息)
  • 'video' (视频消息)
  • 'file' (文件消息)
  • 'geo' (地理位置消息)
  • 'custom' (自定义消息)
  • 'tip' (提醒消息) 提醒消息用于会话内的状态提醒,如进入会话时出现的欢迎消息,或者会话命中敏感词后的提示消息等等.
  • 'notification' (群通知消息) 某些群操作后所有群成员会收到一条相应的群通知消息

status 来标明消息发送状态, 具体场景如下:

  • 'delete' (已删)
  • 'read' (收到消息,已读)
  • 'receipt' (对方已读发送的内容)
  • 'refused' (被对方拒绝)
  • 'sendFailed' (发送失败)
  • 'sending' (发送中)
  • 'sent' (已发送)
  • 'unread' (收到消息,未读)

attach 来标明消息附加内容,type 为 custom,image,video,audio,file,geo 等类型存在。

  • 发送图片,音视频,文件消息后的附带的内容。参见 UploadFileResult
  • 群通知的具体内容。参见下文群通知消息

群通知消息

群通知消息是消息类型 type === 'notification' 的一种,每当接到群通知消息,SDK 经过处理将会上报开发者以事件,而与群通知消息有关的事件如下:

  • 更新群 updateTeam
  • 解散群 dismissTeam
  • 群成员加入 addTeamMembers
  • 更新群管理员 updateTeamManagers
  • 移除群成员 removeTeamMembers
  • 转让群 transferTeam
  • 禁言某成员 updateTeamMembersMute
const eventList = [
  'updateTeam',
  'dismissTeam',
  'addTeamMembers',
  'updateTeamManagers',
  'removeTeamMembers',
  'transferTeam',
  'updateTeamMembersMute',
]

eventList.forEach((key: any) => {
  nim.on(key, (res) => {
    console.log(`收到 ${key} 事件:`, res ? JSON.parse(JSON.stringify(res)) : res);
  });
})

发送消息

API 出入参请参见:

示例:

// text message
await nim.msg.sendTextMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  "body": "this is a text",
  "onSendBefore": function(msg) {
    console.log('Get msg before send', msg)
  }
})

// tip message
await nim.msg.sendTipMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  "body": "this is a text"
})

// custom message
await nim.msg.sendCustomMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  // JSON format string
  "attach": "{\"a\":1}"
})

// GEO location message
await nim.msg.sendGeoLocationMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  // JSON object
  "attach": {
    "lng": 120.18201069999999,
    "lat": 30.2006603,
    "title": "Hangzhou"
  }
})

// Image message like '.jpg', '.png'
await nim.msg.sendImageMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  // Example dom for get file: <input type="file" id="fileInput" />
  "file": document.getElementById('fileInput').files[0],
  "onUploadStart": function(task) { console.log('Upload start!', task) },
  "onUploadProgress": function(progress) { console.log('Uploading!', progress) },
  "onUploadDone": function(file) { console.log('Upload done!', file) },
  "onSendBefore": function(msg) { console.log('Get msg before send', msg) }
})

// Audio message like '.mp3'
await nim.msg.sendAudioMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  // Example dom for get file: <input type="file" id="fileInput" />
  // 浏览器环境使用file或fileInput,uniapp,RN,小程序等环境使用filePath
  "file": document.getElementById('fileInput').files[0],
  "onUploadStart": function(task) { console.log('Upload start!', task) },
  "onUploadProgress": function(progress) { console.log('Uploading!', progress) },
  "onUploadDone": function(file) { console.log('Upload done!', file) },
  "onSendBefore": function(msg) { console.log('Get msg before send', msg) }
})

// Video message like '.mp4'
await nim.msg.sendVideoMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  // Example dom for get file: <input type="file" id="fileInput" />
  "file": document.getElementById('fileInput').files[0],
  "onUploadStart": function(task) { console.log('Upload start!', task) },
  "onUploadProgress": function(progress) { console.log('Uploading!', progress) },
  "onUploadDone": function(file) { console.log('Upload done!', file) },
  "onSendBefore": function(msg) { console.log('Get msg before send', msg) }
})

// File message
await nim.msg.sendFileMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  // Example dom for get file: <input type="file" id="fileInput" />
  "file": document.getElementById('fileInput').files[0],
  "onUploadStart": function(task) { console.log('Upload start!', task) },
  "onUploadProgress": function(progress) { console.log('Uploading!', progress) },
  "onUploadDone": function(file) { console.log('Upload done!', file) },
  "onSendBefore": function(msg) { console.log('Get msg before send', msg) }
})

接收消息

参见事件 TS 定义 NIMInterface-IMEventInterface-msg

示例:

const nim = new NIMSDK(options)
nim.on('msg', function(msg) { console.log('Receive msg: ', msg) })

await nim.connect()

重发消息

resendMsg 撤回消息

一般在 msg.statussendFailed 时的失败,大概率是因为网络原因的发送失败,这时可以尝试重发。示例

let targetMsg = null

// Chrome devtool,network throttling Download Limit 0kb,and you will not receive the packet. 
// Finally, send message failed due to timeout
try {
  await nim.msg.sendTextMsg({
    "scene": "p2p",
    "to": "{{Receiver_ACCOUNT_ID}}",
    "body": "this is a text",
    "onSendBefore": function(msg) {
      console.log('Get msg before send', msg)
      targetMsg = msg
    }
  })
} catch (err) {
  console.error('sendFailed', err)
}

// setTimeout 5s
setTimeout(function () {
  if (targetMsg && targetMsg.status === 'sendFailed') {
    const msg = await nim.msg.resendMsg({
      "ps": "recall msg",
      "msg": targetMsg,
    })
    console.log('resend success', msg)
  }
}, 5000)

转发消息

forwardMsg 转发消息

示例

let msg = await nim.msg.sendTextMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  "body": "this is a text",
})

msg = await nim.msg.forwardMsg({
  "scene": "p2p",
  "to": "{{Other_Receiver_ACCOUNT_ID}}",
  "msg": msg,
})

撤回消息

recallMsg 撤回消息

示例

let msg = await nim.msg.sendTextMsg({
  "scene": "p2p",
  "to": "{{Receiver_ACCOUNT_ID}}",
  "body": "this is a text2",
})

msg = await nim.msg.recallMsg({
  "ps": "recall msg",
  "msg": msg,
})

发送已读回执

sendMsgReceipt, p2p消息发送已读回执

sendTeamMsgReceipt, 群消息发送已读回执

发送后能在消息对象的 status 属性找到是否被发送过已读回执

示例在收到一条消息后,立刻标记已读:

const nim = new NIMSDK(options)

nim.on('msg', async function(msg) {
  console.log('Receive msg: ', msg)
  await nim.msg.sendMsgReceipt({
    msg: msg
  })
})

await nim.connect()

注意:目前在标记为已读后,下次重新再登录,在 msg 的事件中得到的消息,status 仍旧是默认的 unread/send。这个将在之后的版本解决。

此文档是否对你有帮助?
有帮助
我要吐槽
  • 消息说明
  • 消息对象
  • 群通知消息
  • 发送消息
  • 接收消息
  • 重发消息
  • 转发消息
  • 撤回消息
  • 发送已读回执