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

消息收发(已废弃)

更新时间: 2022/12/30 16:59:08

本文已废弃,请前往消息概述消息相关文档查看相关说明。

消息说明

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

初始化参数

示例代码

var nim = NIM.getInstance({
    onroamingmsgs: onRoamingMsgs,
    onofflinemsgs: onOfflineMsgs,
    onmsg: onMsg
});
function onRoamingMsgs(obj) {
    console.log('收到漫游消息', obj);
    pushMsg(obj.msgs);
}
function onOfflineMsgs(obj) {
    console.log('收到离线消息', obj);
    pushMsg(obj.msgs);
}
function onMsg(msg) {
    console.log('收到消息', msg.scene, msg.type, msg);
    pushMsg(msg);
    switch (msg.type) {
    case 'custom':
        onCustomMsg(msg);
        break;
    case 'notification':
        // 处理群通知消息
        onTeamNotificationMsg(msg);
        break;
    // 其它case
    default:
        break;
    }
}
function pushMsg(msgs) {
    if (!Array.isArray(msgs)) { msgs = [msgs]; }
    var sessionId = msg[0].scene + '-' + msgs[0].account;
    data.msgs = data.msgs || {};
    data.msgs[sessionId] = nim.mergeMsgs(data.msgs[sessionId], msgs);
}
function onCustomMsg(msg) {
    // 处理自定义消息
}

参数解释

  • shouldIgnoreNotification, 该参数类型为函数(function),表示是否要忽略某条通知类消息。该方法会将接收到的通知类消息对象,按照用户上层定义的逻辑进行过滤, 如果该方法返回 true,那么 SDK 将忽略此条通知类消息
  • onroamingmsgs, 同步漫游消息对象的回调, 每个会话对象对应一个回调, 会传入消息数组
  • onofflinemsgs, 同步离线消息对象的回调, 每个会话对象对应一个回调, 会传入消息数组
  • 在支持数据库时并且启用了多 tab 同时登录, 那么如果多个 tab 页同时断线重连之后, 只会有一个 tab 页负责存储漫游消息和离线消息, 即只会有一个 tab 页会收到 onroamingmsgsonofflinemsgs 回调, 其它 tab 页在同步完成之后, 需要调用获取本地历史记录来从本地缓存中拉取消息记录
  • onmsg, 收到消息对象的回调
    • 当前登录帐号在其它端发送消息之后也会收到此回调, 注意此时消息对象的from字段就是当前登录的帐号
  • 可以调用nim.mergeMsgs来合并数据

消息对象

消息对象有以下字段

  • scene: 消息场景
  • from: 消息发送方, 帐号或群id
  • fromNick: 消息发送方的昵称
  • fromClientType: 发送方的设备类型
  • fromDeviceId: 发送端设备id
  • to: 消息接收方, 帐号或群id
  • time: 时间戳
  • type: 消息类型
  • sessionId: 消息所属的会话对象的ID
  • target: 聊天对象, 账号或者群id
  • flow: 消息的流向
    • 'in'表示此消息是收到的消息
    • 'out'表示此消息是发出的消息
  • status: 消息发送状态
    • 'sending' 发送中
    • 'success' 发送成功
    • 'fail' 发送失败
  • text: 文本消息的文本内容, 请参考发送文本消息
  • file: 文件消息的文件对象, 具体字段请参考图片对象音频对象视频对象文件对象, 请参考发送文件消息
  • geo: 地理位置消息的地理位置对象, 请参考发送地理位置消息
  • tip: 提醒消息的内容, 请参考发送提醒消息
  • content: 自定义消息的消息内容, 开发者可以自行扩展, 建议封装成JSON格式字符串, 请参考发送自定义消息
  • attach: 群通知消息的附加信息, 参考群通知消息来查看不同类型的群通知消息对应的附加信息
  • idClient: SDK生成的消息id, 在发送消息之后会返回给开发者, 开发者可以在发送消息的回调里面根据这个ID来判断相应消息的发送状态, 到底是发送成功了还是发送失败了, 然后根据此状态来更新页面的UI。如果发送失败, 那么可以重发消息
  • isMuted: 该消息在接收方是否应该被静音
  • isInBlackList: 发送此条消息时,发送方'from'是否在接收方'to'的黑名单列表中
  • resend: 是否是重发的消息
  • custom: 扩展字段
    • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
  • nosScene nos存储场景, 适用于发送文件消息, 默认初始化配置
  • nosSurvivalTime nos存储场景有效时间, 适用于发送文件消息,默认初始化配置
  • pushContent: 自定义推送文案
  • pushPayload: 自定义的推送属性
    • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
  • needPushNick: 是否需要推送昵称
  • apns: 特殊推送选项, 只在群会话中使用
  • apns.accounts: 需要特殊推送的账号列表, 此字段不存在的话表示推送给当前会话内的所有用户
  • apns.content: 需要特殊推送的文案
  • apns.forcePush: 是否强制推送, true 表示即使推送列表中的用户屏蔽了当前会话(如静音), 仍能够推送当前这条内容给相应用户
  • localCustom: 本地自定义扩展字段
    • 在支持数据库时可以调用更新本地消息来更新此字段, 此字段只会被更新到本地数据库, 不会被更新到服务器上
  • needMsgReceipt: 是否需要业务已读(包含该字段即表示需要),只有设置了业务已读,才可以调用getTeamMsgReads,getTeamMsgReadAccounts等相关方法
  • isHistoryable: 是否存储云端历史
  • isRoamingable: 是否支持漫游
  • isSyncable: 是否支持发送者多端同步
  • cc: 是否支持抄送
  • isPushable: 是否需要推送
  • isOfflinable: 是否要存离线
  • isUnreadable: 是否计入消息未读数
  • isLocal: 是否是本地消息, 请查阅发送本地消息
  • yidunAntiSpamRes: 易盾反垃圾返回的结果。当开启易盾反垃圾服务,并且匹配消息体命中到易盾的反垃圾规则,会返回此结果。

