跳到主要内容

输入状态

输入状态可让用户直观地了解其他用户是否正在键入消息。在对方用户键入内容时,标题栏会一直显示「对方正在输入」,直到用户发送消息或完全删除文本。如果用户停止打字超过 6 秒,该提示也会消失。SDK 在输入框中有内容变化时,默认向对端用户发送一条正在输入的状态消息,包含消息内容对象 TypingStatusMessage(类型标识:RC:TypSts)。

提示
  • 基于会话界面-PageConversationPage)包含了标题栏显示正在输入状态的实现。
  • 基于会话组件-ComponentConversationComponent)构建的会话页面,请自行实现标题栏输入状态的展示与更新。

局限

  • 只支持单聊会话。
  • 因无法确定用户的输入操作,该功能可能会产生大量状态消息,为防止消息发送频繁,默认在 6 秒钟内的多次状态变化,只产生一条输入状态消息。
  • 该功能可能会导致大量状态消息,如不需要此功能建议关闭。

用法

如果使用 IMKit 会话界面-PageConversationPage)集成,该功能默认可用,无需额外处理。

在自定义会话页面监听输入状态

IMKit 的会话组件-Component不含标题栏实现。如果使用这个方式构建自定义会话页面,您需要自行实现输入状态的展示与更新。IMKit SDK 内部已经处理好逻辑,在输入框中有内容变化时,SDK 会向目标用户发送一条正在输入的状态消息。接收方可根据该状态消息,实现类似「对方正在输入」的提示。

应用程序仅需要在自定义会话页面注册监听器,在收到回调通知时更新标题栏。

  1. 在自定义会话页面中注册输入状态的监听器。

建议添加监听后,在合适的时机移除,避免内存泄露。如果在页面中监听,建议在aboutToAppear调用,在 aboutToDisappear 移除监听。

  private typingStatusListener: TypingStatusListener = {
onTypingStatusChange: (conId: ConversationIdentifier, typingStatusList: List<TypingStatus>) => {
//当输入状态的会话类型和targetID与当前会话一致时,才需要显示
if (!conId || !StringChecker.equals(conId.targetId, this.conId.targetId) ||
conId.conversationType !== this.conId.conversationType) {
//不是当前会话
return;
}
// 输入状态列表为空,当前会话没有用户正在输入,标题栏仍显示原来标题
if (!typingStatusList || typingStatusList.length <= 0) {
// 展示原标题
return
}

// 有值代表对方在输入内容 匹配对方正在输入的是文本消息还是语音消息
let typingStatus = typingStatusList[0] as TypingStatus
if (typingStatus.objectName === TextMessageObjectName) {
// 设置标题:对方正在输入...
} else if (typingStatus.objectName === HQVoiceMessageObjectName
|| typingStatus.objectName === VoiceMessageObjectName) {
// 设置标题:对方正在说话...
}
}
}
// 添加监听
RongIM.getInstance().messageService().addTypingStatusListener(this.typingStatusListener)
// 移除监听
RongIM.getInstance().messageService().removeTypingStatusListener(this.typingStatusListener)

当对方正在输入时,本端会触发 onTypingStatusChange,回调里携带有正在输入的用户列表。当对方停止输入时,该监听还会触发一次,此时回调里的输入用户列表为空。这时您需要取消「正在输入」的显示,并显示原有的会话标题栏。

定制化

设置发送输入状态消息的默认时间间隔

SDK 默认间隔配置为 6000毫秒,可以通过 Lib SDK接口进行配置设置输入状态更新时间间隔

关闭输入状态功能

IMKit 默认开启输入状态功能。目前暂不支持关闭。