iOS

消息正在输入

更新时间: 2024/11/21 15:42:52

网易云信即时通讯 NIM iOS SDK 中的NIMQChatMessageManager协议,提供方法发送“频道消息正在输入事件”。接收方需先订阅发送消息的频道中的该事件,并实现相应代理方法,才能在消息输入方发送该事件后,接收到该事件。

前提条件

发送方和接收方都在频道内,即频道对两者都可见, 且发送方拥有发送频道消息权限(即NIMQChatPermissionType枚举下的NIMQChatPermissionTypeSendMsg)。

  • 要实现频道对双方都可见,需确保两者都在私密频道的白名单内,或者都没有被加入公开频道的黑名单,具体参见频道黑白名单
  • 用户操作权限通过身份组进行管控,具体参见身份组相关

实现流程

流程概览

sequenceDiagram



note over NIM SDK: 初始化 SDK 并登录 IM
note over NIM SDK: 注册监听并登录圈组
发送方 ->> NIM SDK: 登录圈组
接收方 ->> NIM SDK: 监听正在输入事件<br>(onRecvTypingEvent:)
接收方 ->> NIM SDK: 登录圈组
note over NIM SDK: 双方都成为同一服务器的成员
note over NIM SDK: 双方都能访问同一频道
note over NIM SDK: 接收方订阅频道
接收方 ->> NIM SDK: 订阅频道<br>(subscribeChannel:completion:)
note left of 接收方: 订阅类型设置为<br>NIMQChatSubscribeTypeChannelTypingEvent
note over NIM SDK: 发送方拥有发送消息的权限
note over NIM SDK: 消息收发
发送方 ->> NIM SDK: 发送正在输入事件<br>(sendMessageTypingEvent:completion:)
note left of 发送方: 发送方输入时调用
NIM SDK ->> 接收方: 正在输入事件<br>(NIMQChatMessageTypingEvent)

流程说明

本节仅对上图中标为部分的流程进行说明,其他流程请参考相关文档。例如:

  1. 接收方实现onRecvTypingEvent:回调方法监听正在输入事件(NIMQChatMessageTypingEvent)。

  2. 接收方调用subscribeChannel:completion:方法,调用时将入参NIMQChatSubscribeType设为NIMQChatSubscribeTypeChannelTypingEvent,实现对频道消息正在输入事件的订阅。

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

  3. 发送方调用sendMessageTypingEvent:completion:方法发送频道消息正在输入事件。

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

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

示例代码

//************************用户A设置正在输入事件监听回调************************/
    [[NIMSDK sharedSDK].qchatMessageManager addDelegate:self];
    - (void)onRecvSystemNotification:(NIMQChatReceiveSystemNotificationResult *)result
    {
        
    }
    
    //************************用户A订阅某频道正在输入事件************************/
    //服务器Id
    long serviceId = 2114708;
    //频道Id
    long channelId = 233479;
    
    NIMQChatSubscribeChannelParam *subscibeParam = [[NIMQChatSubscribeChannelParam alloc] init];
    subscibeParam.subscribeType = NIMQChatSubscribeTypeChannelTypingEvent;
    subscibeParam.operationType = NIMQChatSubscribeOperationTypeSubscribe;
    NIMQChatChannelIdInfo *channelIdInfo = [[NIMQChatChannelIdInfo alloc] init];
    channelIdInfo.serverId = serverId;
    channelIdInfo.channelId = channelId;
    subscibeParam.targets = @[channelIdInfo];
    [[NIMSDK sharedSDK].qchatChannelManager subscribeChannel:subscibeParam completion:^(NSError * _Nullable error) {
        //code
    }];

    //************************用户B发送正在输入事件************************/
    NIMQChatMessageTypingEvent *event = [[NIMQChatMessageTypingEvent alloc] init];
    event.channelId = channelId;
    event.serverId = serverId;
    [[NIMSDK sharedSDK].qchatMessageManager sendMessageTypingEvent:event completion:^(NSError * _Nullable error, NIMQChatMessageTypingEvent * _Nullable result) {
            //code
    }];
此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 实现流程
  • 流程概览
  • 流程说明
  • 示例代码