yidunAntiSpamRes字段说明

2021年9月28日前接入安全通的客户,需要升级到最新版安全通,才可使用此接口能力。升级安全通请联系商务经理

yidunAntiSpamRes为json字符串格式,请自行解析或者反转成json对象使用,yidunAntiSpamRes字段定义如下:

名称类型说明
code Integer状态码:200,正常;404,易盾反垃圾结果为空,无其它字段;414,易盾反垃圾结果过长,无ext字段
type String易盾反垃圾类型:text,文本;image,图片
version String易盾反垃圾的version字段,详细请参考易盾文档
taskId String易盾反垃圾的taskId字段,详细请参考易盾文档
suggestion Integer易盾反垃圾的suggestion字段,详细请参考易盾文档
status Integer易盾反垃圾的status字段,详细请参考易盾文档
ext String易盾反垃圾的result字段,详细请参考易盾文档

易盾反垃圾文档

易盾反垃圾文档:

文本类反垃圾参考:
https://support.dun.163.com/documents/588434200783982592?docId=589310433773625344

图片类反垃圾参考:
https://support.dun.163.com/documents/588434277524447232?docId=588512292354793472

备注:考虑到易盾反垃圾相关字段后续的扩展性(一般为新增属性),请注意做好解析兼容。具体请参见易盾的反垃圾增强版用户可扩展参数

消息场景

消息对象有一个字段scene来标明消息所属的场景, 具体场景如下

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

消息类型

消息对象有一个字段type来标明消息的类型, 具体类型如下

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

不同类型的消息收发可参考:

文本对象

发送文本消息或收到文本消息时, 消息对象text字段代表文本消息内容

图片对象

发送图片消息或收到图片消息时, 消息对象file字段代表图片对象, 包含以下属性:

  • name: 名字
  • size: 大小, 单位byte
  • md5: md5
  • url: url
  • ext: 扩展名
  • w: 宽, 单位px
  • h: 高, 单位px

音频对象

发送音频消息或收到音频消息时, 消息对象file字段代表音频对象, 包含以下属性:

  • name: 名字
  • size: 大小, 单位byte
  • md5: md5
  • url: url
  • ext: 扩展名
  • dur: 长度, 单位ms

视频对象

发送视频消息或收到视频消息时, 消息对象file字段代表视频对象, 包含以下属性:

  • name: 名字
  • size: 大小, 单位byte
  • md5: md5
  • url: url
  • ext: 扩展名
  • dur: 长度, 单位ms
  • w: 宽, 分辨率, 单位px
  • h: 高, 分辨率, 单位px

视频对象取封面(首帧图片):

  • 获取到的视频对象后加vframe即可,例如:原视频地址为http://img-sample.nos-eastchina1.126.net/sample.wmv,则封面(首帧)图片地址为http://img-sample.nos-eastchina1.126.net/sample.wmv?vframe

文件对象

发送文件消息或收到文件消息时, 消息对象file字段代表文件对象, 包含以下属性:

  • name: 名字
  • size: 大小, 单位byte
  • md5: md5
  • url: url
  • ext: 扩展名

地理位置对象

发送地理位置消息或收到地理位置消息时, 消息对象geo字段代表地理位置对象, 包含以下属性:

  • lng: 经度
  • lat: 纬度
  • title: 地址描述

