16-环信(1)

2017-01-14  本文已影响10人  cdd48b9d36e0

0924

1. 集成SDK注意要点(10.集成环信sdk)

0925

2. 获取好友列表的机制(02.显示好友列表数据)

好友列表数据默认是从本地数据库获取的,而不是联网请求获取。因为这个原因,需要设置两点:

#pragma mark - 监听自动登录成功
-(void)didAutoLoginWithInfo:(NSDictionary *)loginInfo error:(EMError *)error{
    if (!error) {//自动登录成功,此时buddyList就有值
        self.buddyList = [[EaseMob sharedInstance].chatManager buddyList];
        NSLog(@"=== %@",self.buddyList);
        [self.tableView reloadData];
    }
}
// 让环信SDK在"第一次"登录完成之后,自动从服务器获取好友列表,添加到本地数据库(Buddy表)
    [[EaseMob sharedInstance].chatManager setIsAutoFetchBuddyList:YES];

3. 添加好友后刷新通讯录(03.好友请求同意后刷新通讯录)

  1. 重新从服务器获取好友列表
[[EaseMob sharedInstance].chatManager asyncFetchBuddyListWithCompletion:^(NSArray *buddyList, EMError *error) {
        NSLog(@"从服务器获取的好友列表 %@",buddyList);
        // 赋值数据源
        self.buddyList = buddyList;
        // 刷新
        [self.tableView reloadData];
        
    } onQueue:nil];
  1. 调用上个API后自动触发下面这个代理方法,这个方法的作用就在后台自动更新数据库
#pragma mark 好友列表数据被更新
-(void)didUpdateBuddyList:(NSArray *)buddyList changedBuddies:(NSArray *)changedBuddies isAdd:(BOOL)isAdd{

    NSLog(@"好友列表数据被更新 %@",buddyList);
}

4. 同意别人的添加好友请求后刷新通讯录(04.接收好友的请求)

这里有个坑,发起添加好友请求别人同意后并不调用下面这个API,此时要用上面第3点的方法,而同意别人的好友添加请求会调用此API,此时直接刷新就行了

#pragma mark 好友列表数据被更新
-(void)didUpdateBuddyList:(NSArray *)buddyList changedBuddies:(NSArray *)changedBuddies isAdd:(BOOL)isAdd{

    NSLog(@"好友列表数据被更新 %@",buddyList);
    // 重新赋值数据源
    self.buddyList = buddyList;
    // 刷新
    [self.tableView reloadData];
}

5. 删除好友只需调用下面这个API(05.删除好友)

****会****自动调用-(void)didUpdateBuddyList:(NSArray *)buddyList changedBuddies:(NSArray *)changedBuddies isAdd:(BOOL)isAdd

#pragma mark  实现下面的方法就会出现表格的Delete按钮
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    if (editingStyle == UITableViewCellEditingStyleDelete) {  
        // 获取移除好友的名字
        EMBuddy *buddy = self.buddyList[indexPath.row];
        NSString *deleteUsername = buddy.username;
        // 删除好友
        [[EaseMob sharedInstance].chatManager removeBuddy:deleteUsername removeFromRemote:YES error:nil];
    }
}

6. 被删除好友还需要监听(06.监听被好友删除)

****不会****自动调用-(void)didUpdateBuddyList:(NSArray *)buddyList changedBuddies:(NSArray *)changedBuddies isAdd:(BOOL)isAdd

#pragma mark 被好友删除
-(void)didRemovedByBuddy:(NSString *)username{ 
    // 刷新表格
    [[EaseMob sharedInstance].chatManager asyncFetchBuddyListWithCompletion:^(NSArray *buddyList, EMError *error) {
        NSLog(@"从服务器获取的好友列表 %@",buddyList);
        
        // 赋值数据源
        self.buddyList = buddyList;
        
        // 刷新
        [self.tableView reloadData];
        
    } onQueue:nil];
}

7. 小Tips(08.聊天界面-工具条排版)

self.inputToolBarBottomConstraint.constant = kbHeight;
    //添加动画
    [UIView animateWithDuration:0.25 animations:^{
        [self.view layoutIfNeeded];
    }];
//1.监听键盘弹出,把inputToolbar(输入工具条)往上移
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kbWillShow:) name:UIKeyboardWillShowNotification object:nil];
//2.监听键盘退出,inputToolbar恢复原位
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kbWillHide:) name:UIKeyboardWillHideNotification object:nil];
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

8. sb中让Label高度随文字变化(09.聊天界面-接收方cell的排版)

9. get新的计算自定义cell高度的方法(10.聊天界面-发送方cell的排版)

  1. 先创建一个专门计算高度的工具类自定义cell
/** 计算高度的cell工具对象 */
@property (nonatomic, strong) XMGChatCell *chatCellTool;
  1. 在viewDidload方法里创建这个cell
// 给计算高度的cell工具对象 赋值
    self.chatCellTool = [self.tableView dequeueReusableCellWithIdentifier:ReceiverCell];
  1. 在代理方法里计算cell
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    // 设置label的数据
#warning 计算高度与前,一定要给messageLabel.text赋值
    self.chatCellTool.messageLabel.text = self.dataSources[indexPath.row];
    return [self.chatCellTool cellHeghit];
}

10. 修改键盘return键的文字(11.聊天界面-发送聊天消息)

  1. 代码如下(Sb或xib的话可直接设置)
UITextView *textView = [UITextView new];
textView.returnKeyType = UIReturnKeySend;
  1. 获取return键的事件可以取个巧,当输入为换行建时就当作发送消息(其实这不是最好的处理方法,参考qq就是专门在输入框旁边有个发送键,而这个return键当作换行处理),最后不要忘记把换行符去掉
#pragma mark - UITextView代理
-(void)textViewDidChange:(UITextView *)textView{
    NSLog(@"%@",textView.text);
    // 监听Send事件--判断最后的一个字符是不是换行字符
    if ([textView.text hasSuffix:@"\n"]) {
        NSLog(@"发送操作");
        [self sendMessage:textView.text];
        // 清空textView的文字
        textView.text = nil;   
    }
}
// 把最后一个换行字符去除
#warning 换行字符 只占用一个长度
    text = [text substringToIndex:text.length - 1];

11. 聊天记录的存储机制(12.聊天界面-加载本地聊天记录)

  1. 环信也是存在本地数据库里的,数据库的消息体是json格式,网络上发送的消息体是xml嵌套json
上一篇下一篇

猜你喜欢

热点阅读