更改 TUIKit 实现消息转发的功能

2021-02-02 17:07:17 浏览数 (1)

更改 TUIKit 实现消息转发的功能

前提背景: 当前 IMSDK 5.1.21 版本的 TUIkit 还不支持消息转发的功能(后续很快将提供). 这个示例可以作为一个转发消息参考

实现原理一句话介绍: 拿到当前消息的信息, 转发的时候重新构建一条新的消息发送出去

step1: 添加长按菜单项目

长按消息出现转发选项, 可以在 tuikit 的 - (void)onLongPressMessage:(TUIMessageCell *)cell 方法添加中

[items addObject:[[UIMenuItem alloc] initWithTitle:@"转发" action:@selector(onTransMsg:)]];

可以通过 [data isKindOfClass:[TUITextMessageCellData class]] 这个方法判断消息类型, 对想要提供转发的消息类型添加该选项, 例如这里的文本消息

添加后效果如下:

示例图片示例图片

step2: 响应转发点击

响应点击转发操作: 你可以自定义页面, 这里例子为点击后弹出通讯录页面, 转发给好友

在 TUIKit 下面这个方法中加上 onTransMsg: 添加响应

代码语言:txt复制
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(onDelete:) ||
        action == @selector(onRevoke:) ||
        action == @selector(onReSend:) ||
        action == @selector(onCopyMsg:) ||
        action == @selector(onTransMsg:)){
        return YES;
    }
    return NO;
}

处理响应: 弹出通讯录页面, 传递数据

创建 ShareContactViewController 控制器, 可以复制 TUIKit 中的 TUIContactController 里面的代码, 提供 TUIMessageCellData *shareCellData; 属性来传递数据

代码语言:txt复制
- (void)onTransMsg:(id)sender {
    // 这里的 ShareContactViewController 是一个通讯录页面 (仿照TUIContactController demo的通讯录页面)
    ShareContactViewController *shareVC = [[ShareContactViewController alloc] init];
    shareVC.shareCellData = _menuUIMsg;
    [self presentViewController:shareVC animated:YES completion:nil];
}

step3: 发送消息

在弹出的通讯录界面 ShareContactViewController 处理转发, 也就是拿到数据自己创建一条消息发出去

通讯录点击好友的响应方法是: onSelectFriend

onSelectFriend 中拿到数据发送, 示例为文字和图片消息

图片消息需要拿到当前的图片消息, 获取当前的 localPath, 再构造一个图片消息, 调发送接口发送(视频文件消息同理)

代码语言:txt复制
- (void)onSelectFriend:(TCommonContactCell *)cell
{
    TCommonContactCellData *data = cell.contactData;
    id<TUIFriendProfileControllerServiceProtocol> vc = [[TCServiceManager shareInstance] createService:@protocol(TUIFriendProfileControllerServiceProtocol)];
    if ([vc isKindOfClass:[UIViewController class]]) {
        vc.friendProfile = data.friendProfile;
        
        if ([self.shareCellData isKindOfClass:[TUITextMessageCellData class]]) {
            TUITextMessageCellData *txtMsg = (TUITextMessageCellData *)self.shareCellData;
            [[V2TIMManager sharedInstance] sendC2CTextMessage:txtMsg.content to:data.identifier succ:^{
                NSLog(@"成功");
            } fail:^(int code, NSString *desc) {
                NSLog(@"执行方法 function:: %s -- 错误码 code:: %d, 错误描述 msg::%@", __func__, code, desc);
            }];
        }
        
        if ([self.shareCellData isKindOfClass:[TUIImageMessageCellData class]]) {
            TUIImageMessageCellData *imageMsg = (TUIImageMessageCellData *)self.shareCellData;
            BOOL isExist = YES;
            NSString *path = [imageMsg getImagePath:TImage_Type_Thumb isExist:&isExist];
            V2TIMMessage *imgMsg = [[V2TIMManager sharedInstance] createImageMessage:path];
            [[V2TIMManager sharedInstance] sendMessage:imgMsg receiver:data.identifier groupID:nil priority:V2TIM_PRIORITY_DEFAULT onlineUserOnly:NO offlinePushInfo:nil progress:^(uint32_t progress) {
                NSLog(@"progress=%u", progress);
            } succ:^{
                NSLog(@"成功");
            } fail:^(int code, NSString *desc) {
                NSLog(@"执行方法 function:: %s -- 错误码 code:: %d, 错误描述 msg::%@", __func__, code, desc);
            }];
        }
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

对于多选转发则会复杂一点, 原理以相同, 只是需要更多的自定义的 UI, 如果不着急可以等等 TUIKit 官方的更新

0 人点赞