IM 即时通讯(增强版)
Web
动态与公告
IM UIKit 更新日志
NIM SDK 更新日志
新手接入指南
产品介绍
简介
产品优势
主要功能
功能介绍
账号集成与登录
基础消息功能
群组功能
聊天室功能
圈组功能
多端登录与互踢策略
海外数据中心
IM 平滑迁移方案
接口及业务限制
体验 Demo
下载 SDK 与 Demo 源码
快速开始
跑通 IM Demo 源码
实现单聊消息收发(不含 UI)
实现聊天室登录(不含 UI)
实现圈组消息收发(不含 UI)
含 UI 集成
什么是 IM UIKit
IM UIKit 功能列表
快速集成 IM UIKit
非React框架快速集成
非React框架集成 IM UIKit
非 React 框架自定义示渲染
组件导入
初始化
全局上下文
登录相关
会话列表相关
集成会话列表界面
自定义会话列表界面 UI
会话消息相关
集成会话界面
实现自定义消息收发
自定义会话界面 UI
用户资料相关
集成用户资料组件
通讯录相关
集成通讯录界面
自定义通讯录界面 UI
搜素组件相关
集成搜索组件
自定义搜索组件 UI
主题样式设置
语言设置
初始化(兼容 NIM SDK)
常见问题
如何解决样式冲突
不含 UI 集成
集成 SDK
IM 登录与初始化相关
初始化并登录 IM
注销登录与销毁实例
多端登录与互踢
消息收发
历史消息
消息扩展
最近会话
服务端会话服务
用户资料托管
好友关系托管
在线状态订阅
系统通知
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
超大群概述
超大群管理
超大群成员管理
超大群消息管理
反垃圾
聊天室功能
聊天室概述
聊天室初始化与登录相关
初始化并登录聊天室
注销登录与销毁实例
聊天室标签功能
聊天室消息管理
聊天室成员管理
聊天室信息管理
聊天室队列服务
圈组功能
圈组概述
初始化与登录
通用接口校验说明
服务器相关
服务器概述
服务器管理
服务器成员管理
游客功能
服务器未读数管理
频道相关
频道概述
频道管理
频道黑白名单
频道分组
频道分组黑白名单
频道未读数管理
实时互动频道
搜索服务器与频道
身份组相关
身份组概述
身份组应用场景
服务器身份组
频道身份组
频道用户定制权限
频道分组身份组
自定义权限项
成员权限查询与判定
身份组相关查询
圈组订阅机制
圈组消息相关
圈组消息收发
圈组消息撤回
圈组消息更新
圈组消息删除
消息正在输入
获取频道最后一条消息
会话消息回复(Thread)
圈组快捷评论
圈组消息搜索
查询历史消息
查询@我的消息
圈组系统通知相关
圈组系统通知概述
圈组系统通知收发
圈组系统通知更新
圈组内容审核
圈组第三方回调
圈组相关抄送
圈组各端接口命名差异
融合存储方案
最佳实践
聊天室重要消息投递
API 参考
NIM SDK API 参考
状态码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
服务协议

消息收发

更新时间: 2023/03/28 16:56:09

参见 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()
此文档是否对你有帮助?
有帮助
我要吐槽
  • 消息说明
  • 消息对象
  • 群通知消息
  • 发送消息
  • 接收消息
  • 重发消息
  • 转发消息
  • 撤回消息
  • 发送已读回执