Files
peko-ios/PublicRoomMessageForward_Implementation.md

2.9 KiB
Raw Blame History

公共房间消息转发功能实现

功能概述

实现了从 PublicRoomManager 转发特定消息到房间中的功能。当 PublicRoomManager 接收到 attachment.first 为 106 的消息时,会自动转发到当前活跃的房间中。

实现方案

1. 通知机制

  • 使用 NSNotificationCenter 进行消息转发
  • 通知名称:@"MessageFromPublicRoomWithAttachmentNotification"
  • 通知对象NIMMessage 对象

2. 修改的文件

PublicRoomManager.m

  • onRecvMessages: 方法中添加转发逻辑
  • 当检测到 attachment.first == 106 时发送通知

XPRoomViewController.m

  • setupNotifications 方法中注册通知监听
  • 添加 handlePublicRoomMessageForward: 方法处理转发的消息
  • dealloc 中自动移除通知监听

YUMIConstant.m

  • 添加常量定义:kMessageFromPublicRoomWithAttachmentNotification(已添加但当前使用字符串字面量)

XPRoomViewController.h

  • 添加常量声明(已添加但当前使用字符串字面量)

使用流程

  1. 消息接收PublicRoomManager 接收到公共房间消息
  2. 类型检查:检查 attachment.first 是否为 106
  3. 发送通知:如果是 106 类型,发送转发通知
  4. 接收处理XPRoomViewController 接收通知并处理
  5. 消息显示:通过现有的消息处理流程显示在房间中

代码示例

发送通知PublicRoomManager.m

if (attachment && attachment.first == 106) {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MessageFromPublicRoomWithAttachmentNotification" 
                                                        object:message];
    NSLog(@"PublicRoomManager: 转发106类型消息到房间");
}

接收处理XPRoomViewController.m

- (void)handlePublicRoomMessageForward:(NSNotification *)notification {
    NIMMessage *message = notification.object;
    if (![message isKindOfClass:[NIMMessage class]]) {
        return;
    }
    
    // 检查房间是否处于活跃状态
    if (!self.roomInfo || !self.messageContainerView) {
        return;
    }
    
    // 使用现有的消息处理流程
    [self.messageContainerView handleNIMCustomMessage:message];
}

测试场景

  1. 正常转发公共房间收到106类型消息时正确转发
  2. 房间状态:房间最小化、关闭等状态下的处理
  3. 消息过滤:确保转发的消息经过正确的过滤流程
  4. 性能影响:确保不影响现有消息处理性能

注意事项

  1. 消息会经过现有的 isCanDisplayMessage 过滤
  2. 支持最小化房间的特殊处理
  3. 自动处理内存管理(在 dealloc 中移除监听)
  4. 包含完整的错误检查和日志记录

扩展性

如果将来需要转发其他类型的消息,可以:

  1. 修改条件判断(如 attachment.first == 107
  2. 或者使用更通用的通知名称,在通知数据中携带消息类型信息