消息收发(已废弃)

更新时间: 2023/07/21 14:56:54

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

消息说明

  • 点对点或群组消息的收发,可分为消息、离线消息、漫游消息三类。
    • 离线消息、漫游消息只能收不能发送,在初始化时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字段说明
  • 易盾反垃圾文档
  • 消息场景
  • 消息类型
  • 文本对象
  • 图片对象
  • 音频对象
  • 视频对象
  • 文件对象
  • 地理位置对象
  • 群通知消息
  • 通话事件通知消息
  • 超大群群通知消息
  • 处理群通知消息
  • 发送消息
  • 发送文本消息
  • 预览文件
  • 发送文件消息
  • 发送地理位置消息
  • 发送提醒消息
  • 发送自定义消息
  • 发送消息的配置选项
  • 发送本地消息
  • 重发消息
  • 转发消息
  • 消息撤回
  • 标记消息为已收到
  • 已读回执
  • 发送消息已读回执
  • 查询消息是否被对方读过了