美文网首页
环信的消息列表的实现

环信的消息列表的实现

作者: allenzhan | 来源:发表于2017-03-21 17:10 被阅读0次

    前面几天都在忙其它事情,刚集成的环信就只有登录、注册、还有简单的聊天界面,又把他放在了一边,今天重新集成。准备做一下消息列表。

    下面说一下,基本的消息列表的数据展示和交互。
    如图所示,一般的消息列表有头像、未读的消息数量、对方的昵称、还有最后一条消息的内容、以及最后一条消息的时间。然后聊天记录会按照时间的远近来排序。

    环信的消息列表的实现

    下面就看看怎么实现吧。

    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)];
          //降序
      }];
    }
    
    

    然后就可以达到上图的效果

    下次讲解如何将时间戳转换成时间的格式。

    相关文章

      网友评论

          本文标题:环信的消息列表的实现

          本文链接:https://www.haomeiwen.com/subject/giegnttx.html