消息收发
更新时间: 2024/03/15 16:12:30
消息功能概述
SDK 提供一套完善的消息传输管理服务,包括收发消息,存储消息,上传下载附件,管理最近联系人等。原生支持发送文本,语音,图片,视频,文件,地理位置,提醒等多种类型消息,同时支持用户发送自定义的消息类型。消息功能具体介绍可参考产品介绍的 基础消息功能
NIMMessageType
消息类型
枚举 | 值 | 说明 |
---|---|---|
kNIMMessageTypeText | 0 | 文本类型消息 |
kNIMMessageTypekNIMMessageTypeImageText | 1 | 图片类型消息 |
kNIMMessageTypeAudio | 2 | 声音类型消息 |
kNIMMessageTypeVideo | 3 | 视频类型消息 |
kNIMMessageTypeLocation | 4 | 位置类型消息 |
kNIMMessageTypeNotification | 5 | 系统类型通知(包括入群出群通知等 |
kNIMMessageTypeFile | 6 | 文件类型消息 |
kNIMMessageTypeTips | 10 | 提醒类型消息,Tip内容根据格式要求填入消息结构中的kNIMMsgKeyServerExt字段 |
kNIMMessageTypeRobot | 11 | 智能机器人消(暂不支持) |
kNIMMessageTypeCustom | 100 | 自定义消息 |
kNIMMessageTypeUnknown | 1000 | 未知类型消息,作为默认值 |
NIMMessageFeature
消息类型
枚举 | 值 | 说明 |
---|---|---|
kNIMMessageFeatureDefault | 0 | 默认 |
kNIMMessageFeatureLeaveMsg | 1 | 离线消息 |
kNIMMessageFeatureRoamMsg | 2 | 漫游消息 |
kNIMMessageFeatureSyncMsg | 3 | 默认消息,多端同时登录时,同步到各端的消息 |
kNIMMessageFeatureCustomizedMsg | 4 | 透传消息 |
NIMIMMessage
消息基础内容
类型 | 参数 | 说明 |
---|---|---|
NIMSessionType | SessionType | 会话类型,详见NIMSessionType |
string | SenderID | 消息发送方id,服务器填写,发送方不需要填写 |
string | ReceiverID | 消息接收方id,必填,如给自己发送消息时填写自己id |
NIMClientType | SenderClientType | 消息发送方客户端类型,服务器填写,发送方不需要填写 |
string | SenderDeviceId | 消息发送方设备id,服务器填写,发送方不需要填写 |
string | SenderNickname | 消息发送方昵称,服务器填写,发送方不需要填写 |
long | TimeStamp | 消息时间戳,(毫秒13位UNIX时间戳) |
NIMMessageType | MessageType | 消息类型,详见NIMMessageType |
string | ClientMsgID | 消息uuid,唯一标识,发送方填写 |
string | ServerMsgId | 服务器端消息id,服务器填写 |
string | ServerExtension | 第三方扩展字段, 必须为可以解析为json的非格式化的字符串,长度限制1024 |
bool | ResendFlag | 是否是重发消息,第一次发送0,再次重发该消息填 1 |
bool | NeedPush | 是否需要推送,1:需要,0:不需要 |
bool | NeedCounting | (可选)推送是否要做消息计数(角标) 1:需要,0:不需要 |
bool | NeedPushNick | (可选)推送是否需要前缀 默认 True |
string | PushContent | 自定义推送文案,长度限制200字节 |
JsonExtension | PushPayload | 自定义的推送属性,限制非格式化的json字符串,长度限制2048 |
bool | ServerSaveHistory | (可选)该消息是否存储云端历史,可选,默认填 1,1:需要,0:不需要,如果支持漫游和离线,则必须填1 |
bool | Roaming | (可选)该消息是否支持漫游,可选, 默认1,1:需要,0:不需要 |
bool | MultiSync | (可选)该消息是否支持发送者多端同步,默认填1, 1:需要,0:不需要 |
bool | Routable | (可选)该消息是否抄送,0:不支持,1:支持,默认按照app的路由开关 |
bool | SavedOffline | (可选)消息是否要存离线,默认填1, 1:需要,0:不需要,如果需要支持漫游,必须填1 |
bool | AntiSpamEnabled | 是否需要过易盾反垃圾,1:需要,0:不需要 |
string | AntiSpamContent | (可选)开发者自定义的反垃圾字段,长度限制:5000字符, 格式为json string,{"type" : 1:文本,2:图片,3视频, "data" : "文本内容or图片地址or视频地址"} |
bool | ClientAntiSpamHitting | 是否命中客户端反垃圾,通过是否命中消息过滤规则判断,如果命中则填true,对方将不会收到该条消息,主要用于游戏方面的敏感词过滤 |
string | AntiSpamBizID | (可选)用户配置的对某些单条消息另外的反垃圾的业务ID(暂不支持) |
string | LocalFilePath | 多媒体消息资源本地绝对路径,SDK本地维护,发送多媒体消息时必填,如果是图片消息,当设置下载缩略图时,此路径为缩略图的本地绝对路径 |
string | TalkID | 会话id,发送方选填,接收方收到的是消息发送方id |
string | ResourceId | 多媒体资源id,发送方选填,接收方收到的是客户端消息id |
NIMMsgLogStatus | MsgLogStatus | 本地消息状态,详见消息状态类型) |
NIMMsgLogSubStatus | MsgLogSubStatus | 本地消息子状态,详见消息子状态类型) |
string | LocalExtension | 本地扩展内容,只保存在本地,预留字段 |
注意: 漫游消息是指在一端已经收过的消息,在未登录的一端也会下发(服务端最近100个会话)的消息,多端同步是指多个设备平台是同时登录时,一端发送消息,其他端同步收到发出的的消息,离线消息是指 发送给对方消息,如果对方不在线,对方在下次登录时会收到的消息。
消息相关设置说明:
SavedOffline | ServerSaveHistory | Roaming | MultiSync | |
---|---|---|---|---|
离线消息 | 1 | 1 | optional | optional |
漫游消息 | 1 | 1 | 1 | optional |
多端同步消息 | optional | optional | optional | 1 |
发送消息
SDK提供对普通文本消息,图片消息,语音消息,视频消息,文件消息,地理位置消息,提醒消息等等内置消息类型(NIMMessageType)的支持,也可以发送自定义的消息。同时我们也提供了停止发送消息接口,该接口目前主要用于在文件消息上传过程中终止消息发送。
- API 原型
public static void SendMessage(NIMIMMessage message, ReportUploadProgressDelegate action = null);
- 参数说明
参数 | 说明 |
---|---|
message | 消息内容,详见NIMIMMessage |
action | 上传进度回调通知,如果存在图片、音视频文件 等自定上传的附件内容时,会通知上传进度 |
注意事项
一秒内默认最多调用发送消息接口100次。如需上调上限,请在官网首页通过微信、在线消息或电话等方式咨询商务人员。
消息设置
发送消息还提供了以下消息属性设置(对应NIMIMMessage中的字段):
-
消息支持扩展字段,扩展字段分为服务器扩展字段kNIMMsgKeyServerExt和本地扩展字段kNIMMsgKeyLocalExt,最大长度1024字节。对于服务器扩展字段,该字段会发送到其他端,而本地扩展字段仅在本地有效。对于这两种扩展字段, SDK 都会存储在数据库中。
-
推送文案字段(
kNIMMsgKeyPushContent
,最大长度200字节)和自定义推送属性(kNIMMsgKeyPushPayload
,最大长度2048字节),请注意最大长度的限制。设置了推送文案后,接收方收到消息时,在通知栏提醒中会显示该文案,如果不设置则采用 SDK 默认的文案。 -
是否需要推送字段(
kNIMMsgKeyPushEnable
),0:不需要,1:需要。 -
推送是否要做消息计数字段(
kNIMMsgKeyNeedBadge
),0:不需要,1:需要。 -
推送是否需要推送昵称(
kNIMMsgKeyNeedPushNick
),0:不需要,1:需要。 -
消息是否存储云端(
kNIMMsgKeyHistorySave
),如果设置为0,则通过拉取服务器消息历史的接口无法获取该条消息。0:不需要,1:需要。 -
消息是否支持漫游(
kNIMMsgKeyMsgRoaming
),如果需要,即使某一个客户端收取过这条消息,其他客户端再次登录也会漫游到这条消息。0:不需要,1:需要。 -
消息是否支持多端同步(
kNIMMsgKeyMsgSync
),如果需要,则会在发送一条消息后,将这条消息同步到同时登录的其他客户端。0:不需要,1:需要。
针对群组消息,提供强推属性设置(可以用于实现@功能等):
-
是否强推字段(
kNIMMsgKeyIsForcePush
),0:不需要,1:需要。 -
强推列表字段(
kNIMMsgKeyForcePushList
),推送指定账号id string array json, 如果强推全员不填。 -
强推文本字段(
kNIMMsgKeyForcePushContent
),群组消息强推文本。
反垃圾字段:
-
开发者指定的该条消息反垃圾规则的ID(kMsgTagAntiSpamBusinessId) 规则ID,保持与服务端一致
-
是否需要过易盾反垃圾(kNIMMsgKeyAntiSpamEnable),0:不需要,1:需要。
-
需要过易盾反垃圾的自定义内容(kNIMMsgKeyAntiSpamContent),长度限制5000字符,格式为json string,{"type" : 1:文本,2:图片,3视频,"data" : "文本内容or图片地址or视频地址"}。
-
单条消息是否使用易盾反垃圾(kNIMMsgKeyAntiSpamUsingYiDun), 0:(在开通易盾的情况下)不过易盾反垃圾
文本消息
首先创建文本消息的内容,按需填写必要的消息设置,然后通过SendMessage
接口发送。
NIMTextMessage
文本消息
NIMTextMessage
派生自NIMIMMessage,继承所有的父类字段
类型 | 参数 | 字段 |
---|---|---|
NIMMessageType | MessageType | 指定为NIMMessageType.kNIMMessageTypeText |
string | TextContent | 文本内容 |
- 示例
//以点对消息为例,测试账号test1
NIMTextMessage msg = new NIMTextMessage();
msg.ReceiverID = "test1";
msg.SessionType = NIMSessionType.kNIMSessionTypeP2P;
msg.TimeStamp = 1520500638234;//当前UNIX时间戳 毫秒
msg.ClientMsgID = "uuid";//生成自己的唯一uuid;
msg.TextContent = "这是一条文本消息。";
//其他消息设置,其他消息类似
msg.Roaming = true;
msg.SavedOffline = true;
msg.ServerSaveHistory = true;
//如果需要反垃圾
msg.AntiSpamEnabled = true;
//组装反垃圾内容
JsonExtension jx = new JsonExtension();
jx.AddItem("type",1);
jx.AddItem("data",msg.TextContent);//如果是图片视频类型,填附件的url
msg.AntiSpamContent = jx.Value;
...
NIM.TalkAPI.SendMessage(msg,null);
图片消息
首先创建图片消息的内容,按需填写必要的消息设置,然后通过SendMessage
接口发送。发送本地图片文件会自动上传。
NIMImageMessage
派生自NIMIMMessage,继承所有的父类字段
类型 | 参数 | 字段 |
---|---|---|
NIMMessageType | MessageType | 指定为NIMMessageType.kNIMMessageTypeImage |
NIMImageAttachment | ImageAttachment | 图片附件内容 |
NIMMessageAttachment
文件类型附件基类
类型 | 参数 | 字段 |
---|---|---|
string | MD5 | 文件内容的md5 |
Int64 | Size | 文件大小,64位整型 |
string | RemoteUrl | 文件的http url |
string | DisplayName | 文件名 |
string | FileExtension | 文件扩展名 |
string | LocalResID | 本地文件资源id,不填 |
而图片消息的附件内容NIMImageAttachment
派生自NIMMessageAttachment,其自有字段说明
类型 | 参数 | 字段 |
---|---|---|
int | Width | 图片宽度 |
int | Height | 图片高度 |
- 示例
//以点对消息为例,测试账号test1
NIMImageMessage msg = new NIMImageMessage();
msg.ReceiverID = "test1";
msg.SessionType = NIMSessionType.kNIMSessionTypeP2P;
msg.TimeStamp = 1520500638234;//当前UNIX时间戳 毫秒
msg.ClientMsgID = "uuid";//生成自己的唯一uuid;
//如果是发送本地文件,请给LocalFilePath赋值
msg.LocalFilePath="c:\\img.png";
//组装附件内容
NIMImageAttachment attachment = new NIMImageAttachment();
attachment.MD5 = "0ca175b9c0f726a831d895e269332461";
attachment.Size = 409600;
attachment.RemoteUrl="http://xxxxxx/img.png";//如果发送本地文件,此处填空
attachment.DisplayName="img";
attachment.FileExtension="png";
//设置图片高度和宽度
attachment.Width = 800;
attachment.Height = 600;
msg.ImageAttachment = attachment;
//其他消息设置
...
NIM.TalkAPI.SendMessage(msg,null);
语音消息
首先创建语音消息的内容,按需填写必要的消息设置,然后通过SendMessage
接口发送。发送本地语音文件会自动上传。
NIMAudioMessage
派生自NIMIMMessage,继承所有的父类字段
类型 | 参数 | 字段 |
---|---|---|
NIMMessageType | MessageType | 指定为NIMMessageType.kNIMMessageTypeAudio |
NIMAudioAttachment | AudioAttachment | 语音附件内容 |
语音消息的附件内容NIMAudioAttachment
派生自NIMMessageAttachment,其自有字段说明
类型 | 参数 | 字段 |
---|---|---|
int | Duration | 语音消息时长 |
- 示例
//以点对消息为例,测试账号test1
NIMAudioMessage msg = new NIMAudioMessage();
msg.ReceiverID = "test1";
msg.SessionType = NIMSessionType.kNIMSessionTypeP2P;
msg.TimeStamp = 1520500638234;//当前UNIX时间戳 毫秒
msg.ClientMsgID = "uuid";//生成自己的唯一uuid;
//如果是发送本地文件,请给LocalFilePath赋值
msg.LocalFilePath="c:\\audio.aac";
//组装附件内容
NIMAudioAttachment attachment = new NIMAudioAttachment();
attachment.MD5 = "0ca175b9c0f726a831d895e269332461";
attachment.Size = 409600;
attachment.RemoteUrl="http://xxxxxx/audio.aac";//如果发送本地文件,此处填空
attachment.DisplayName="audio";
attachment.FileExtension="aac";
//设置时长
attachment.Duration = 8000;//毫秒
msg.AudioAttachment = attachment;
//其他消息设置
...
NIM.TalkAPI.SendMessage(msg,null);
视频消息
首先创建视频消息的内容,按需填写必要的消息设置,然后通过SendMessage
接口发送。发送本地视频文件会自动上传。
NIMVideoMessage
派生自NIMIMMessage,继承所有的父类字段
类型 | 参数 | 字段 |
---|---|---|
NIMMessageType | MessageType | 指定为NIMMessageType.kNIMMessageTypeVideo |
NIMVideoAttachment | VideoAttachment | 视频附件内容 |
视频消息的附件内容NIMVideoAttachment
派生自NIMMessageAttachment,其自有字段说明
类型 | 参数 | 字段 |
---|---|---|
int | Duration | 语音消息时长 |
int | Width | 图片宽度 |
int | Height | 图片高度 |
- 示例
//以点对消息为例,测试账号test1
NIMVideoMessage msg = new NIMVideoMessage();
msg.ReceiverID = "test1";
msg.SessionType = NIMSessionType.kNIMSessionTypeP2P;
msg.TimeStamp = 1520500638234;//当前UNIX时间戳 毫秒
msg.ClientMsgID = "uuid";//生成自己的唯一uuid;
//如果是发送本地文件,请给LocalFilePath赋值
msg.LocalFilePath="c:\\video.mp4";
//组装附件内容
NIMVideoAttachment attachment = new NIMVideoAttachment();
attachment.MD5 = "0ca175b9c0f726a831d895e269332461";
attachment.Size = 409600;
attachment.RemoteUrl="http://xxxxxx/video.mp4";//若发送的是本地文件,此处填空
attachment.DisplayName="video";
attachment.FileExtension="mp4";
//设置视频长度 和 图像长宽
attachment.Duration = 8000;//毫秒
attachment.Width = 800;
attachment.Height = 600;
msg.VideoAttachment = attachment;
//其他消息设置
...
NIM.TalkAPI.SendMessage(msg,null);
地理位置
首先创建地理位置息的内容,按需填写必要的消息设置,然后通过SendMessage
接口发送。
NIMLocationMessage
地理位置消息
类型 | 参数 | 字段 |
---|---|---|
NIMMessageType | MessageType | 指定为NIMMessageType.kNIMMessageTypeLocation |
NIMLocationMsgInfo | LocationInfo | 地理位置附件内容 |
地理位置消息的附件内容NIMLocationMsgInfo
字段说明
类型 | 参数 | 字段 |
---|---|---|
string | Description | 地理位置描述 |
int | Latitude | 纬度 |
int | Longitude | 经度 |
- 示例
//以点对消息为例,测试账号test1
NIMLocationMessage msg = new NIMLocationMessage();
msg.ReceiverID = "test1";
msg.SessionType = NIMSessionType.kNIMSessionTypeP2P;
msg.TimeStamp = 1520500638234;//当前UNIX时间戳 毫秒
msg.ClientMsgID = "uuid";//生成自己的唯一uuid;
//组装附件内容
NIMLocationMsgInfo attachment = new NIMLocationMsgInfo();
//设置地理名称和经纬度
attachment.Description = "杭州";
attachment.Latitude = 30.3;
attachment.Longitude = 120.2;
msg.LocationInfo = attachment;
//其他消息设置
...
NIM.TalkAPI.SendMessage(msg,null);
文件消息
首先创建文件消息的内容,按需填写必要的消息设置,然后通过SendMessage
接口发送。
NIMFileMessage
派生自NIMIMMessage,继承所有的父类字段
类型 | 参数 | 字段 |
---|---|---|
NIMMessageType | MessageType | 指定为NIMMessageType.kNIMMessageTypeFile |
NIMMessageAttachment | FileAttachment | 文件附件内容,详见NIMMessageAttachment |
- 示例
//以点对消息为例,测试账号test1
NIMVideoMessage msg = new NIMVideoMessage();
msg.ReceiverID = "test1";
msg.SessionType = NIMSessionType.kNIMSessionTypeP2P;
msg.TimeStamp = 1520500638234;//当前UNIX时间戳 毫秒
msg.ClientMsgID = "uuid";//生成自己的唯一uuid;
msg.LocalFilePath="c:\\文档.doc";
//组装附件内容
NIMMessageAttachment attachment = new NIMMessageAttachment();
attachment.MD5 = "0ca175b9c0f726a831d895e269332461";
attachment.Size = 409600;
attachment.DisplayName="文档";
attachment.FileExtension="doc";
msg.FileAttachment = attachment;
//其他消息设置
...
NIM.TalkAPI.SendMessage(msg,null);
提示消息
首先创建提示消息的内容,按需填写必要的消息设置,然后通过SendMessage
接口发送。如果开发者不需要发送到服务器,则可以使用插入本地消息接口,将消息存入数据库,并更新会话类表。
NIMTipMessage
提示消息
NIMTipMessage
派生自NIMIMMessage,继承所有的父类字段
类型 | 参数 | 字段 |
---|---|---|
NIMMessageType | MessageType | 指定为NIMMessageType.kNIMMessageTypeTips |
string | TextContent | 文本内容 |
string | Attachment | 提示消息附件内容,自定义的json字符串,自行解析和使用 |
- 示例
//以群消息为例,测试群id为122222
NIMTipMessage msg = new NIMTipMessage();
msg.ReceiverID = "122222";
msg.SessionType = NIMSessionType.kNIMSessionTypeTeam;
msg.TimeStamp = 1520500638234;//当前UNIX时间戳 毫秒
msg.ClientMsgID = "uuid";//生成自己的唯一uuid;
//组装附件内容
msg.TextContent = "这是一条提示消息";
msg.Attachment = "attachment";//自定义的附件内容,自行解析使用。
//其他消息设置
...
用法1:
//发送消息给对方
NIM.TalkAPI.SendMessage(msg,null);
用法2:
//如果不需要发送给对方,仅仅是本地插入,则使用插入历史记录接口
NIM.Messagelog.MessagelogAPI.WriteMsglog("122222",true, msg, (code, msgId)=>
{
...
});
自定义消息
首先创建自定义消息消息的内容,按需填写必要的消息设置,然后通过SendMessage
接口发送。除SDK 不负责定义和解析自定义消息的具体内容,解释工作由开发者完成。SDK 会将自定义消息存入消息数据库,会和内建消息一并展现在消息记录中。
NIMCustomMessage
自定义消息
NIMCustomMessage<T>
派生自NIMIMMessage,继承所有的父类字段
类型 | 参数 | 字段 |
---|---|---|
NIMMessageType | MessageType | 指定为NIMMessageType.kNIMMessageTypeCustom |
string | Extention | 文本内容 |
T | CustomContent | 自定义消息附件内容,自定义的json字符串,自行解析和使用,T为可序列化为json的自定义对象,T继承自NimJsonObject |
- 示例
//自行定义自定义类
public class CustomMessageAttachment:NimJsonObject<CustomMessageAttachment>
{
//自定义字段1
[JsonProperty("customFiled1")]
public string customFiled1 {set;get;}
//自定义字段2
[JsonProperty("customFiled2")]
public int customFiled2 {set;get;}
}
//以群消息为例,测试群id为122222
NIMCustomMessage<CustomMessageAttachment> msg = new NIMCustomMessage<CustomMessageAttachment>();
msg.ReceiverID = "122222";
msg.SessionType = NIMSessionType.kNIMSessionTypeTeam;
msg.TimeStamp = 1520500638234;//当前UNIX时间戳 毫秒
msg.ClientMsgID = "uuid";//生成自己的唯一uuid;
//组装附件内容
CustomMessageAttachment attachment = new CustomMessageAttachment();
attachment.customFiled1 = "自定义内容";
attachment.customFiled2 = 10;
msg.Extention = "自定义消息内容";
msg.CustomContent = attachment;//自定义的附件内容,自行解析使用。
//其他消息设置
...
NIM.TalkAPI.SendMessage(msg,null);
群组强推消息
向群组发送强推消息,以@提醒指定的人或者所有人
TeamForecePushMessage
参数说明
类型 | 参数 | 说明 |
---|---|---|
List |
ReceiverList | 强制推送@提醒的人员账号集合 |
bool | IsForcePush | 是否强制推送 |
string | Content | 强制推送的内容 |
- API 原型
public static void SendTeamFrocePushMessage(NIMIMMessage message, TeamForecePushMessage forceMsg, ReportUploadProgressDelegate action = null);
- 参数说明
参数 | 说明 |
---|---|
message | 消息内容,同发送消息 |
forceMsg | 强推消息设置,详见TeamForecePushMessage |
action | 上传文件回调通知,不需要自动上传的消息,填null |
- 示例
//以群消息为例,测试群账号1222222
NIMTextMessage msg = new NIMTextMessage();
msg.ReceiverID = "1222222";
msg.SessionType = NIMSessionType.kNIMSessionTypeTeam;
msg.TimeStamp = 1520500638234;//当前UNIX时间戳 毫秒
msg.ClientMsgID = "uuid";//生成自己的唯一uuid;
msg.TextContent = "这是一条文本消息。";
//其他消息设置
...
//强推test1,test2,且为群成员
TeamForecePushMessage forePush = new TeamForecePushMessage();
forePush.IsForcePush = true;
forePush.ReceiverList = new List<string>();
forePush.ReceiverList.add("test1");
forePush.ReceiverList.add("test2");
forePush.Content = "这是一条强推消息";
NIM.TalkAPI.SendTeamFrocePushMessage(msg,forePush,null);
发送结果通知
通知发送成功、失败,也可以从结果获的是否命中客户端发垃圾标识。
MessageAck
参数说明
类型 | 参数 | 说明 |
---|---|---|
string | TalkId | 会话id |
string | MsgId | 消息id |
ResponseCode | Response | 错误码 |
bool | ClientAntiSpam | 是否命中客户端反垃圾,1:是, 0:否 |
- API 原型
void OnSendMessageResult(object sender,MessageArcEventArgs args)
{
....
}
//监听事件
NIM.TalkAPI.OnSendMessageCompleted += OnSendMessageResult;
//取消监听
NIM.TalkAPI.OnSendMessageCompleted -= OnSendMessageResult;
停止发送消息
取消发送消息,目前支持文件类型消息,在文件上传过程中可以终止发送。如果文件已经上传完成,则无法中断。
- API 原型
public static void StopSendMessage(NIMIMMessage message, ReportUploadProgressDelegate action = null);
- 参数说明
参数 | 说明 |
---|---|
message | 所要终止发送的消息结构 |
action | 预留,暂不使用 |
- 示例
//目前支持文件类型,必填
NIMIMMessage msg = new NIMIMMessage();
msg.MessageType = NIMMessageType.kNIMMessageTypeFile;
msg.ClientMsgID = "uuid";//需要中断的消息唯一uuid,必填
//中断发送
NIM.TalkAPI.StopSendMessage(msg,null);
消息接收
开发者在登陆SDK之前需要提前注册消息接收的事件监听。消息接收包括在线消息的接收,也包括离线、同步、漫游消息等的接收。如果接收到多媒体消息,SDK 默认会在后台自动下载附件。如果是语音消息,直接下载文件,如果是图片消息,下载缩略图文件,可以通过下载接口去获取原图。
NIMReceivedMessage
参数说明
类型 | 参数 | 说明 |
---|---|---|
ResponseCode | ResponseCode | 错误码 |
NIMIMMessage | MessageContent | 消息内容,详见NIMIMMessage,不同的消息类型,不同的定义,参考发送消息 |
NIMMessageFeature | Feature | 详见NIMMessageFeature |
TeamForecePushMessage | TeamPushMsg | 群组强推消息内容,详见TeamForecePushMessage |
1. 在线消息接收
- API 原型
public static EventHandler<NIMReceiveMessageEventArgs> OnReceiveMessageHandler;
- 示例
void OnMessageReceived(object sender,NIMReceiveMessageEventArgs args)
{
if (args != null && args.Message != null) {
//处理各种类型的消息
if (args.Message.MessageContent.MessageType == NIMMessageType.kNIMMessageTypeText) {
//...
}
else if (args.Message.MessageContent.MessageType == NIMMessageType.kNIMMessageTypeAudio) {
//...
}
else if (args.Message.MessageContent.MessageType == NIMMessageType.kNIMMessageTypeVideo) {
//...
}
else if (args.Message.MessageContent.MessageType == NIMMessageType.kNIMMessageTypeImage)
{
//...
}
else
{
//...
}
}
//....
}
//监听事件
NIM.TalkAPI.OnReceiveMessageHandler += OnMessageReceived;
//取消监听
NIM.TalkAPI.OnReceiveMessageHandler -= OnMessageReceived;
2. 离线同步漫游消息接收
接收批量消息,如离线,漫游,同步的批量消息。如果在注册了接收消息回调的同时也注册了该批量接口,当有批量消息时,会改走这个接口通知应用层,例如登录后接收到的离线消息等,必须在登录之前注册事件监听。
- API 原型
public static void RegReceiveBatchMessagesCb(ReceiveBatchMesaagesDelegate cb)
- 参数说明
参数 | 说明 |
---|---|
cb | 批量消息的回调 |
- 示例
void OnBatchMessagesReceived(List<NIMReceivedMessage> msgsList)
{
if (msgsList != null)
{
//遍历数组,处理消息
foreach (NIMReceivedMessage v in msgsList)
{
//....
}
}
}
//监听事件
NIM.TalkAPI.RegReceiveBatchMessagesCb(OnBatchMessagesReceived);
//取消监听
NIM.TalkAPI.RegReceiveBatchMessagesCb(null);
3. 过滤群通知消息
注册接收群通知是否需要过滤的回调。如果在此回调中返回true,则SDK认为此通知已被处理,SDK将不再通过接收消息通道下发,也不会保存本地数据库。
- API 原型
public static void RegTeamNotificationFilterCb(TeamNotificationFilterDelegate action);
- 参数说明
参数 | 说明 |
---|---|
action | 过滤群通知消息的回调 |
- 示例
bool OnTeamNotificationFiltered(NIMIMMessage msg,string jsonExtension)
{
if (msg == null)
return false;
//...
//如果处理过滤了通知消息,返回true,否则返回false;
return true;
}
//监听事件
NIM.TalkAPI.RegTeamNotificationFilterCb(OnBatchMessagesReceived);
//取消监听
NIM.TalkAPI.RegTeamNotificationFilterCb(null);
转发消息
用户通过构造API获取新的消息对象,然后调用发送消息接口。
- API 原型
public static NIMIMMessage CreateRetweetMessage(NIMIMMessage srcMsg, NIMMessageSetting msgSetting, string msgId, string sessionId, Session.NIMSessionType sessionType, long timetag);
- 参数说明
参数 | 说明 |
---|---|
srcMsg | 接收到的消息内容,内容同NIMIMMessage |
msgSetting | 消息设置,详见消息设置说明 |
msgId | 生成的新的消息uuid |
sessionId | 转发的对方id,个人账号或者群id |
sessionType | 会话类型,0:点对点消息 1: 群消息 |
timetag | 当前的时间戳(毫秒) |
- 示例
//假设srcMsg已经发送或者收到的消息体。
NIMIMMessage srcMsg;
//按需进行消息设置
NIMMessageSetting msgSetting = new NIMMessageSetting();
msgSettting.ServerSaveHistory = true;
...
//通过srcMsg生成一个新的消息。
long timeNow = 1520500638234;//当前UNIX时间戳 毫秒
string sessionid = "1222222";
string clientMsgID = "uuid2";//生成新的唯一uuid;
NIMSessionType sessionType = NIMSessionType.kNIMSessionTypeTeam;
NIMIMMessage newMsg = NIM.TalkAPI.CreateRetweetMessage(srcMsg,msgSettting,clientMsgID,sessionid,sessionType,timeNow);
NIM.TalkAPI.SendMessage(newMsg,null);
消息撤回
用户通过发送消息发的消息或者群主、管理员可以通过该接口执行撤回操作(不支持聊天室消息),撤回操作一般有时限限制(该限制为全局的APP设置),超过限制返回508。 开发者通过注册撤回消息通知回调,接收其他端的撤回消息的通知,收到通知后SDK会标记主动在消息历史中标记该条消息为删除状态,同时开发者根据自身需求,删除界面上显示的消息,甚至插入一条提示,IM Demo有开发示例。
RecallNotification
参数说明
类型 | 参数 | 说明 |
---|---|---|
NIMSessionType | SessionType | 会话类型 0:点对点消息 1 :群消息 |
string | SenderId | 消息发送方ID |
string | ReceiverId | 消息接收方ID |
string | MsgId | 消息唯一id |
string | NOtify | 自定义通知文案 |
long | Timetag | 撤回操作的时间戳(毫秒) |
NIMMessageFeature | Feature | 撤回消息的类型,详见NIMMessageFeature |
bool | MsgLocalExist | 撤回的消息本地是否存在,比如对方离线时发一条消息又撤回,对方上线收到离线撤回通知该tag为false |
long | MsgTimetag | 撤回的消息的时间戳(毫秒)(毫秒) |
string | Nickname | 要撤回消息的发送者昵称 |
string | Operator | 操作者ID |
主动撤回消息
撤回已发送成功的消息,此功能依赖本地历史记录,需要通过消息id查询本地消息记录,如果无法从本地找到消息记录,将无法撤回。
- API 原型
public static void RecallMessage(string msgId, string notify, RecallMessageDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
msgId | 需要撤回的消息uuid |
notify | 自定义通知 |
cb | 撤回消息的回调通知 |
- 示例
//假设msgId为已经发送过的消息id。
NIM.TalkAPI.RecallMessage(msgId,"这是一条 recall notify",(result, notify)=>{
...
});
消息撤回的通知
通知用户消息已被撤回,该通知支持离线。
- API 原型
public static void RegRecallMessageCallback(RecallMessageDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
action | 消息撤回的通知的回调 |
- 示例
void OnRecallMsgResult(ResponseCode result, RecallNotification[] notify)
{
//处理界面
//....
}
//监听事件
NIM.TalkAPI.RegRecallMessageCallback(OnRecallMsgResult);
//取消监听
NIM.TalkAPI.RegRecallMessageCallback(null);
已读回执
网易云信提供点对点消息的已读回执。注意:此功能仅对 P2P 消息中有效。
在会话界面中调用发送已读回执的接口并传入最后一条消息,即表示这之前的消息都已读,对端将收到此回执。
发送消息已读回执的一般场景:
1. 进入 P2P 聊天界面(如果没有收到新的消息,反复进入调用发送已读回执接口, SDK 会自动过滤,只会发送一次给网易云信服务器)。
2. 处于聊天界面中,收到当前会话新消息时。
发送已读回执
- API 原型
public static void SendReceipt(NIMIMMessage msg, MsglogStatusChangedDelegate cb, string jsonExtension = null);
- 参数说明
参数 | 说明 |
---|---|
msg | 收到的消息内容 |
cb | 发送消息已读会之后,消息状态变化的回调通知 |
jsonExtension | 扩展字段,预留 |
- 示例
//假设 msg为需要发送已读回执的消息。
NIM.Messagelog.MessagelogAPI.SendReceipt(msg,(res,result)=>{
//result为json字符串,示例:[{"talk_id":"test1","msg_timetag":"1520500638234","status":2}]
//...
},null);
监听已读回执通知
已读回执也是消息状态的变化,可查阅全局消息状态变更通知
监听全员广播通知
接收全员广播通知。分单个通知和批量全员广播通知,一般而言,批量通知是登陆时下发的离线广播、同步广播、漫游广播通知等。
NIMBroadcastMessage
广播通知参数说明
类型 | 参数 | 说明 |
---|---|---|
long | MsgID | 通知消息id |
string | Sender | 发送者账号,可能为空 |
long | Timetag | 通知消息UNIX时间戳,毫秒 |
string | Body | 通知内容 |
1. 单条全员广播通知 接收广播消息回调 , 建议全局注册,统一接受回调后分发消息到具体的会话。
- API 原型
public static void RegReceiveBroadcastCb(ReceiveBroadcastDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
cb | 通知的回调 |
- 示例
void OnReceiveBroadcastMsg(NIMBroadcastMessage msgs)
{
//处理广播通知
...
}
//监听事件
NIM.TalkAPI.RegReceiveBroadcastCb += OnReceiveBroadcastMsg;
//取消监听
NIM.TalkAPI.RegReceiveBroadcastCb -= OnReceiveBroadcastMsg;
2. 批量全员广播通知
接收批量广播消息回调。如果在注册了接收消息回调的同时也注册了该批量接口,当有批量消息时,会改走这个接口通知应用层,例如登录后接收到的离线消息等。
- API 原型
public static void RegReceiveBroadcastMsgsCb(ReceiveBroadcastMsgsDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
cb | 批量消息的回调 |
- 示例
void OnReceiveBroadcastMsgs(List<NIMBroadcastMessage> msgs)
{
if (msgs != null)
{
//遍历数组,处理广播
foreach (var v in msgs)
{
....
}
}
}
//监听事件
NIM.TalkAPI.RegReceiveBroadcastMsgsCb(OnReceiveBroadcastMsgs);
//取消监听
NIM.TalkAPI.RegReceiveBroadcastMsgsCb(null);
从消息附件中获取本地路径
从消息的中获取附件(图片、语音、视频等)的本地路径。如果预下载的是缩略图,且没下载过原图,此获得的路径文件可能不存在,需要开发者调用nim.Nos.NosAPI.DownloadMedia
去下载。如果全局设置预加载的是缩略图,则开发者若想下载原图,在传入消息内容前,先将LocalFilePath
字段设为空或者自定义的保存路径。
- API 原型
public static string GetAttachmentPathFromMsg(NIMIMMessage msg);
- 参数说明
参数 | 说明 |
---|---|
msg | 所要获取的消息内容 |
- 示例
//假设msg为需要获取的消息
string filePath = NIM.Talk.TalkAPI.GetAttachmentPathFromMsg(msg);
//如果需要原图,xu下载原图
msg.LocalFilePath = null; //此处置空 或者设置为自定义的保存路径;
nim.Nos.NosAPI.DownloadMedia (msg, (rescode, filepath, callId, resId)=>
{
//通知完成
...
},
(prgData)=>
{
//通知进度
...
});
获取图片缩略图
网易云信 IM SDK 目前默认收到图片消息后会提前下载原图缓存到本地,如果开发者想控制下载图片的质量,可以通过初始化SDK时设置kNIMPreloadImageQuality
来控制图片质量,设置kNIMPreloadImageResize
来控制图片长宽, IM Demo开发范例中默认下载原图,所以开发者如果想基于IM Demo工程源码开发,需要在图片预览环节或者其他需要显示原图的地方自行下载原图。
以下但不限于以下场景下开发者可以自行下载缩略图:
- 对图片尺寸有特殊要求
- 聊天室接收图片消息
目前SDK提供两种获取缩略图方案:
-
基于修改图片质量
当用户收到图片消息时,附件
kNIMMsgKeyAttach
(聊天室消息为kNIMChatRoomMsgKeyAttach
)内容解析出来会带有图片下载地址,通过拼接下载接口参数获取指定质量的图片: http(s)://?imageView&quality=N;http(s)://xxx为图片下载地址;N为图片质量,范围为0-100。 -
基于长宽对图片进行 内缩略 (原图等比例缩略,缩略后的图片“一边等于请求长度,另一边小于等于请求长度”)
当用户收到图片消息时,附件kNIMMsgKeyAttach(聊天室消息为kNIMChatRoomMsgKeyAttach)内容解析出来会带有图片下载地址,通过拼接下载接口参数获取缩略图: http(s)://xxx?imageView&thumbnail=XxY;http(s)://xxx为图片下载地址;X为宽度,Y为高度,中间为小写x,宽度和高度取值范围0-4096。
几种参数变化: 1、XxY:普通缩略(内缩略) 2、Xx0:限定宽度,高度自适应(内缩略) 3、0xY:限定高度,宽度自适应(内缩略)
目前IM Demo工程在消息显示图片的时候对图片进行了压缩处理,开发者可以参考bubble_image.cpp