单聊或群聊-的聊天历史的实现
这是 效果图, 群组 或是单聊 均可,用的 2.0的sdk ,之前项目没有添加视频,聊天历史中只有文字与图片,这一部分开始 是个妹纸写的,后来妹纸离开了,项目加了视频发送,聊天历史中也要添加,群聊也要添加聊天历史功能, 看妹纸的代码 也是看了许久,毕竟我工作也就几个月,她也是个新人。。。 简单的说下实现思路吧。
文件目录, model 就是参照 环信demo 中的MessageModel ,cell布局需要判断 消息的类型,Controller中需要 两个 关键参数:单聊就是用户ID,群聊就是 群组ID ;
然后:
@property (strong, nonatomic) EMConversation *conversation;环信的,具体内容自己点进去看
// 根据接收者的username获取当前会话的管理者
if (_numForGroup==42) {
_conversation =[[EaseMob sharedInstance].chatManager conversationForChatter:_groupID conversationType:eConversationTypeGroupChat];
}else{
_conversation = [[EaseMob sharedInstance].chatManager conversationForChatter:_username
conversationType:eConversationTypeChat];
}
获取到消息以后 NSArray *messages = [_conversation loadAllMessages]; //这里的messages 数组 就是与 用户ID 或群组ID 相对应 单聊或群聊的所有消息,
接下来 就要解析这个数组里面的 消息了,可以参照 ChatVC 中的消息解析;
下面是一部分代码
-(void)analyzeData:(NSArray *)messages{
// [_messageList removeAllObjects];
_messageList = [[NSMutableArray alloc] init];
int i = 1;
for (EMMessage *mes in messages) {
NSLog(@"mes == %@",mes);
ChatHistoryModel *chatModel = [[ChatHistoryModel alloc] init];
chatModel.massageID = mes.messageId;
NSDictionary *ext = mes.ext;
NSDictionary *em_apns_ext = ext[@"em_apns_ext"];
chatModel.username = em_apns_ext[@"nickname"];
NSDate *mesD = [NSDate dateWithTimeIntervalSince1970:mes.timestamp/1000];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM-dd HH:mm:ss"];
chatModel.time = [dateFormatter stringFromDate:mesD];
id<IEMMessageBody> mesbody = [mes.messageBodies firstObject];
chatModel.messageType = mesbody.messageBodyType;
if (chatModel.messageType == 1) {
EMTextMessageBody *textbody = (EMTextMessageBody *)mesbody;
chatModel.textMessage = textbody.text;
}else if(chatModel.messageType == 2){
EMImageMessageBody *imagebody = (EMImageMessageBody *)mesbody;
chatModel.message = imagebody.message;
//本地图片路径
chatModel.thumbnailFile = imagebody.thumbnailLocalPath;
chatModel.imageFile = imagebody.localPath;
//网络图片路径
chatModel.imageRemote = imagebody.remotePath;
chatModel.trumbnailRemote = imagebody.thumbnailRemotePath;
//图片大小
chatModel.imageSize = imagebody.size;
chatModel.thumbnailSize = imagebody.thumbnailSize;
}else if(chatModel.messageType == 3){
EMVideoMessageBody *videoMessageBody = (EMVideoMessageBody*)mesbody;
chatModel.message = videoMessageBody.message;
//第一帧图片
chatModel.thumbnailImage = [UIImage imageWithContentsOfFile:videoMessageBody.thumbnailLocalPath];
//视频第一帧图片大小
chatModel.imageSize = videoMessageBody.size;
chatModel.localPath = videoMessageBody.thumbnailLocalPath;
}
}
视频消息的显示, 是一个视频的第一帧图片 加上一个按钮, 另外有一个问题,就是 他人发送的图像 与自己发送的图片,在cell显示上会有大小的差异, 接下来我会把源码传上来,给大家参考,这一部分还需要优化,特别是cell中 图像与 视频的显示, 大小总是有些不满意,也希望大家帮忙修改下