群通知消息

  • 群通知消息是消息类型的一种
  • 某些群操作后所有群成员会收到一条相应的群通知消息
  • 群通知消息对应的消息对象有一个字段attach包含了额外的信息, attach有一个字段type来标识群通知消息的类型
    • 'updateTeam' (更新群)
      • 更新群后, 所有群成员会收到一条类型为'updateTeam'群通知消息。此类群通知消息的from字段的值为更新群的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为被更新的群信息
    • 'addTeamMembers' (拉人入群)
      • 拉人入群后, 所有群成员会收到一条类型为'addTeamMembers'群通知消息。此类群通知消息的from字段的值为拉人的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段accounts的值为被拉的人的帐号列表, attach有一个字段members的值为被拉的群成员列表。
    • 'removeTeamMembers' (踢人出群)
      • 踢人出群后, 所有群成员会收到一条类型为'removeTeamMembers'群通知消息。此类群通知消息的from字段的值为踢人的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段accounts的值为被踢的人的帐号列表。
    • 'acceptTeamInvite' (接受入群邀请)
      • 高级群的群主和管理员在邀请成员加入群(通过操作创建群拉人入群)之后, 被邀请的人会收到一条类型为'teamInvite'系统通知, 此类系统通知的from字段的值为邀请方的帐号, to字段的值为对应的群ID, 此类系统通知的attach有一个字段team的值为被邀请进入的, 被邀请的人可以选择接受邀请或者拒绝邀请。
        • 如果接受邀请, 那么该群的所有群成员会收到一条类型为'acceptTeamInvite'群通知消息, 此类群通知消息的from字段的值为接受入群邀请的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段members的值为接收入群邀请的群成员列表。
        • 如果拒绝邀请, 那么邀请你的人会收到一条类型为'rejectTeamInvite'系统通知, 此类系统通知的from字段的值为拒绝入群邀请的用户的帐号, to字段的值为对应的群ID。
    • 'passTeamApply' (通过入群申请)
      • 用户可以申请加入高级群, 目标群的群主和管理员会收到一条类型为'applyTeam'系统通知, 此类系统通知的from字段的值为申请方的帐号, to字段的值为对应的群ID, 高级群的群主和管理员在收到入群申请后, 可以选择通过或者拒绝入群申请。
        • 如果通过申请, 那么该群的所有群成员会收到一条类型为'passTeamApply'群通知消息, 此类群通知消息的from字段的值为通过入群申请的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段account的值为申请方的帐号, attach有一个字段members的值为被通过申请的群成员列表。
        • 如果拒绝申请, 那么申请人会收到一条类型为'rejectTeamApply'系统通知, 此类系统通知的from字段的值为拒绝方的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的
    • 'addTeamManagers' (添加群管理员)
      • 添加群管理员后, 所有群成员会收到一条类型为'addTeamManagers'群通知消息。此类群通知消息的from字段的值为添加群管理员的人的帐号, to字段的值为对应的群ID, attach有一个字段accounts的值为被加为管理员的帐号列表, attach有一个字段members的值为被加为管理员的群成员列表
    • 'removeTeamManagers' (移除群管理员)
      • 移除群管理员后, 所有群成员会收到一条类型为'removeTeamManagers'群通知消息。此类群通知消息的from字段的值为移除群管理员的人的帐号, to字段的值为对应的群ID, attach有一个字段accounts的值为被移除的管理员的帐号列表, attach有一个字段members的值为被移除管理员的群成员列表
    • 'leaveTeam' (主动退群)
      • 主动退群后, 所有群成员会收到一条类型为'leaveTeam'群通知消息。此类群通知消息的from字段的值为退群的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象
    • 'dismissTeam' (解散群)
      • 解散群后, 所有群成员会收到一条类型为'dismissTeam'群通知消息。此类群通知消息的from字段为解散群的人的帐号, to字段的值为被对应的群ID。
    • 'transferTeam' (转让群)
      • 转让群后, 所有群成员会收到一条类型为'transferTeam'群通知消息。此类群通知消息的from字段的值为转让群的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段account的值为为新群主的帐号, attach有一个字段members的值为包含新旧群主的群成员列表。
    • 'updateTeamMute' (更新群成员禁言状态)
      • 更新群成员禁言状态后, 所有群成员会收到一条类型为'updateTeamMute'群通知消息。此类群通知消息的from字段的值为操作方, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段account的值为被禁言的帐号, attach有一个字段members的值为被禁言的群成员列表。
  • 如果attachaccount或者accounts字段, 那么attach的字段users包含这些账号对应的用户名片
  • 更新群昵称不会收到群通知消息, 所有其它在线的群成员会收到初始化SDK时传入的onupdateteammember回调, 请参考修改自己的群属性修改别人的群昵称

通话事件通知消息

一通通话结束后,无论是接通后正常挂断,亦或是未接来电等,事件双方都会收到一条类型为notification的IM消息。其attach的字段type可以标识该次通话的状态。

  • 'netcallBill'话单通知
    • 成功通话后,由任意一方挂断。此时参与通话的双方都会收到一条attach.type为netcallBill的notification类型的消息。针对该类消息的具体解析,详见话单通知
  • 'netcallRejected'
    • 发起呼叫但被对方拒接,主叫方会收到一条attach.type为netcallRejected的notification类型的消息。
  • 'rejectNetcall'
    • 被叫方收到呼叫后主动拒接,本方会收到一条attach.type为rejectNetcall的notification类型的消息。
  • 'netcallMiss'
    • 未接来电。被叫方一直未处理来电,直到主叫取消呼叫。此时被叫方会收到一条attach.type为netcallMiss的notification类型的消息。
  • 'cancelNetcallBeforeAccept'
    • 被叫方未接听,主叫挂断,取消呼叫。此时主叫方会收到一条attach.type为cancelNetcallBeforeAccept的notification类型的消息。

