iOS

获取频道最后一条消息

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

网易云信 NIM SDK 的NIMQChatMessageManager协议提供getLastMessageOfChannels方法,用于获取多个频道的最后一条消息,该方法的响应NIMQChatGetLastMessageOfChannelsResult返回的结果为 map,key 值对应每一个channelId,value 值是消息体QChatMessage。基于该方法的调用,您可通过在应用上层自行开发相关业务逻辑,实现频道列表动态更新各频道的最后一条消息。

UI 示例

频道列表显示最后一条消息的简易 UI 示例如下:

频道最后一条消息UI示例.png

前提条件

已登录圈组,并已创建圈组服务器和频道。

实现流程

API 调用时序

频道最后一条消息动态更新的业务场景,可分为如下两种。

场景1:事件回调触发更新

sequenceDiagram



note over NIM SDK: 初始化 SDK 并登录 IM
note over NIM SDK: 注册监听并登录圈组
用户A ->> NIM SDK: 注册消息接收回调&<br>消息更新回调
用户A ->> NIM SDK: 登录圈组
其他用户 ->> NIM SDK: 登录圈组
note over NIM SDK: 双方都成为同一服务器的成员
note over NIM SDK: 双方都能访问同一频道
note over NIM SDK: 频道内收发消息
note over NIM SDK: 获取初始数据
用户A ->> NIM SDK: 获取频道列表
用户A ->> NIM SDK: 获取多个频道的最后一条消息
note over NIM SDK: 事件回调触发最后一条消息更新
其他用户 ->> NIM SDK: 发送或重发消息
NIM SDK ->> 用户A: 消息接收事件
用户A ->> NIM SDK: 更新频道最后一条消息
note left of 用户A: 需应用层<br>自行实现
其他用户 ->> NIM SDK: 撤回、更新或删除消息
NIM SDK ->> 用户A: 消息撤回、更新或删除事件
用户A ->> NIM SDK: 判断被撤回、更新或删除的消息<br>是否为最后一条消息
note left of 用户A: 需应用层<br>自行实现
用户A ->> NIM SDK: 如果为最后一条消息,<br>则更新为频道最后一条消息
note left of 用户A: 需应用层<br>自行实现

场景2:自己发送或变更消息触发更新

sequenceDiagram



note over NIM SDK: 初始化 SDK 并登录 IM
note over NIM SDK: 登录圈组
note over NIM SDK: 获取初始数据
用户A ->> NIM SDK: 获取频道列表
用户A ->> NIM SDK: 获取多个频道的最后一条消息
note over NIM SDK: 用户自动发送或变更消息<br>触发最后一条消息更新
用户A ->> NIM SDK: 发送、重发或更新消息
用户A ->> 用户A: 更新频道最后一条消息
note left of 用户A: 需应用层<br>自行实现
用户A ->> NIM SDK: 撤回或删除自己的消息
用户A ->> 用户A: 判断撤回或删除的消息<br>是否为最后一条消息
note left of 用户A: 需应用层<br>自行实现
用户A ->> 用户A: 若为最后一条消息<br>则置空该消息
note left of 用户A: 需应用层<br>自行实现

流程说明

  1. 登录圈组前,调用addDelegate方法添加委托(回调函数如下):

    • onRecvMessages:消息接收事件回调,用于监听消息接收事件。
    • onMessageUpdate:消息更新事件回调,用于监听消息更新、撤回和删除。

    示例代码如下:

    监听消息接收
    - (void)onRecvMessages:(NSArray<NIMQChatMessage *> *)messages
    {
        //your code, deal messages
    }
    
    
    监听消息更新
    - (void)onMessageUpdate:(NIMQChatUpdateMessageEvent *)event
    {
        
    }
    
    
  2. 获取频道最后一条消息的初始数据。

    1. 调用getChannelsByPage:completion:拉取频道列表。

    2. 调用getLastMessageOfChannels:completion:方法获取若干个频道的最后一条消息。

      • 最多只能传入 20 个频道 ID 获取它们的最后一条消息。
      • 您需自行维护调用该方法返回的结果。
      • 被撤回的消息仍能通过调用该方法查到,但被删除的消息无法查到。如果最后一条消息是撤回消息,推荐把对应的最后一条消息置空,并给出提示表明“撤回消息”。
    3. 在您的应用内存中维护相关频道的最后一条消息。

    示例代码如下:

objcNIMQChatGetChannelsByPageParam *param = [[NIMQChatGetChannelsByPageParam alloc] init];
param.serverId = serverId;
[NIMSDK.sharedSDK.qchatChannelManager getChannelsByPage:param completion:^(NSError *__nullable error,NIMQChatGetChannelsByPageResult *__nullable result)
{
    // 获取失败
    if (error)
    {
        return;
    }
    // 没有符合条件的频道
    if (result.channels.count <= 0)
    {
        return;
    }
    NIMQChatGetLastMessageOfChannelsParam *lastMessageOfChannelsParam = [[NIMQChatGetLastMessageOfChannelsParam alloc] init];
    lastMessageOfChannelsParam.serverId = serverId;
    NSMutableArray *channelIds = [NSMutableArray array];
    for (NIMQChatChannel *channel in result.channels)
    {
        [channelIds addObject:@(channel.channelId)];
    }
    lastMessageOfChannelsParam.channelIds = channelIds;
    [NIMSDK.sharedSDK.qchatMessageManager getLastMessageOfChannels:lastMessageOfChannelsParam
                                                        completion:^(NSError *__nullable error, NIMQChatGetLastMessageOfChannelsResult *__nullable result)
    {
        //your code
    }];
}];
  1. 参照下表,在应用层自行开发,实现后续频道最后一条消息在不同场景下的动态更新。

    场景
    场景说明 推荐处理方法
    事件回调触发更新 频道内,其他用户发送消息或重发消息,触发消息接收回调 更新频道最后一条消息
    频道内,其他用户撤回、更新或删除消息,触发消息更新回调 判断撤回、更新、删除的消息是否为频道最后一条消息,若非最后一条消息,则忽略;若为最后一条消息,且:
    • 为撤回或删除消息,则把最后一条消息置空
    • 为更新消息,则更新频道最后一条消息
    自己发送或变更消息触发更新 自己在频道内发送、重发或更新消息 更新频道内最后一条消息
    自己在频道内撤回或删除消息 判断撤回或删除的消息是否为频道最后一条消息,若非最后一条消息,则忽略;若为最后一条消息,则把最后一条消息置空

相关信息

圈组各端 (Android、iOS、Windows 和 含圈组版 Web)监听消息更新、消息撤回和消息删除的方式略有差异,具体为:Android 将消息更新、消息撤回和消息删除三个事件进行区分;而其他端的消息撤回和消息删除事件,都并入消息更新事件,不进行区分。

各端的相关事件回调接口如下:

Android iOS Windows 含圈组版 Web
监听消息更新 observeMessageUpdate onMessageUpdate: RegUpdatedCb messageUpdate
监听消息撤回 observeMessageRevoke
监听消息删除 observeMessageDelete
此文档是否对你有帮助?
有帮助
去反馈
  • UI 示例
  • 前提条件
  • 实现流程
  • API 调用时序
  • 流程说明
  • 相关信息