系统通知

更新时间: 2022/05/17 08:41:22

除消息通道外,SDK 还提供系统通知这种通道用于消息之外的通知分发。目前有两种类型:内置系统通知和自定义系统通知。

所有的系统通知(包括内置系统通知和自定义系统通知)都是通过

C++

c++void UIReceiveSysmsgCallback(nim::SysMessage& msg)
{
	if (msg.type_ == nim::kNIMSysMsgTypeCustomP2PMsg || msg.type_ == nim::kNIMSysMsgTypeCustomTeamMsg)
	{

	}
	else
	{

	}
}

void foo()
{
	nim::SystemMsg::RegSysmsgCb(&OnReceiveSysmsgCallback);
}

C#

c#void OnReceivedSysNotification(object sender, NIMSysMsgEventArgs e)
{
	if (e.Message == null || e.Message.Content == null)
		return;

	if (e.Message.Content.MsgType == NIMSysMsgType.kNIMSysMsgTypeTeamInvite)
	{
		
	}
}

void foo()
{
	NIM.SysMessage.SysMsgAPI.ReceiveSysMsgHandler += OnReceivedSysNotification;
}

C

cvoid CallbackSysmsgChange(const char *result, const char *json_extension, const void *callback)
{
	//解析result
}

typedef void(*nim_sysmsg_reg_sysmsg_cb)(const char *json_extension, nim_sysmsg_receive_cb_func cb, const void* user_data);

void foo()
{
	nim_sysmsg_reg_sysmsg_cb func = (nim_sysmsg_reg_sysmsg_cb) GetProcAddress(hInst, "nim_sysmsg_reg_sysmsg_cb");
	func("", &CallbackSysmsgChange, nullptr);
}

注册后的回调通知给APP。为了保证整个程序逻辑的一致性,APP 需要针对不同类型的系统通知进行相应的操作。

内置系统通知

这是由SDK 预定义的通知类型,目前仅支持几种群操作的通知,如被邀请入群,SDK 负责这些通知的持久化。

此外,SDK 提供了以下接口来获取和维护内置系统通知记录:

查询系统消息列表(按时间逆序查询,逆序排列):

c++void nim_sysmsg_query_msg_async(int limit_count, __int64 last_time, const char *json_extension, nim_sysmsg_query_cb_func cb, const void *user_data);

C++

c++void LoadEventsCb(int count, int unread, const std::list<nim::SysMessage> &result)
{

}

void foo()
{
	nim::SystemMsg::QueryMsgAsync(20, 0, &LoadEventsCb);
}

C#

c#NIM.SysMessage.SysMsgAPI.QueryMessage(100, 0, (r) =>
{

});

C

cvoid CallbackSysmsgChange(int count, const char *result, const char *json_extension, const void *callback)
{
	//解析result
}

typedef void(*nim_sysmsg_query_msg_async)(int limit_count, __int64 last_time, const char *json_extension, nim_sysmsg_query_cb_func cb, const void* user_data);

void foo()
{
	nim_sysmsg_query_msg_async func = (nim_sysmsg_query_msg_async) GetProcAddress(hInst, "nim_sysmsg_query_msg_async");
	func(20, 0, "", &CallbackSysmsgChange, nullptr);
}

查询未读消息数:

c++void nim_sysmsg_query_unread_count(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

C++

c++void OnQuerySysmsgUnreadCb(nim::NIMResCode res_code, int unread_count)
{
	if (res_code == 200)
		···
}

void foo()
{
	nim::SystemMsg::QueryUnreadCount(&OnQuerySysmsgUnreadCb);
}

C#

c#NIM.SysMessage.SysMsgAPI.QueryUnreadCount((response, count) =>
{

});

C

cvoid CallbackNotifySysmsgRes(int res_code, int unread_count, const char *json_extension, const void *callback)
{
	
}