上述情况已汇总至关于点对点音视频通话事件类型

超大群群通知消息

超大群操作后所有群成员会收到一条相应的超大群群通知消息,超大群群通知消息对应的消息对象有一个字段attach包含了额外的信息, attach有一个字段type来标识超大群群通知消息的类型

  • 'updateSuperTeam' (更新群)

    • 更新群后, 所有群成员会收到一条类型为'updateSuperTeam'群通知消息。此类群通知消息的from字段的值为更新群的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为被更新的超大群信息
  • 'addSuperTeamMembers' (拉人入群)

    • 拉人入群后, 所有超大群群成员会收到一条类型为'addSuperTeamMembers'超大群群通知消息。此类群通知消息的from字段的值为拉人的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的超大群对象, attach有一个字段accounts的值为被拉的人的帐号列表, attach有一个字段members的值为被拉的群成员列表。
  • 'removeSuperTeamMembers' (踢人出群)

    • 踢人出群后, 所有超大群群成员会收到一条类型为'removeSuperTeamMembers'超大群群通知消息。此类群通知消息的from字段的值为踢人的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的超大群对象, attach有一个字段accounts的值为被踢的人的帐号列表。
  • 'leaveSuperTeam' (主动退群)

    • 主动退群后, 所有群成员会收到一条类型为'leaveSuperTeam'群通知消息。此类群通知消息的from字段的值为退群的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象
  • 'transferSuperTeam' (转让群)

    • 转让群后, 所有超大群群成员会收到一条类型为 'transferSuperTeam'群通知消息。此类群通知消息的 from 字段的值为转让群的人的帐号, to 字段的值为对应的群 ID, attach 有一个字段 team 的值为对应的群对象, attach 有一个字段 account 的值为为新群主的帐号, attach 有一个字段 members 的值为包含新旧群主的群成员列表。
  • 'addSuperTeamManagers' (添加群管理员)

    • 添加群管理员后, 所有超大群群成员会收到一条类型为 'addSuperTeamManagers'群通知消息。此类群通知消息的 from 字段的值为添加群管理员的人的帐号, to 字段的值为对应的群 ID, attach 有一个字段 accounts 的值为被加为管理员的帐号列表, attach 有一个字段 members 的值为被加为管理员的群成员列表。
  • 'removeSuperTeamManagers' (移除管理员)。

    • 移除管理员后, 所有超大群群成员会收到一条类型为 'removeSuperTeamManagers'群通知消息。此类群通知消息的 from 字段的值为移除群管理员的人的帐号, to 字段的值为对应的群 ID, attach 有一个字段 accounts 的值为被移除的管理员的帐号列表, attach 有一个字段 members 的值为被移除管理员的群成员列表。
  • 'updateSuperTeamMembersMute' (更新群成员禁言状态)

    • 更新群成员禁言状态后, 所有超大群群成员会收到一条类型为 'updateSuperTeamMembersMute'群通知消息。此类群通知消息的 from 字段的值为操作方, to 字段的值为对应的群 ID, attach 有一个字段 team 的值为对应的群对象, attach 有一个字段 account 的值为被禁言的帐号, attach 有一个字段 members 的值为被禁言的群成员列表。
  • 'passSuperTeamApply' (同意入群申请)

    • 用户可以主动申请加入群, 目标群的群主和管理员会收到一条类型为 'applySuperTeam'群通知消息, 此类系统通知的 from 字段的值为申请方的帐号, to 字段的值为对应的群 ID, 超大群的群主和管理员在收到入群申请后, 可以选择通过或者拒绝入群申请。
      • 如果通过入群申请,那么该群的所有群成员会收到一条类型为 'passSuperTeamApply'群通知消息, 此类群通知消息的 from 字段的值为通过入群申请的人的帐号, to 字段的值为对应的群 ID, attach 有一个字段 team 的值为对应的超大群对象, attach 有一个字段 account 包含了申请方的帐号, attach 有一个字段 members 的值为被通过申请的群成员列表。
      • 如果拒绝入群申请,那么申请人会收到一条类型为 'rejectSuperTeamApply'群通知消息, 此类系统通知的 from 字段的值为拒绝方的帐号, to 字段的值为对应的群 ID, attach 有一个字段 team 的值为对应的超大群。
  • 'acceptSuperTeamInvite' (接受入群邀请)

    • 超大群的群主和管理员在邀请成员加入群拉人入群(通过操作创建群或拉人入群)之后, 被邀请的人会收到一条类型为 'superTeamInvite' 的系统通知, 此类系统通知的 from 字段的值为邀请方的帐号, to 字段的值为对应的群 ID, 此类系统通知的 attach 有一个字段 team 的值为被邀请进入的超大群, 被邀请的人可以选择接受邀请或者拒绝邀请。
      • 如果接受入群邀请, 那么该群的所有群成员会收到一条类型为 'acceptSuperTeamInvite' 的群通知消息, 此类群通知消息的 from 字段的值为接受入群邀请的人的帐号, to 字段的值为对应的群 ID, attach 有一个字段 team 的值为对应的超大群对象, attach 有一个字段 members 的值为接收入群邀请的群成员列表。
      • 如果拒绝入群邀请, 那么邀请你的人会收到一条类型为 'rejectSuperTeamInvite' 的系统通知, 此类系统通知的 from 字段的值为拒绝入群邀请的人的帐号, to 字段的值为对应的群 ID。

