环信的消息列表的实现
2017-03-21 本文已影响0人
allenzhan
前面几天都在忙其它事情,刚集成的环信就只有登录、注册、还有简单的聊天界面,又把他放在了一边,今天重新集成。准备做一下消息列表。
下面说一下,基本的消息列表的数据展示和交互。
如图所示,一般的消息列表有头像、未读的消息数量、对方的昵称、还有最后一条消息的内容、以及最后一条消息的时间。然后聊天记录会按照时间的远近来排序。
下面就看看怎么实现吧。
1.首先我们搭个大概的框架,我们准备用TableView
来展示我们的消息列表下面这个方法可以获取到当前的所有会话,返回一个数组
[[EMClient sharedClient].chatManager getAllConversations]
获得上面的所有会话后,我们将值赋值给自己的数据源
self.data = (NSMutableArray *) [[EMClient sharedClient].chatManager getAllConversations];
//别忘记了刷新我们的TableView;
环信也给我们自定义好了这个列表的Cell
,叫EaseConversationCell
下面就是列表的代理方法的实现
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _data.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 60;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
EaseConversationCell * cell = [tableView dequeueReusableCellWithIdentifier:@"reuseID"];
if (!cell) {
cell = [[EaseConversationCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reuseID"];
}
EMConversation *conversation = [_data objectAtIndex:indexPath.row];
//
// EMConversationTypeChat = 0, /*! \~chinese 单聊会话 \~english one to one chat room type */
// EMConversationTypeGroupChat, /*! \~chinese 群聊会话 \~english Group chat room type */
// EMConversationTypeChatRoom /*! \~chinese 聊天室会话 \~english Chatroom chat room type */
switch (conversation.type) {
//单聊会话
case EMConversationTypeChat:
{
//这里有个小坑,刚开始不知道怎么获取到对方的昵称,就用了下面的方法去获取,根据当前的会话是接收方还是发送方来获取发送的对象,或接收的对象,结果有些能获取到,有些返回的Null,
// cell.textLabel.text = [conversation lastReceivedMessage].direction == EMMessageDirectionSend? [conversation lastReceivedMessage].to : [conversation lastReceivedMessage].from;
cell.titleLabel.text = conversation.conversationId;// [conversation lastReceivedMessage].direction == EMMessageDirectionSend? [conversation lastReceivedMessage].to : [conversation lastReceivedMessage].from;
NSLog(@"发送方%@------接收方%@",[conversation lastReceivedMessage].from,[conversation lastReceivedMessage].to);
//头像,我这里用固定的头像
cell.avatarView.image = [UIImage imageNamed:@"home"];
//是否显示角标
cell.avatarView.showBadge = YES;
//未读消息数量
cell.avatarView.badge = conversation.unreadMessagesCount;
break;
}
default:
break;
}
//这里是将会话的最后一条消息装换成具体内容展示
cell.detailLabel.text = [self subTitleMessageByConversation:conversation];
//这里是将时间戳格式转换成日期格式
NSString * str = [YMHXTool timeByMessageTime:[NSString stringWithFormat:@"%lld",[conversation latestMessage].localTime]];
cell.timeLabel.text = str;//[NSString stringWithFormat:@"%lld",[conversation latestMessage].localTime];
return cell;
}
下面的这个方法是获取该会话的最后一条消息,当然图片,语音之类的消息文本,就用字符串代替了
//得到最后消息文字或者类型
-(NSString *)subTitleMessageByConversation:(EMConversation *)conversation
{
NSString *ret = @"";
EMMessage *lastMessage = [conversation latestMessage];
EMMessageBody * messageBody = lastMessage.body;
if (lastMessage) {
EMMessageBodyType messageBodytype = lastMessage.body.type;
switch (messageBodytype) {
// EMMessageBodyTypeText = 1, /*! \~chinese 文本类型 \~english Text */
// EMMessageBodyTypeImage, /*! \~chinese 图片类型 \~english Image */
// EMMessageBodyTypeVideo, /*! \~chinese 视频类型 \~english Video */
// EMMessageBodyTypeLocation, /*! \~chinese 位置类型 \~english Location */
// EMMessageBodyTypeVoice, /*! \~chinese 语音类型 \~english Voice */
// EMMessageBodyTypeFile, /*! \~chinese 文件类型 \~english File */
// EMMessageBodyTypeCmd, /*! \~chinese 命令类型 \~english Command */
//图像类型
case EMMessageBodyTypeImage:
{
ret = NSLocalizedString(@"图片消息", @"[image]");
} break;
//文本类型
case EMMessageBodyTypeText:
{
NSString *didReceiveText = [EaseConvertToCommonEmoticonsHelper
convertToSystemEmoticons:((EMTextMessageBody *)messageBody).text]; //表情映射
ret = didReceiveText;
} break;
//语音类型
case EMMessageBodyTypeVoice:
{
ret = NSLocalizedString(@"语音消息", @"[voice]");
} break;
//位置类型
case EMMessageBodyTypeLocation:
{
ret = NSLocalizedString(@"地理位置信息", @"[location]");
} break;
//视频类型
case EMMessageBodyTypeVideo:
{
ret = NSLocalizedString(@"视频消息", @"[video]");
} break;
default:
break;
}
}
return ret;
}
到了上面这一步其实基本已经完成了,下面要做的就是讲所有会话,按照时间来排序。
self.data = (NSMutableArray *) [YMHXTool sortByLocalTime:self.data];//别忘了刷新数据源
//会话列表排序
+(NSArray *)sortByLocalTime:(NSArray *)conversationArr
{
return [conversationArr sortedArrayUsingComparator:^NSComparisonResult(EMConversation* _Nonnull obj1, EMConversation * _Nonnull obj2) {
//这里根据客户端接收到该消息的时间来进行排序
return [@([obj2 latestMessage].localTime) compare:@([obj1 latestMessage].localTime)];
//降序
}];
}
然后就可以达到上图的效果
下次讲解如何将时间戳转换成时间的格式。