消息正在输入
更新时间: 2024/11/21 16:31:47
网易云信 IM 的圈组模块支持在频道内有消息输入时,频道成员能在频道内看到“正在输入”提示。
技术原理
网易云信即时通讯 NIM Windows SDK 中的NIMQChatTypingEvent
结构体定义了“正在输入事件系统通知”。SDK 的SystemNotification
类提供SendTypingEvent
方法发送“正在输入事件系统通知”。接收方只有在监听该事件且订阅消息所在频道后,才能在消息输入方发送该事件后,接收到该事件的系统通知。
实现方法
我们以用户A 和用户B 在频道内的消息交互为例,介绍“正在输入”在频道显示的实现方法。
前提条件
用户A 和用户B 都在频道内,即频道对两者都可见, 且用户B 拥有发送频道消息权限。
- 要实现频道对用户A 和用户B 都可见,需确保两者都在私密频道的白名单内,或者都没有被加入公开频道的黑名单。
- 可通过将用户B 加入某身份组,并授予该身份组发送频道消息权限,让用户B 拥有发送频道消息的权限。也可为用户B 在频道内定制发送频道消息的权限。
实现流程
-
用户A 调用
RegRecvTypingEvent
方法监听正在输入事件(NIMQChatTypingEvent
)。 -
用户A 调用
Subscribe
方法,调用时将入参NIMQChatSubscribeType
设为kNIMQChatSubscribeTypeTypingEvent
,实现对正在输入事件的订阅。如果断线重连,SDK 会自动再次订阅正在输入事件。但如果用户调用
Logout
方法切断与圈组服务端的连接或销毁 SDK 实例后重建实例,那么用户需要再度调Subscribe
方法重新订阅该事件。 -
用户B 调用
SendTypingEvent
方法发送正在输入事件。发送该事件后,SDK 会触发用户A 在
RegRecvTypingEvent
方法中设置的回调,将NIMQChatTypingEvent
投递至用户A。该方法有调用频率上限,目前默认 3,000 ms 一次。
API 调用时序
sequenceDiagram
用户A ->> 圈组: RegRecvTypingEvent
用户A ->> 圈组: Subscribe
用户B ->> 圈组: SendTypingEvent
圈组 ->> 用户A: NIMQChatTypingEvent
示例代码
// User A: register channel typing event callback on certain channel
QChatRegRecvTypingEventCbParam reg_receive_typing_event_cb_param;
reg_receive_typing_event_cb_param.cb = [this](const QChatRecvTypingEventResp& resp) {
if (resp.res_code != NIMResCode::kNIMResSuccess) {
// error handling
return;
}
// process response
// ...
};
SystemNotification::RegRecvTypingEvent(reg_receive_typing_event_cb_param);
// User A: subscribe typing event
QChatChannelSubscribeParam param;
param.ope_type = kNIMQChatSubscribeOpeTypeSubscribe;
param.sub_type = kNIMQChatSubscribeTypeTypingEvent; // subscribe typing event
NIMQChatChannelIDInfo id_info;
id_info.server_id = 123456;
id_info.channel_id = 123456;
param.id_infos.push_back(id_info);
param.cb = [this](const QChatChannelSubscribeResp& resp) {
if (resp.res_code != NIMResCode::kNIMResSuccess) {
// error handling
return;
}
// process response
// ...
};
Channel::Subscribe(param);
// User B: send tying event
QChatSendTypingEventParam param;
param.typing_event.server_id = 123456;
param.typing_event.channel_id = 123456;
param.typing_event.extension = "typing";
param.cb = [this](const QChatSendTypingEventResp& resp) {
if (resp.res_code != NIMResCode::kNIMResSuccess) {
// error handling
return;
}
// process response
// ...
};
SystemNotification::SendTypingEvent(param);
API 参考
API |
说明 |
---|---|
RegRecvTypingEvent |
监听正在输入事件 |
SendTypingEvent |
发送正在输入事件 |
此文档是否对你有帮助?