处理群通知消息

示例代码

function onTeamNotificationMsg(msg) {
    // 处理群通知消息
    var type = msg.attach.type,
        from = msg.from,
        teamId = msg.to,
        timetag = msg.time,
        team = msg.attach.team,
        account = msg.attach.account,
        accounts = msg.attach.accounts,
        members = msg.attach.members;
    switch (type) {
    case 'updateTeam':
        team.updateTime = timetag;
        onTeams(team);
        break;
    case 'addTeamMembers':
        onAddTeamMembers(team, accounts, members);
        break;
    case 'removeTeamMembers':
        onRemoveTeamMembers(team, teamId, accounts);
        break;
    case 'acceptTeamInvite':
        onAddTeamMembers(team, [from], members);
        break;
    case 'passTeamApply':
        onAddTeamMembers(team, [account], members);
        break;
    case 'addTeamManagers':
        updateTeamManagers(teamId, members);
        break;
    case 'removeTeamManagers':
        updateTeamManagers(teamId, members);
        break;
    case 'leaveTeam':
        onRemoveTeamMembers(team, teamId, [from]);
        break;
    case 'dismissTeam':
        dismissTeam(teamId);
        break;
    case 'transferTeam':
        transferTeam(team, members);
        break;
    }
}
function onAddTeamMembers(team, accounts, members) {
    var teamId = team.teamId;
    /*
    如果是别人被拉进来了,那么拼接群成员列表
    如果是自己被拉进来了,那么同步一次群成员列表
    */
    if (accounts.indexOf(data.account) === -1) {
        onTeamMembers({
            teamId: teamId,
            members: members
        });
    } else {
        nim.getTeamMembers({
            teamId: teamId,
            sync: true,
            done: function(error, obj) {
                if (!error) {
                    onTeamMembers(obj);
                }
            }
        });
    }
    onTeams(team);
}
function onRemoveTeamMembers(team, teamId, accounts) {
    /*
    如果是别人被踢了,那么移除群成员
    如果是自己被踢了,那么离开该群
    */
    if (accounts.indexOf(data.account) === -1) {
        if (team) {
            onTeams(team);
        }
        data.teamMembers[teamId] = nim.cutTeamMembersByAccounts(data.teamMembers[teamId], teamId, accounts);
        refreshTeamMembersUI();
    } else {
        leaveTeam(teamId);
    }
}
function updateTeamManagers(teamId, members) {
    onTeamMembers({
        teamId: teamId,
        members: members
    });
};
function leaveTeam(teamId) {
    onInvalidTeams({
        teamId: teamId
    });
    removeAllTeamMembers(teamId);
}
function dismissTeam(teamId) {
    onInvalidTeams({
        teamId: teamId
    });
    removeAllTeamMembers(teamId);
}
function removeAllTeamMembers(teamId) {
    delete data.teamMembers[teamId];
    refreshTeamMembersUI();
}
function transferTeam(team, members) {
    var teamId = team.teamId;
    onTeamMembers({
        teamId: teamId,
        members: members
    });
    onTeams(team);
}

参数解释

发送消息

一秒内默认最多调用发送消息的接口100次。如需上调上限,请在官网首页通过微信、在线消息或电话等方式咨询商务人员。

  • 跟发送消息相关的接口有
  • 先解释几个所有发送消息的接口都用到的参数
    • scene参数用来指定发送消息的场景
    • to参数用来指定消息的接收方, 发送点对点消息时填帐号, 发送群消息时填群ID
    • 发送消息的接口会返回SDK生成的ID, 对应为字段idClient, 有一个例外是直接发送文件消息是在beforesend回调里获取这个值
    • needUpdateSession 参数表示发送消息时是否刷新远端的服务器会话列表。当发送消息时,设置 needUpdateSessiontrue,接收者收到的消息的 needUpdateSession 也为 trueneedUpdateSessionfalse,接收者收到的消息的 needUpdateSession 也为 false。默认为 true
    • done回调中可以根据error对象和消息对象idClient字段来确定对应的消息的发送状态。
      • 如果error为空, 那么表明idClient对应的消息发送成功
      • error不为空, 表明idClient对应的消息发送失败, error包含详细的错误信息
  • 以下代码皆以发送点对点消息(scene'p2p')为例, 如需发送群消息, 请将scene的值替换为'team', 将to的值替换为群ID

