消息收发

消息功能概述

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)的支持,也可以发送自定义的消息。同时我们也提供了停止发送消息接口,该接口目前主要用于在文件消息上传过程中终止消息发送。

public static void SendMessage(NIMIMMessage message, ReportUploadProgressDelegate action = null);
参数 说明
message 消息内容,详见NIMIMMessage
action 上传进度回调通知,如果存在图片、音视频文件 等自定上传的附件内容时,会通知上传进度

消息设置

发送消息还提供了以下消息属性设置(对应NIMIMMessage中的字段):

针对群组消息,提供强推属性设置(可以用于实现@功能等):

反垃圾字段:

文本消息

首先创建文本消息的内容,按需填写必要的消息设置,然后通过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.AntiSpanEnabled = 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 强制推送的内容
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:否
void OnSendMessageResult(object sender,MessageArcEventArgs args)
{
    ....
}

//监听事件
NIM.TalkAPI.OnSendMessageCompleted += OnSendMessageResult;

//取消监听
NIM.TalkAPI.OnSendMessageCompleted -= OnSendMessageResult;

停止发送消息

取消发送消息,目前支持文件类型消息,在文件上传过程中可以终止发送。如果文件已经上传完成,则无法中断。

 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. 在线消息接收

public static EventHandler<NIMReceiveMessageEventArgs> OnReceiveMessageHandler;
void OnMessageReceived(object sender,MessageArcEventArgs 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. 离线同步漫游消息接收

接收批量消息,如离线,漫游,同步的批量消息。如果在注册了接收消息回调的同时也注册了该批量接口,当有批量消息时,会改走这个接口通知应用层,例如登录后接收到的离线消息等,必须在登录之前注册事件监听。

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将不再通过接收消息通道下发,也不会保存本地数据库。

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获取新的消息对象,然后调用发送消息接口。

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查询本地消息记录,如果无法从本地找到消息记录,将无法撤回。

public static void RecallMessage(string msgId, string notify, RecallMessageDelegate cb);
参数 说明
msgId 需要撤回的消息uuid
notify 自定义通知
cb 撤回消息的回调通知
//假设msgId为已经发送过的消息id。
NIM.TalkAPI.RecallMessage(msgId,"这是一条 recall notify",(result, notify)=>{
    ...
});

消息撤回的通知

通知用户消息已被撤回,该通知支持离线。

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. 处于聊天界面中,收到当前会话新消息时。

发送已读回执

 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. 单条全员广播通知 接收广播消息回调 , 建议全局注册,统一接受回调后分发消息到具体的会话。

 public static void RegReceiveBroadcastCb(ReceiveBroadcastDelegate cb);
参数 说明
cb 通知的回调
void OnReceiveBroadcastMsg(NIMBroadcastMessage msgs)
{
    //处理广播通知
    ...
}

//监听事件
NIM.TalkAPI.RegReceiveBroadcastCb += OnReceiveBroadcastMsg;

//取消监听
NIM.TalkAPI.RegReceiveBroadcastCb -= OnReceiveBroadcastMsg;

2. 批量全员广播通知

接收批量广播消息回调。如果在注册了接收消息回调的同时也注册了该批量接口,当有批量消息时,会改走这个接口通知应用层,例如登录后接收到的离线消息等。

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字段设为空或者自定义的保存路径。

public static string GetAttachmentPathFromMsg(NIMIMMessage msg);
参数 说明
msg 所要获取的消息内容
//假设msg为需要获取的消息
string filePath = NIM.Talk.TalkAPI.GetAttachmentPathFromMsg(msg);

//下载原图
msg.LocalFilePath = null; //此处置空 或者设置为自定义的保存路径;
nim.Nos.NosAPI.DownloadMedia (msg, (rescode, filePath, callId, resId)=>
{
    //通知完成
    ...
},
(prgData)=>
{
    //通知进度
    ...
});

获取图片缩略图

网易云通信SDK目前默认收到图片消息后会提前下载原图缓存到本地,如果开发者想控制下载图片的质量,可以通过初始化SDK时设置kNIMPreloadImageQuality来控制图片质量,设置kNIMPreloadImageResize来控制图片长宽, IM Demo开发范例中默认下载原图,所以开发者如果想基于IM Demo工程源码开发,需要在图片预览环节或者其他需要显示原图的地方自行下载原图。

以下但不限于以下场景下开发者可以自行下载缩略图:

目前SDK提供两种获取缩略图方案:

目前IM Demo工程在消息显示图片的时候对图片进行了压缩处理,开发者可以参考bubble_image.cpp