typedef void(*nim_sysmsg_query_unread_count)(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

void foo()
{
	nim_sysmsg_query_unread_count func = (nim_sysmsg_query_unread_count) GetProcAddress(hInst, "nim_sysmsg_query_unread_count");
	func("", &CallbackNotifySysmsgRes, nullptr);
}

设置消息状态:

c++void nim_sysmsg_set_status_async(__int64 msg_id, NIMSysMsgStatus status, const char *json_extension, nim_sysmsg_res_ex_cb_func cb, const void *user_data);

C++

c++void SetStatusCb(nim::NIMResCode code, __int64 msg_id, int unread)
{
	
}

void foo(__int64 msg_id)
{
	nim::SystemMsg::SetStatusAsync(msg_id_, nim::kNIMSysMsgStatusInvalid, &SetStatusCb);
}

C#

c#void foo(long msg_id)
{
	NIM.SysMessage.SysMsgAPI.SetMsgStatus(msg_id, NIM.SysMessage.NIMSysMsgStatus.kNIMSysMsgStatusRead, 
		(res_code, _msg_id, unread_count, json_extension, user_data) =>
	{

	});
}

C

cvoid CallbackNotifySingleSysmsg(int res_code, __int64 msg_id, int unread_count, const char *json_extension, const void *callback)
{
	
}

typedef void(*nim_sysmsg_set_status_async)(__int64 msg_id, nim::NIMSysMsgStatus status, const char *json_extension, nim_sysmsg_res_ex_cb_func cb, const void* user_data);

void foo(__int64 msg_id, nim::NIMSysMsgStatus status)
{
	nim_sysmsg_set_status_async func = (nim_sysmsg_set_status_async) GetProcAddress(hInst, "nim_sysmsg_set_status_async");
	func(msg_d, status, "", &CallbackNotifySingleSysmsg, nullptr);
}

删除单条消息:

c++void nim_sysmsg_delete_async(__int64 msg_id, const char *json_extension, nim_sysmsg_res_ex_cb_func cb, const void *user_data);

C++

c++void DeleteCb(nim::NIMResCode code, __int64 msg_id, int unread)
{

}

void foo(__int64 msg_id)
{
	nim::SystemMsg::DeleteAsync(msg_id, &DeleteCb);
}

C#

c#void foo(long msg_id)
{
	NIM.SysMessage.SysMsgAPI.DeleteByMsgId(msg_id,
		(res_code, _msg_id, unread_count, json_extension, user_data) =>
	{

	});
}

C

cvoid CallbackNotifySingleSysmsg(int res_code, __int64 msg_id, int unread_count, const char *json_extension, const void *callback)
{
	
}

typedef void(*nim_sysmsg_delete_async)(__int64 msg_id, const char *json_extension, nim_sysmsg_res_ex_cb_func cb, const void *user_data);

void foo(__int64 msg_id)
{
	nim_sysmsg_delete_async func = (nim_sysmsg_delete_async) GetProcAddress(hInst, "nim_sysmsg_delete_async");
	func(msg_d, "", &CallbackNotifySingleSysmsg, nullptr);
}

设置全部消息为已读:

c++void nim_sysmsg_read_all_async(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

C++

c++void SysMsgReadAllCb(nim::NIMResCode code, int unread)
{

}

void foo()
{
	nim::SystemMsg::ReadAllAsync(&SysMsgReadAllCb);
}

C#

c#void foo()
{
	NIM.SysMessage.SysMsgAPI.SetAllMsgRead(
		(res_code, unread_count, json_extension, user_data) =>
	{

	});
}

C

cvoid CallbackNotifySysmsgRes(int res_code, int unread_count, const char *json_extension, const void *callback)
{
	
}

typedef void(*nim_sysmsg_read_all_async)(const char *json_extension, nim_sysmsg_res_cb_func cb, const void* user_data);

void foo()
{
	nim_sysmsg_read_all_async func = (nim_sysmsg_read_all_async) GetProcAddress(hInst, "nim_sysmsg_read_all_async");
	func("", &CallbackNotifySysmsgRes, nullptr);
}

删除全部消息:

c++void nim_sysmsg_delete_all_async(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

C++

c++void DeleteAllCb(nim::NIMResCode res_code, int unread)
{

}

void foo()
{
	nim::SystemMsg::DeleteAllAsync(&DeleteAllCb);
}

C#

c++void foo()
{
	NIM.SysMessage.SysMsgAPI.DeleteAll(
		(res_code, unread_count, json_extension, user_data) =>
	{

	});
}

C

cvoid CallbackNotifySysmsgRes(int res_code, int unread_count, const char *json_extension, const void *callback)
{
	
}

typedef void(*nim_sysmsg_delete_all_async)(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

void foo()
{
	nim_sysmsg_delete_all_async func = (nim_sysmsg_delete_all_async) GetProcAddress(hInst, "nim_sysmsg_delete_all_async");
	func("", &CallbackNotifySysmsgRes, nullptr);
}

自定义系统通知

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

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

一秒内默认最多可调用发送自定义系统通知的接口100次。如需上调上限,请在官网首页通过微信、在线消息或电话等方式咨询商务人员。

代码示例如下:

C++

c++void foo()
{
	Json::Value json;
	Json::FastWriter writer;
	json["id"] = "1";

	nim::SysMessage msg;
	msg.receiver_accid_ = ;	//接收者id
	msg.sender_accid_ = ; 	//自己id
	msg.client_msg_id_ = QString::GetGUID();	//本地定义的消息id
	msg.attach_ = writer.write(json);			//通知附件内容
	msg.type_ = nim::kNIMSysMsgTypeCustomP2PMsg; //通知类型

	nim::SystemMsg::SendCustomNotificationMsg(msg.ToJsonString());
}

C#

c#void foo()
{
	NIM.SysMessage.NIMSysMessageContent content = new NIM.SysMessage.NIMSysMessageContent();
	content.ClientMsgId = Guid.NewGuid().ToString();
	content.ReceiverId = ""; //接收者id
	content.SenderId = ""; //自己id
	if (_sessionType == NIM.Session.NIMSessionType.kNIMSessionTypeP2P)
		content.MsgType = NIM.SysMessage.NIMSysMsgType.kNIMSysMsgTypeCustomP2PMsg; //通知类型
	else if (_sessionType == NIM.Session.NIMSessionType.kNIMSessionTypeTeam)
		content.MsgType = NIM.SysMessage.NIMSysMsgType.kNIMSysMsgTypeCustomTeamMsg;
	content.Attachment = ""; //通知附件内容
	NIM.SysMessage.SysMsgAPI.SendCustomMessage(content);
}

C

ctypedef void(*nim_sysmsg_send_custom_notification)(const char *json_msg, const char *json_extension);

void foo()
{
	//json_msg:key的定义详见系统消息字段nim_sysmsg_def.h
	Json::Value json_msg;
	json_msg[kNIMSysMsgKeyToAccount] = ; //接收者id
	json_msg[kNIMSysMsgKeyFromAccount] = ; //自己id
	json_msg[kNIMSysMsgKeyLocalClientMsgId] = 本地定义的消息id; 
	json_msg[kNIMSysMsgKeyTime] = ; //时间戳
	json_msg[kNIMSysMsgKeyAttach] = ; //通知附件内容
	json_msg[kNIMSysMsgKeyType] = ; //通知类型

	nim_sysmsg_send_custom_notification func = (nim_sysmsg_send_custom_notification) GetProcAddress(hInst, "nim_sysmsg_send_custom_notification");
	func(json_msg.toStyledString().c_str(), nullptr);
}

客户端发起的自定义通知的回执结果通过APP 预先通过

cvoid nim_sysmsg_reg_sysmsg_cb(const char *json_extension, nim_sysmsg_receive_cb_func cb, const void *user_data);

注册的回调告知开发者。代码实力如下:

C++

c++void OnReceiveSysmsgCallback( const nim::SysMessage& msg )
{
	
}

void foo()
{
	nim::SystemMsg::RegSysmsgCb(&OnReceiveSysmsgCallback);
}

C#

c#void OnReceivedSysNotification(object sender, NIMSysMsgEventArgs e)
{
	if (e.Message == null || e.Message.Content == null)
		return;

	if (e.Message.Content.MsgType == NIMSysMsgType.kNIMSysMsgTypeTeamInvite)
	{
		···
	}
}

void foo()
{
	NIM.SysMessage.SysMsgAPI.ReceiveSysMsgHandler += OnReceivedSysNotification;
}

C

cvoid CallbackSysmsgChange(const char *result, const char *json_extension, const void *callback)
{
	// 解析result
}

typedef void(*nim_sysmsg_reg_sysmsg_cb)(const char *json_extension, nim_sysmsg_receive_cb_func cb, const void* user_data);

void foo()
{
	nim_sysmsg_reg_sysmsg_cb func = (nim_sysmsg_reg_sysmsg_cb) GetProcAddress(hInst, "nim_sysmsg_reg_sysmsg_cb");
	func("", &CallbackSysmsgChange, nullptr);
}

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

  • 自定义通知消息是否存离线(kNIMSysMsgKeyCustomSaveFlag)
  • 自定义通知消息推送文本(kNIMSysMsgKeyCustomApnsText)
  • 第三方自定义的推送属性(kNIMSysMsgKeyPushPayload)
  • 是否需要推送(kNIMSysMsgKeyPushEnable)
  • 推送是否要做消息计数(kNIMSysMsgKeyNeedBadge)
  • 推送是否需要推送昵称(kNIMSysMsgKeyPushNeedNick)

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

此文档是否对你有帮助?
有帮助
去反馈
  • 内置系统通知
  • 自定义系统通知