发送文本消息

var msg = nim.sendText({
    scene: 'p2p',
    to: 'account',
    text: 'hello',
    done: sendMsgDone
});
console.log('正在发送p2p text消息, id=' + msg.idClient);
pushMsg(msg);
function sendMsgDone(error, msg) {
    console.log(error);
    console.log(msg);
    console.log('发送' + msg.scene + ' ' + msg.type + '消息' + (!error?'成功':'失败') + ', id=' + msg.idClient);
    pushMsg(msg);
}

预览文件

  • 开发者可以预览文件, 支持以下几种场景
    • 通过参数fileInput传入文件选择 dom 节点或者节点 ID
    • 通过参数blob传入 Blob 对象
    • 通过参数dataURL传入包含 MIME type 和 base64 数据的 data URL, 此用法需要浏览器支持 window.Blob
    • 通过参数filePath 传入文件路径(跨平台系列),支持小程序(5.1.0+)、nodejs(5.4.0+ 内测中)、react-native(5.3.0+),上传文件统一使用该参数;该参数不支持浏览器环境
  • 可以通过参数fastPass传入文件MD5和相关信息(图片宽w、高h,音频时长dur,视频宽w、高h、时长dur),使用重复大文件加速秒传功能
  • v6.3.0及以上版本可以通过参数maxSize对文件进行大小限制。
  • v6.3.0及以上版本可以通过参数commonUpload(默认为false),表示是否使用普通上传(最大100M文件)。默认false为分片直传方式(每片4M,最多10000片),true为普通上传。若需要返回文件md5值,请使用普通上传。
  • SDK会将文件上传到文件服务器, 然后将拿到的文件对象在done回调中传给开发者, 文件对象有以下几种
  • 开发者在拿到文件对象之后, 可以调用发送文件消息来发送文件消息。
  • 文件大小限制为最大100M
    • 高级浏览器会在上传前就检测文件大小
    • IE8/IE9 会在上传完成后检测文件大小(5.0.0以下版本支持IE8)
nim.previewFile({
    type: 'image',
    fileInput: fileInput,
    fastPass: '{"w":200,"h":110,"md5":"xxxxxxxxx"}',
    uploadprogress: function(obj) {
        console.log('文件总大小: ' + obj.total + 'bytes');
        console.log('已经上传的大小: ' + obj.loaded + 'bytes');
        console.log('上传进度: ' + obj.percentage);
        console.log('上传进度文本: ' + obj.percentageText);
    },
    done: function(error, file) {
        console.log('上传image' + (!error?'成功':'失败'));
        // show file to the user
        if (!error) {
            var msg = nim.sendFile({
                scene: 'p2p',
                to: 'account',
                file: file,
                done: sendMsgDone
            });
            console.log('正在发送p2p image消息, id=' + msg.idClient);
            pushMsg(msg);
        }
    }
});

发送文件消息

  • 文件消息消息收发的一种
  • 开发者可以直接发送文件消息
    • 支持以下几种场景
      • 通过参数fileInput传入文件选择 dom 节点或者节点 ID,SDK 会读取该节点下的文件,在上传完成前请不要操作该节点下的文件
      • 通过参数blob传入 Blob 对象
      • 通过参数dataURL传入包含 MIME type 和 base64 数据的 data URL,此用法需要浏览器支持 Blob
    • SDK 会先将文件上传到文件服务器, 然后把拿到的文件对象在uploaddone回调中传给用户, 然后将其拼装成文件消息发送出去。
  • 开发者也可以先预览文件来获取文件对象, 然后调用此接口发送文件消息。
    • 通过参数file 传入文件
  • 直接发送文件消息的话会在beforesend回调里面传入SDK生成的idClient, 如果先预览文件再发送, 那么此接口会直接返回idClient
  • 参数type指定了要发送的文件类型, 包括图片、音频、视频和普通文件, 对应的值分别为'image''audio''video''file', 不传默认为'file'
  • 图片、音频、视频和普通文件的区别在于具体的文件信息不一样, 具体字段请参考
  • 文件大小限制为最大100M
    • 高级浏览器会在上传前就检测文件大小
    • IE8/IE9会在上传完成后检测文件大小
