消息收发(已废弃)
更新时间: 2024/11/25 10:11:32
本文已废弃,请前往消息概述等消息相关文档查看相关说明。
消息说明
- 点对点或群组消息的收发,可分为消息、离线消息、漫游消息三类。
- 离线消息、漫游消息只能收不能发送,在初始化时onofflinemsgs/onroamingmsgs的回调中获取
- 消息可收可发,收消息在初始化时onmsg的回调中接收
- 离线消息:他人发给自己的消息,且自己的账号在任何客户端都未读过,则算离线消息;离线消息只要其它任何一端(包括自己)已读,则不会再收到对应消息。
- 漫游消息:他人发给自己的消息,在本客户端未读过,但在其他客户端如iOS/android/pc...读过,则算漫游消息;漫游消息只有本端已读,才不会再下推。
初始化参数
- 这里的参数并不是所有的初始化参数, 请查阅初始化SDK, 以及其它章节的初始化参数
示例代码
javascriptvar 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 页会收到
onroamingmsgs
和onofflinemsgs
回调, 其它 tab 页在同步完成之后, 需要调用获取本地历史记录来从本地缓存中拉取消息记录 onmsg
, 收到消息对象的回调- 当前登录帐号在其它端发送消息之后也会收到此回调, 注意此时消息对象的
from
字段就是当前登录的帐号
- 当前登录帐号在其它端发送消息之后也会收到此回调, 注意此时消息对象的
- 可以调用nim.mergeMsgs来合并数据
消息对象
消息对象有以下字段
scene
: 消息场景from
: 消息发送方, 帐号或群idfromNick
: 消息发送方的昵称fromClientType
: 发送方的设备类型fromDeviceId
: 发送端设备idto
: 消息接收方, 帐号或群idtime
: 时间戳type
: 消息类型sessionId
: 消息所属的会话对象的IDtarget
: 聊天对象, 账号或者群idflow
: 消息的流向- 'in'表示此消息是收到的消息
- 'out'表示此消息是发出的消息
status
: 消息发送状态'sending'
发送中'success'
发送成功'fail'
发送失败
text
: 文本消息的文本内容, 请参考发送文本消息file
: 文件消息的文件对象, 具体字段请参考图片对象、音频对象、视频对象、文件对象, 请参考发送文件消息geo
: 地理位置消息的地理位置对象, 请参考发送地理位置消息tip
: 提醒消息的内容, 请参考发送提醒消息content
: 自定义消息的消息内容, 开发者可以自行扩展, 建议封装成JSON格式字符串, 请参考发送自定义消息attach
: 群通知消息的附加信息, 参考群通知消息来查看不同类型的群通知消息对应的附加信息idClient
: SDK生成的消息id, 在发送消息之后会返回给开发者, 开发者可以在发送消息的回调里面根据这个ID来判断相应消息的发送状态, 到底是发送成功了还是发送失败了, 然后根据此状态来更新页面的UI。如果发送失败, 那么可以重发消息
idServer
: 服务器用于区分消息用的ID, 主要用于获取云端历史记录
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
: 大小, 单位bytemd5
: md5url
: urlext
: 扩展名w
: 宽, 单位pxh
: 高, 单位px
音频对象
当发送音频消息或收到音频消息时, 消息对象的file
字段代表音频对象, 包含以下属性:
name
: 名字size
: 大小, 单位bytemd5
: md5url
: urlext
: 扩展名dur
: 长度, 单位ms
视频对象
当发送视频消息或收到视频消息时, 消息对象的file
字段代表视频对象, 包含以下属性:
name
: 名字size
: 大小, 单位bytemd5
: md5url
: urlext
: 扩展名dur
: 长度, 单位msw
: 宽, 分辨率, 单位pxh
: 高, 分辨率, 单位px
视频对象取封面(首帧图片):
- 获取到的视频对象后加
vframe
即可,例如:原视频地址为http://img-sample.nos-eastchina1.126.net/sample.wmv
,则封面(首帧)图片地址为http://img-sample.nos-eastchina1.126.net/sample.wmv?vframe
文件对象
当发送文件消息或收到文件消息时, 消息对象的file
字段代表文件对象, 包含以下属性:
name
: 名字size
: 大小, 单位bytemd5
: md5url
: urlext
: 扩展名
地理位置对象
当发送地理位置消息或收到地理位置消息时, 消息对象的geo
字段代表地理位置对象, 包含以下属性:
lng
: 经度lat
: 纬度title
: 地址描述
群通知消息
- 群通知消息是消息类型的一种
- 某些群操作后所有群成员会收到一条相应的群通知消息
- 群通知消息对应的消息对象有一个字段
attach
包含了额外的信息,attach
有一个字段type
来标识群通知消息的类型'updateTeam'
(更新群)'addTeamMembers'
(拉人入群)'removeTeamMembers'
(踢人出群)'acceptTeamInvite'
(接受入群邀请)'passTeamApply'
(通过入群申请)'addTeamManagers'
(添加群管理员)'removeTeamManagers'
(移除群管理员)'leaveTeam'
(主动退群)'dismissTeam'
(解散群)'transferTeam'
(转让群)'updateTeamMute'
(更新群成员禁言状态)
- 如果
attach
有account
或者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'
(更新群) -
'addSuperTeamMembers'
(拉人入群) -
'removeSuperTeamMembers'
(踢人出群) -
'leaveSuperTeam'
(主动退群) -
'transferSuperTeam'
(转让群) -
'addSuperTeamManagers'
(添加群管理员) -
'removeSuperTeamManagers'
(移除管理员)。 -
'updateSuperTeamMembersMute'
(更新群成员禁言状态) -
'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
的值为被邀请进入的超大群, 被邀请的人可以选择接受邀请或者拒绝邀请。
- 超大群的群主和管理员在邀请成员加入群拉人入群(通过操作创建群或拉人入群)之后, 被邀请的人会收到一条类型为
处理群通知消息
- 这一章节涉及到了群和群成员的处理, 要跟以下章节一起看
示例代码
javascriptfunction 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);
}
参数解释
- 这里面用到了nim.cutTeamMembersByAccounts来合并群成员
发送消息
一秒内默认最多调用发送消息的接口100次。如需上调上限,请在官网首页通过微信、在线消息或电话等方式咨询商务人员。
- 跟发送消息相关的接口有
- 先解释几个所有发送消息的接口都用到的参数
scene
参数用来指定发送消息的场景to
参数用来指定消息的接收方, 发送点对点消息时填帐号, 发送群消息时填群ID- 发送消息的接口会返回SDK生成的ID, 对应为字段
idClient
, 有一个例外是直接发送文件消息是在beforesend
回调里获取这个值 needUpdateSession
参数表示发送消息时是否刷新远端的服务器会话列表。当发送消息时,设置needUpdateSession
为true
,接收者收到的消息的needUpdateSession
也为true
;needUpdateSession
为false
,接收者收到的消息的needUpdateSession
也为false
。默认为true
。- 在
done
回调中可以根据error
对象和消息对象的idClient
字段来确定对应的消息的发送状态。- 如果
error
为空, 那么表明idClient
对应的消息发送成功 error
不为空, 表明idClient
对应的消息发送失败,error
包含详细的错误信息
- 如果
- 以下代码皆以发送点对点消息(
scene
为'p2p'
)为例, 如需发送群消息, 请将scene
的值替换为'team'
, 将to
的值替换为群ID
发送文本消息
javascriptvar 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)
javascriptnim.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会在上传完成后检测文件大小
javascriptnim.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
});
发送地理位置消息
javascriptvar 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);
发送提醒消息
- 提醒消息是消息收发的一种
- 提醒消息用于会话内的状态提醒,如进入会话时出现的欢迎消息,或者会话命中敏感词后的提示消息等等.
javascriptvar 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为[白板教学]
- 下面的代码用自定义消息实现了
石头剪刀布
游戏
javascriptvar 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
: 需要特殊推送的文案, 不填的话默认为 pushContentapns.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
- 下面给一个发送文本消息的例子, 发送其它消息的接口类似
javascriptvar msg = nim.sendText({
scene: 'p2p',
to: 'account',
text: 'hello',
custom: '{}',
done: sendMsgDone
});
发送本地消息
- 发送消息时可以指定参数
isLocal
为true
, 那么SDK并不会发送此条消息, 而是直接调用回调表示发送成功, 并更新对应的会话
javascriptvar 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);
重发消息
如果消息发送失败, 那么可以重发消息
javascriptnim.resendMsg({
msg: someMsg,
done: sendMsgDone
})
console.log('正在重发消息', someMsg)
转发消息
msg
: 待转发的消息scene
: 新的场景to
: 新的接收方, 对方帐号或者群id
javascriptnim.forwardMsg({
msg: someMsg,
scene: 'p2p',
to: 'account',
done: sendMsgDone
})
console.log('正在转发消息', someMsg)
消息撤回
- 在会话时,允许用户撤回一定时间内发送过的消息,这个时长可以由云信管理后台进行配置。
- 如果需要在撤回后显示一条已撤回的提示 ( 见 Demo 交互 ) ,开发者可以自行构造一条提醒消息并插入本地数据库。
- 撤回消息后, 消息接收方会收到一条类型为
'deleteMsg'
的系统通知, 此类系统通知的msg
为被删除的消息的部分字段。如果是群消息, 那么群里的所有人都会收到这条系统通知. 如果同时在多个端登录了同一个账号, 那么其它端也会收到这条系统通知. msg
: 待撤回的消息
如果消息发送失败或者消息发送者被拉黑,那么即使在可撤回时长内也无法撤回。
jsnim.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 会将消息存储于数据库中, 如果开发者发现会话的未读数大于收到的离线消息数, 那么需要从本地拉取未读取的消息.
- 在不支持数据库时, 如果开发者想控制标记消息为已收到的时机, 那么可以设置初始化参数
autoMarkRead
为false
, 这样SDK就不会自动标记消息为已收到, 此时需要开发者在适当的时机调用此接口来标记消息为已收到, 否则下次登录后还是会收到未标记为已收到的消息.
示例代码
javascriptvar nim = NIM.getInstance({
autoMarkRead: false
});
nim.markMsgRead(someMsg);
// or
nim.markMsgRead([someMsg]);
已读回执
- 会话对象加了一个属性
msgReceiptTime
表示消息已读回执时间戳, 如果有此字段, 说明此时间戳之前的所有消息对方均已读- 目前仅对
'p2p'
会话起作用 - 此字段不一定有, 只有对方发送过已读回执之后才会有
- 调用接口发送消息已读回执来发送消息已读回执
- 调用接口查询消息是否被对方读过了来查询消息是否被对方读过了
- 目前仅对
发送消息已读回执
- 目前只支持
'p2p'
会话 - 如果没有传入消息, 则直接返回成功
- 如果已经发送过比传入的消息的时间戳大的已读回执, 那么直接返回成功
- 参数
msg
为要发送已读回执的会话的最后一条收到的消息, 可以直接通过session.lastMsg来获取此消息
javascriptnim.sendMsgReceipt({
msg: session.lastMsg,
done: sendMsgReceiptDone
});
function sendMsgReceiptDone(error, obj) {
console.log('发送消息已读回执' + (!error?'成功':'失败'), error, obj);
}
查询消息是否被对方读过了
- 目前只支持
'p2p'
会话
javascriptvar isRemoteRead = nim.isMsgRemoteRead(msg);