系统通知

除消息通道外,SDK 还提供系统通知这种通道用于消息之外的通知分发。目前有两种类型:内置系统通知和自定义系统通知。现在主要包括群变动的相关通知,例如入群申请,入群邀请等,如果第三方应用还托管了好友关系,好友的添加、删除也是这个类型的通知。系统通知由 SDK 负责接收和存储,并提供较简单的未读数管理。发送自定义系统通知可以设置推送相关的参数。

注意:这里的入群申请、入群邀请的通知要区别于群操作的结果通知,比如创建群,解散群、踢人、拉人等群操作的通知。群操作的通知是通过IM消息通道来下发的(详见群通知事件

NIMSysMessage参数说明

类型 参数 说明
ResponseCode Response 通知错误码 详见 ResponseCode
NIMMessageFeature Feature 通知属性,区分离线,多端同步,漫游通知等等,详见NIMMessageFeature
int TotalUnread 总计的通知未读数
NIMSysMessageContent Content 通知内容,详见NIMSysMessageContent

NIMSysMsgType通知类型说明

枚举 说明
kNIMSysMsgTypeTeamApply 0 申请入群
kNIMSysMsgTypeTeamReject 1 拒绝申请入群
kNIMSysMsgTypeTeamInvite 2 邀请入群
kNIMSysMsgTypeTeamInviteReject 3 拒绝邀请入群
kNIMSysMsgTypeFriendAdd 5 加好友
kNIMSysMsgTypeFriendDel 6 删除好友
kNIMSysMsgTypeCustomP2PMsg 100 点对点透传消息
kNIMSysMsgTypeCustomTeamMsg 101 群透传消息
kNIMSysMsgTypeUnknown 1000 未知类型,作为默认

NIMSysMessageContent参数说明

类型 参数 说明
long Timetag 时间戳,选填
NIMSysMsgType MsgType 通知的类型,如申请入群、邀请入群、添加好友等等,详见NIMSysMsgType
string ReceiverId 接收者id,如果是个人,则是对方用户id,如果是群,则是群id,必填
string SenderId 发送者id,选填,如发送自定义通知消息时,可选填
string Message 通知附言,按需填写
string Attachment 附件,按需填写,类似于普通IM消息的附件内容,查看发送消息
long Id 服务器消息id(自定义通知消息,必须填0),发送方不需要填写
int SupportOffline (选填)自定义通知消息是否存离线:0-只发给在线用户,1-可发给离线用户
string PushContent (选填)自定义通知消息推送文本,不填则不推送
NIMSysMsgStatus Status 本地定义的系统消息状态,见NIMSysMsgStatus,发送方不需要填写
int NeedPush (可选)是否需要推送, 0:不需要,1:需要,默认填1,配合PushContent使用
int NeedPushCount (可选)推送是否要做消息计数(角标), 0:不需要,1:需要,默认填1,配合PushContent使用
int NeedPushPrefix (可选)推送是否需要推送昵称,0:不需要,1:需要,默认填0,配合NeedPush使用
JsonExtension CustomPushContent (可选)第三方自定义的推送负载内容,必须为可以解析为json的非格式化的字符串,长度2048
bool AntiSpamEnabled 是否需要过易盾反垃圾,默认false
string AntiSpamContent (可选)开发者自定义的反垃圾字段,长度限制:5000字符,配合AntiSpamEnabled使用

推送、反垃圾等等消息设置类似IM的消息设置

接收系统通知

注册/注销系统消息接收事件。需要在登录之前先注册。为了保证整个程序逻辑的一致性,APP 需要针对不同类型的系统通知进行相应的操作。

public static EventHandler<NIMSysMsgEventArgs> ReceiveSysMsgHandler;
//回调
void OnReceiveSysMessage(object sender, NIMSysMsgEventArgs e)
{
    //处理通知消息
    ...
}
//监听事件
NIM.SysMessage.SysMsgAPI.ReceiveSysMsgHandler += OnReceiveSysMessage;

//取消监听
NIM.SysMessage.SysMsgAPI.ReceiveSysMsgHandler -= OnReceiveSysMessage;

发送自定义系统通知

除了内置系统通知外,SDK 也额外提供了自定义系统给开发者,方便开发者进行业务逻辑的通知。这个通知既可以由客户端发起也可以由开发者服务器发起。

客户端发起的自定义通知,该类型通知格式由开发者自定义(Attachment ),SDK 仅负责发送、接收,支持在线或离线发送,且支持点对点通知和群通知,不做任何解析,也不会存储,因此也不会在聊天记录中体现,可以使用的场景例如发送正在输入的状态等。

此外,自定义系统通知内容(NIMSysMessageContent)还提供了属性设置如下:

SDK 并不负责自定义通知的持久化,APP 需要根据自己的业务逻辑按需进行解析和持久化的工作。

 public static void SendCustomMessage(NIMSysMessageContent content);
参数 说明
content 消息内容,详见NIMSysMessageContent
//以测试账号test1为例;
NIMSysMessageContent content = new NIMSysMessageContent();

content.ReceiverId = "test1";
content.MsgType = NIMSysMsgType.kNIMSysMsgTypeCustomP2PMsg;

JsonExtension attach = new JsonExtension();
attach.AddItem("id", "2");
attach.AddItem("content", "attachment");
content.Attachment = attach.Value;

content.Timetag = 1520423612222;//当前时间UNIX时间戳 13位(毫秒)

//存离线
content.SupportOffline = NIMMessageSettingStatus.kNIMMessageStatusSetted;

//推送并计数
content.NeedPush = NIMMessageSettingStatus.kNIMMessageStatusSetted;
content.NeedPushCount = NIMMessageSettingStatus.kNIMMessageStatusSetted;

//推送通知有前缀显示,比如mmm:通知内容
content.NeedPushPrefix = NIMMessageSettingStatus.kNIMMessageStatusNotSet;

//推送消息的内容
content.PushContent = "这是一条推送通知消息";
//可以添加推送负载信息
JsonExtension push_content = new JsonExtension();
push_content.AddItem("Content", "这是推送负载信息");
content.CustomPushContent = push_content;


content.ClientMsgId = "uuid";//需要生成唯一uuid

....

//发送消息
NIM.SysMessage.SysMsgAPI.SendCustomMessage(content);

发送自定义系统通知结果

发送自定义通知消息结果通知。

public static EventHandler<NIMSysMsgEventArgs> SendSysMsgHandler;
//回调
void OnSendSysMsgHandler(object sender, NIMSysMsgEventArgs e)
{
    //处理通知消息
    ...
}
//监听事件
NIM.SysMessage.SysMsgAPI.SendSysMsgHandler += OnSendSysMsgHandler;

//取消监听
NIM.SysMessage.SysMsgAPI.SendSysMsgHandler -= OnSendSysMsgHandler;

通知消息管理

SDK提供接口查询历史消息,查询消息未读数、设置已读、删除通知等功能支持

查询系统通知

查询本地系统消息(按时间逆序起查,逆序排列)。

NIMSysMsgQueryResult参数说明

类型 参数 说明
int count 消息总数
int UnreadCount 未读通知消息总数
NIMSysMessageContent[] MsgCollection 通知消息集合,详见NIMSysMessageContent
 public static void QueryMessage(int limit, long lastTimetag, QuerySysMsgResult cb);
参数 说明
limit 一次查询数量,建议20
lastTimetag 上次查询最后一条消息的时间戳(按时间逆序起查,即最小的时间戳),起始查询填0
cb 操作结果回调
//起始查询
NIM.SysMessage.SysMsgAPI.QueryMessage(20,0,(result)=>{
    ...
});

//假设起始查询的最后一条消息时间戳是 '1520423612222'
NIM.SysMessage.SysMsgAPI.QueryMessage(20,1520423612222,(result)=>{
    ...
});

查询未读消息数

  public static void QueryUnreadCount(CommomOperateResult cb);
参数 说明
cb 操作结果回调
//查询未读通知数
NIM.SysMessage.SysMsgAPI.QueryUnreadCount((code, count)=>{
    ...
});

设置消息状态

可以将消息状态设置为通过,拒绝,已读,已失效等状态。

NIMSysMsgStatus枚举说明

枚举 说明
kNIMSysMsgStatusNone 0 默认,未读
kNIMSysMsgStatusPass 1 收到消息,通过
kNIMSysMsgStatusDecline 2 收到消息,拒绝
kNIMSysMsgStatusRead 3 收到消息,已读
kNIMSysMsgStatusDeleted 4 已删
kNIMSysMsgStatusInvalid 5 已失效
 public static void SetMsgStatus(long msgId, NIMSysMsgStatus status, OperateSysMsgExternDelegate cb);
参数 说明
msgId 消息id
status 消息状态,详见NIMSysMsgStatus
cb 操作结果回调
//设置消息状态
long msgId = 213213111;
NIM.SysMessage.SysMsgAPI.SetMsgStatus(msgId,NIMSysMsgStatus.kNIMSysMsgStatusPass,(code, msg_id, unread_count, json_extension, user_data)=>{
    if (code == 200)//成功
    {
        ...
    }
});

按消息类型批量设置消息状态

 public static void SetMsgStatusByType(NIMSysMsgType type, NIMSysMsgStatus status, OperateSysMsgDelegate cb);
参数 说明
type 消息类型,详见NIMSysMsgType
status 消息状态,详见NIMSysMsgStatus
cb 操作结果回调
//按类型设置消息状态
NIM.SysMessage.SysMsgAPI.SetMsgStatusByType(NIMSysMsgType.kNIMSysMsgTypeTeamApply,NIMSysMsgStatus.kNIMSysMsgStatusPass,(code, unread_count, json_extension, user_data)=>{
    if (code == 200)//成功
    {
        ...
    }
});

设置全部消息已读

  public static void SetAllMsgRead(OperateSysMsgDelegate cb);
参数 说明
cb 操作结果回调
//设置全部消息已读
NIM.SysMessage.SysMsgAPI.SetAllMsgRead((code, unread_count, json_extension, user_data)=>{
    if (code == 200)//成功
    {
        ...
    }
});

删除单条通知消息

  public static void DeleteByMsgId(long msgId, OperateSysMsgExternDelegate cb);
参数 说明
msgId 消息id
cb 操作结果回调
//删除消息
long msgId = 21321311;
NIM.SysMessage.SysMsgAPI.DeleteByMsgId(msgId,(code, msgId,unread_count, json_extension, user_data)=>{
    if (code == 200)//成功
    {
        ...
    }
});

按消息类型批量删除消息

  public static void DeleteMsgByType(NIMSysMsgType type, OperateSysMsgDelegate cb);
参数 说明
type 消息类型,详见NIMSysMsgType
cb 操作结果回调
//删除kNIMSysMsgTypeTeamApply类型的所有消息
NIM.SysMessage.SysMsgAPI.DeleteMsgByType(NIMSysMsgType.kNIMSysMsgTypeTeamApply,(code, unread_count, json_extension, user_data)=>{
    if (code == 200)//成功
    {
        ...
    }
});