nim.sendFile({
    scene: 'p2p',
    to: 'account',
    type: 'image',
    fileInput: fileInput,
    fastPass: '{"w":200,"h":110,"md5":"xxxxxxxxx"}',
    beginupload: function(upload) {
        // - 如果开发者传入 fileInput, 在此回调之前不能修改 fileInput
        // - 在此回调之后可以取消图片上传, 此回调会接收一个参数 `upload`, 调用 `upload.abort();` 来取消文件上传
    },
    uploadprogress: function(obj) {
        console.log('文件总大小: ' + obj.total + 'bytes');
        console.log('已经上传的大小: ' + obj.loaded + 'bytes');
        console.log('上传进度: ' + obj.percentage);
        console.log('上传进度文本: ' + obj.percentageText);
    },
    uploaddone: function(error, file) {
        console.log(error);
        console.log(file);
        console.log('上传' + (!error?'成功':'失败'));
    },
    beforesend: function(msg) {
        console.log('正在发送p2p image消息, id=' + msg.idClient);
        pushMsg(msg);
    },
    done: sendMsgDone
});

发送地理位置消息

var msg = nim.sendGeo({
    scene: 'p2p',
    to: 'account',
    geo: {
        lng: 116.3833,
        lat: 39.9167,
        title: 'Beijing'
    },
    done: sendMsgDone
});
console.log('正在发送p2p geo消息, id=' + msg.idClient);
pushMsg(msg);

发送提醒消息

  • 提醒消息是消息收发的一种
  • 提醒消息用于会话内的状态提醒,如进入会话时出现的欢迎消息,或者会话命中敏感词后的提示消息等等.
var msg = nim.sendTipMsg({
    scene: 'p2p',
    to: 'account',
    tip: 'tip content',
    done: sendMsgDone
});
console.log('正在发送p2p提醒消息, id=' + msg.idClient);
pushMsg(msg);

发送自定义消息

  • 自定义消息是消息收发的一种
  • 在网易云信开放的web-demo源码中,type-1为[石头剪刀布],type-2为[阅后即焚],type-3为[贴图表情],type-4为[白板教学]
  • 下面的代码用自定义消息实现了石头剪刀布游戏
var value = Math.ceil(Math.random()*3);
var content = {
    type: 1,
    data: {
        value: value
    }
};
var msg = nim.sendCustomMsg({
    scene: 'p2p',
    to: 'account',
    content: JSON.stringify(content),
    done: sendMsgDone
});
console.log('正在发送p2p自定义消息, id=' + msg.idClient);
pushMsg(msg);

发送消息的配置选项

  • 上面的各个发送消息的接口都可以配置额外的选项, 来满足开发者对服务器的自定义需求。
    • custom: 扩展字段
      • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
    • pushContent: 自定义推送文案,限制500字
    • pushPayload: 自定义的推送属性
      • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
    • needPushNick: 是否需要推送昵称
    • apns: 特殊推送选项, 只在群会话中使用
    • apns.accounts: 需要特殊推送的账号列表, 不填表示推送给当前会话内的所有用户
    • apns.content: 需要特殊推送的文案, 不填的话默认为 pushContent
    • apns.forcePush 是否强制推送, 不填的话默认 true. true 表示即使推送列表中的用户屏蔽了当前会话(如静音), 仍能够推送当前这条内容给相应用户
    • isHistoryable: 是否存储云端历史
    • isRoamingable: 是否支持漫游
    • isSyncable: 是否支持发送者多端同步
    • cc: 是否支持抄送
    • isPushable: 是否需要推送
    • isOfflinable: 是否要存离线
    • isUnreadable: 是否计入消息未读数
    • needMsgReceipt: 是否需要业务已读(包含该字段即表示需要),只有设置了业务已读,才可以调用getTeamMsgReads,getTeamMsgReadAccounts等相关方法
    • yidunEnable: 指定是否需要使用自定义反垃圾字段,即antiSpamContent,默认false不需要。
    • antiSpamUsingYidun: 单条消息是否使用易盾反垃圾,false表示开通易盾的情况下,不过易盾反垃圾。
    • antiSpamContent: 在开启yidunEnable后, 开发者自定义的反垃圾字段(json格式),格式如下:{"type": 1, "data": "custom content"} 字段说明:type:1.文本,2.图片,3视频,data内容:文本内容or图片地址or视频地址
    • antiSpamBusinessId: 用户配置的对某条单条消息另外反垃圾的业务ID
  • 下面给一个发送文本消息的例子, 发送其它消息的接口类似
var msg = nim.sendText({
    scene: 'p2p',
    to: 'account',
    text: 'hello',
    custom: '{}',
    done: sendMsgDone
});

发送本地消息

  • 发送消息时可以指定参数isLocaltrue, 那么SDK并不会发送此条消息, 而是直接调用回调表示发送成功, 并更新对应的会话
var value = Math.ceil(Math.random()*3);
var content = {
    type: 1,
    data: {
        value: value
    }
};
var msg = nim.sendCustomMsg({
    scene: 'p2p',
    to: 'account',
    content: JSON.stringify(content),
    isLocal: true,
    done: sendMsgDone
});
console.log('正在发送p2p自定义消息, id=' + msg.idClient);
pushMsg(msg);

