内置系统通知管理
更新时间: 2024/11/21 16:31:48
网易云信 NIM SDK 支持接收和存储内置系统通知。同时提供处理、查询、删除内置系统通知、修改通知状态等内置系统通知管理功能。
技术原理
内置系统通知是云信系统内建的通知,由云信服务器推送给用户或群组,用于云信系统类的事件通知。
系统通知相关 API 都挂载在 SDK 的 nim::SystemMsg
模块中,具体请参见 nim::SystemMsg
。
监听系统通知
只有在注册监听内置系统通知相关事件后,用户才会收到对应的系统通知。
graph LR
监听系统通知接收事件 --> 产生触发内置系统通知的事件 --> 接收具体类型的内置系统通知
可以使用接收系统通知回调模板(ReceiveSysmsgCallback
)并调用 RegSysmsgCb
方法来监听系统通知接收事件。
除了接收系统通知回调模板(ReceiveSysmsgCallback
),SDK 还提供以下回调模板:
QueryMsgCallback
:查询系统通知回调模板NotifySysmsgResCallback
:修改系统通知回调模板QuerySysmsgUnreadCallback
:查询系统通知未读数回调模板ReadAllCallback
:设置系统通知已读状态回调模板DeleteAllCallback
:删除全部系统通知回调模板BatchSetCallback
:批量调整系统通知回调模板NotifySingleSysmsgCallback
:修改(单条)系统通知回调模板SetStatusCallback
:设置系统通知状态回调模板DeleteCallback
:删除系统通知回调模板SendCustomSysmsgCallback
:发送自定义通知回调模板
示例代码:
void UIReceiveSysmsgCallback(nim::SysMessage& msg)
{
if (msg.type_ == nim::kNIMSysMsgTypeCustomP2PMsg || msg.type_ == nim::kNIMSysMsgTypeCustomTeamMsg)
{
}
else
{
}
}
void foo()
{
nim::SystemMsg::RegSysmsgCb(&OnReceiveSysmsgCallback);
}
注册后的回调通知给 APP。为了保证整个程序逻辑的一致性,APP 需要针对不同类型的系统通知进行相应的操作。
目前云信内置的能触发内置系统通知的事件包括:
通知类型 | 说明 |
---|---|
kNIMSysMsgTypeTeamInvite |
邀请用户加入高级群 |
kNIMSysMsgTypeTeamApply |
用户申请加入高级群 |
kNIMSysMsgTypeTeamInviteReject |
用户拒绝加入高级群邀请 |
kNIMSysMsgTypeTeamReject |
拒绝用户的加入高级群申请 |
kNIMSysMsgTypeFriendAdd |
加好友,通知内容 kNIMSysMsgKeyAttach: {"vt":verifyType} 中会返回具体的验证类型 |
kNIMSysMsgTypeFriendDel |
删除好友 |
kNIMSysMsgTypeUnknown |
未知类型,本地使用,发送时勿使用,作为默认 |
查询内置系统通知
通过调用 QueryMsgAsync
方法查询本地所有的内置系统通知。
参数说明:
参数 | 说明 |
---|---|
last_time | 上次查询的最后一条系统通知的时间戳 |
limit_count | 本次查询的系统通知数量,最多和默认都为 100 条 |
json_extension | JSON 扩展参数 |
cb | 结果回调函数,返回的列表按时间逆序逆序排列 |
示例代码:
void LoadEventsCb(int count, int unread, const std::list<nim::SysMessage> &result)
{
}
void foo()
{
nim::SystemMsg::QueryMsgAsync(20, 0, &LoadEventsCb);
}
在支持数据库时,SDK 会将内置系统通知存储于数据库中。
删除内置系统通知
删除所有内置系统通知
通过调用 DeleteAllAsync
方法删除所有的本地内置系统通知。示例代码如下:
void DeleteAllCb(nim::NIMResCode res_code, int unread)
{
}
void foo()
{
nim::SystemMsg::DeleteAllAsync(&DeleteAllCb);
}
删除指定的内置系统通知
通过调用 DeleteAsync
方法根据 msg_id
(系统通知 ID)删除指定的内置系统通知。示例代码如下:
void DeleteCb(nim::NIMResCode code, __int64 msg_id, int unread)
{
}
void foo(__int64 msg_id)
{
nim::SystemMsg::DeleteAsync(msg_id, &DeleteCb);
}
删除指定类型的内置系统通知
通过调用 DeleteByTypeAsync
方法根据 type
(系统通知类型)删除指定的内置系统通知。
系统通知类型具体请参见NIMSysMsgType
。
示例代码如下:
SystemMsg::DeleteByTypeAsync(kNIMSysMsgTypeTeamApply, [](NIMResCode res_code, int unread_count) {
// process response
});
设置系统通知状态
SDK 的系统通知状态通过 NIMSysMsgStatus
来定义,目前主要内置了以下六种状态。
kNIMSysMsgStatusNone
:未读,默认kNIMSysMsgStatusRead
:已读kNIMSysMsgStatusPass
:已通过kNIMSysMsgStatusDecline
:已拒绝kNIMSysMsgStatusDeleted
:已删除kNIMSysMsgStatusInvalid
:已失效
设置指定的内置系统通知状态
通过调用 SetStatusAsync
方法根据 msg_id
(系统通知 ID)设置指定的内置系统通知状态。示例代码如下:
void SetStatusCb(nim::NIMResCode code, __int64 msg_id, int unread)
{
}
void foo(__int64 msg_id)
{
nim::SystemMsg::SetStatusAsync(msg_id_, nim::kNIMSysMsgStatusInvalid, &SetStatusCb);
}
更新的字段只会在本地数据库中更新,服务器上不会更新。
设置指定类型的内置系统通知状态
通过调用 SetStatusByTypeAsync
方法根据 type
(系统通知类型)设置指定类型的内置系统通知状态。示例代码如下:
SystemMsg::SetStatusByTypeAsync(kNIMSysMsgTypeTeamApply, kNIMSysMsgStatusPass, [](NIMResCode res_code, int unread_count) {
// process response
// ...
});
- 系统通知类型具体请参见
NIMSysMsgType
。 - 更新的字段只会在本地数据库中更新,服务器上不会更新。