系统通知
更新时间: 2024/11/25 10:11:32
除消息通道外,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 需要根据自己的业务逻辑按需进行解析和持久化的工作。