重发消息

如果消息发送失败, 那么可以重发消息

nim.resendMsg({
  msg: someMsg,
  done: sendMsgDone
})
console.log('正在重发消息', someMsg)

转发消息

  • msg: 待转发的消息
  • scene: 新的场景
  • to: 新的接收方, 对方帐号或者群id
nim.forwardMsg({
  msg: someMsg,
  scene: 'p2p',
  to: 'account',
  done: sendMsgDone
})
console.log('正在转发消息', someMsg)

消息撤回

  • 在会话时,允许用户撤回一定时间内发送过的消息,这个时长可以由云信管理后台进行配置。
  • 如果需要在撤回后显示一条已撤回的提示 ( 见 Demo 交互 ) ,开发者可以自行构造一条提醒消息并插入本地数据库。
  • 撤回消息后, 消息接收方会收到一条类型为'deleteMsg'系统通知, 此类系统通知的 msg 为被删除的消息的部分字段。如果是群消息, 那么群里的所有人都会收到这条系统通知. 如果同时在多个端登录了同一个账号, 那么其它端也会收到这条系统通知.
  • msg: 待撤回的消息

如果消息发送失败或者消息发送者被拉黑,那么即使在可撤回时长内也无法撤回。

nim.deleteMsg({
  msg: someMsg,
  done: deleteMsgDone
})
console.log('正在撤回消息', someMsg)
function deleteMsgDone (error) {
  console.log('撤回消息' + (!error?'成功':'失败'), error);
}

标记消息为已收到

  • 先解释一下消息发送和接收的流程, A 发消息给 B, 实际的流程是:
    • A 将消息发送给服务器, 如果 B 在线, 服务器会将消息推给 B; 如果 B 不在线, 服务器会在 B 上线的时候将此消息作为离线消息推给 B
    • B 在收到在线消息和离线消息之后, 需要告诉服务器收到了这些消息, 这样 B 下次登录时服务器就不会再次推这些消息
    • 如果 B 没有告诉服务器收到了这些消息, 那么 B 下次登录时, 服务器会再次将这些消息推给 B
  • 默认情况下, SDK 在收到消息(包括在线消息和离线消息)之后就将消息标记为已收到, 这样下次登录时就不会再收到这些消息, 一般情况下开发者不需要关心此接口
    • 在支持数据库时, SDK 会将消息存储于数据库中, 如果开发者发现会话的未读数大于收到的离线消息数, 那么需要从本地拉取未读取的消息.
    • 在不支持数据库时, 如果开发者想控制标记消息为已收到的时机, 那么可以设置初始化参数autoMarkReadfalse, 这样SDK就不会自动标记消息为已收到, 此时需要开发者在适当的时机调用此接口来标记消息为已收到, 否则下次登录后还是会收到未标记为已收到的消息.

示例代码

var nim = NIM.getInstance({
    autoMarkRead: false
});
nim.markMsgRead(someMsg);
// or
nim.markMsgRead([someMsg]);

已读回执

  • 会话对象加了一个属性msgReceiptTime表示消息已读回执时间戳, 如果有此字段, 说明此时间戳之前的所有消息对方均已读

发送消息已读回执

  • 目前只支持'p2p'会话
  • 如果没有传入消息, 则直接返回成功
  • 如果已经发送过比传入的消息的时间戳大的已读回执, 那么直接返回成功
  • 参数msg为要发送已读回执的会话的最后一条收到的消息, 可以直接通过session.lastMsg来获取此消息
nim.sendMsgReceipt({
    msg: session.lastMsg,
    done: sendMsgReceiptDone
});
function sendMsgReceiptDone(error, obj) {
    console.log('发送消息已读回执' + (!error?'成功':'失败'), error, obj);
}

查询消息是否被对方读过了

  • 目前只支持'p2p'会话
var isRemoteRead = nim.isMsgRemoteRead(msg);
此文档是否对你有帮助?
有帮助
我要吐槽
  • 消息说明
  • 初始化参数
  • 消息对象
  • yidunAntiSpamRes字段说明
  • 易盾反垃圾文档
  • 消息场景
  • 消息类型
  • 文本对象
  • 图片对象
  • 音频对象
  • 视频对象
  • 文件对象
  • 地理位置对象
  • 群通知消息
  • 通话事件通知消息
  • 超大群群通知消息
  • 处理群通知消息
  • 发送消息
  • 发送文本消息
  • 预览文件
  • 发送文件消息
  • 发送地理位置消息
  • 发送提醒消息
  • 发送自定义消息
  • 发送消息的配置选项
  • 发送本地消息
  • 重发消息
  • 转发消息
  • 消息撤回
  • 标记消息为已收到
  • 已读回执
  • 发送消息已读回执
  • 查询消息是否被对方读过了