消息正在输入

更新时间: 2023/07/21 06:56:54

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

技术原理

网易云信圈组 QChat Web SDK 中的QChatMsgServiceInterface模块提供sendTypingEvent方法发送“正在输入事件”。接收方只有在监听该事件且订阅消息所在频道后,才能在消息输入方发送该事件后,接收到该事件。

实现方法

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

前提条件

用户A 和用户B 都在频道内,即频道对两者都可见, 且用户B 拥有发送频道消息权限(即QChatRoleAuth枚举中的sendMsg)。

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

实现流程

  1. 用户A 调用recTypingEvent方法监听正在输入事件。

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

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

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

    发送该事件后,SDK 触发用户A在recTypingEvent方法中设置的回调,将正在输入事件系统通知投递至用户A。

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

API 调用时序图

uml diagram

示例代码

用户A

qchat.on('recvTypingEvent', function (event) {
    console.log(event)
    // {
    //   serverId: 'YOUR_SERVER_ID',
    //   channelId: 'YOUR_CHANNEL_ID',
    //   fromAccount: 'ACCOUNT_B'
    //   time: 1652755487745
    // }
    
    // TODO: show event on your views
})

// Subscribing to typing events for channel
await qchat.qchatChannel.subscribeChannel({
    "type": 5,
    "opeType": 1,
    "channels": [
        {
        "serverId": "YOUR_SERVER_ID",
        "channelId": "YOUR_CHANNEL_ID"
        }
    ]
})

用户B

// example button
// <button id="button">example button for send typing event</button>

document.getElementById("button").addEventListener('click', async function() {
    // send typing event
    // Note: API sendTypingEvent has done throttling, so you can send it directly
    await qchat.qchatMsg.sendTypingEvent({
        "serverId": "YOUR_SERVER_ID",
        "channelId": "YOUR_CHANNEL_ID"
    })
})

API 参考

API
说明
recTypingEvent 监听正在输入事件
sendTypingEvent 发送正在输入事件系统通知
此文档是否对你有帮助?
有帮助
去反馈
  • 技术原理
  • 实现方法
  • 前提条件
  • 实现流程
  • API 调用时序图
  • 示例代码
  • 用户A
  • 用户B
  • API 参考