IM 即时通讯
Windows/macOS
产品介绍
简介
主要功能
产品优势
海外数据中心
IM平滑迁移方案
接口及业务限制
功能介绍
帐号集成与登录
基础消息功能
群组功能
聊天室功能
聊天室标签功能
圈组功能
多端登录与互踢策略
质量数据监控台
更新日志
Demo 更新日志
NIM SDK 更新日志
快速开始
实现单聊消息收发(不含 UI)
实现圈组消息收发(不含 UI)
开发指南
概要介绍
集成方式(当前版本)
集成方式(Windows旧版本)
集成方式(macOS旧版本)
初始化
登录登出
消息收发
最近会话
历史记录
用户资料托管
好友关系托管
事件订阅
系统通知
系统通知概述
内置系统通知管理
内置系统通知未读数
自定义系统通知收发
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
开通聊天室功能
聊天室
圈组功能
初始化
登录圈组
圈组服务器管理
圈组服务器成员管理
游客功能
频道相关
频道管理
频道分组
频道分组黑白名单
频道未读数管理
搜索服务器和频道
身份组相关
身份组概述
身份组应用场景
服务器身份组
频道身份组
频道分组身份组
频道用户定制权限
自定义权限项
成员权限判定
身份组相关查询
圈组订阅机制
圈组消息相关
圈组消息收发
圈组消息撤回
圈组消息更新
圈组消息删除
会话消息回复(Thread)
圈组快捷评论
获取频道最后一条消息
消息正在输入
圈组消息搜索
圈组消息查询
查询@我的消息
服务器未读数
圈组系统通知
圈组系统通知概述
圈组系统通知收发
圈组系统通知更新
圈组各端接口命名差异
语音录制与播放
NOS云存储服务
文档转换
API 参考
Windows/macOS API 参考
状态码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
配置应用客户端标识
参考文档
升级指引
开发示例
UI库指南
Demo源码导读
打包发布
类与常量定义说明
常见问题
FAQ
服务协议

消息正在输入

更新时间: 2022/05/24 16:13:21

网易云信 IM 的圈组模块支持在频道内有消息输入时,频道成员能在频道内看到“正在输入”提示。

技术原理

网易云信即时通讯 NIM Windows SDK 中的NIMQChatTypingEvent结构体定义了“正在输入事件系统通知”。SDK 的SystemNotification类提供SendTypingEvent方法发送“正在输入事件系统通知”。接收方只有在监听该事件且订阅消息所在频道后,才能在消息输入方发送该事件后,接收到该事件的系统通知。

实现方法

我们以用户A 和用户B 在频道内的消息交互为例,介绍“正在输入”在频道显示的实现方法。

前提条件

用户A 和用户B 都在频道内,即频道对两者都可见, 且用户B 拥有发送频道消息权限。

  • 要实现频道对用户A 和用户B 都可见,需确保两者都在私密频道的白名单内,或者都没有被加入公开频道的黑名单。
  • 可通过将用户B 加入某身份组,并授予该身份组发送频道消息权限,让用户B 拥有发送频道消息的权限。也可为用户B 在频道内定制发送频道消息的权限。

实现流程

  1. 用户A 调用RegRecvTypingEvent方法监听正在输入事件(NIMQChatTypingEvent)。

  2. 用户A 调用Subscribe方法,调用时将入参NIMQChatSubscribeType设为kNIMQChatSubscribeTypeTypingEvent ,实现对正在输入事件的订阅。

    如果断线重连,SDK 会自动再次订阅正在输入事件。但如果用户调用 Logout 方法切断与圈组服务端的连接或销毁 SDK 实例后重建实例,那么用户需要再度调Subscribe方法重新订阅该事件。

  3. 用户B 调用SendTypingEvent方法发送正在输入事件。

    发送该事件后,SDK 会触发用户A 在RegRecvTypingEvent方法中设置的回调,将NIMQChatTypingEvent投递至用户A。

    该方法有调用频率上限,目前默认 3,000 ms 一次。

API 调用时序

uml diagram

示例代码

// 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 发送正在输入事件
此文档是否对你有帮助?
有帮助
我要吐槽
  • 技术原理
  • 实现方法
  • 前提条件
  • 实现流程
  • API 调用时序
  • 示例代码
  • API 参考