更改 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;
属性来传递数据
- (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
中拿到数据发送, 示例为文字和图片消息
代码语言:txt复制图片消息需要拿到当前的图片消息, 获取当前的 localPath, 再构造一个图片消息, 调发送接口发送(视频文件消息同理)
- (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 官方的更新