16-环信(1)
2017-01-14 本文已影响10人
cdd48b9d36e0
0924
1. 集成SDK注意要点(10.集成环信sdk)
- 按文档导入依赖库的时候对拖入的环信.a静态库只能保留一个,删除的时候不要忘了.a对应的.h文件也要删除
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];
}
}
- 第一次登录完成之后设置自动从服务器获取好友列表这个API为YES
// 让环信SDK在"第一次"登录完成之后,自动从服务器获取好友列表,添加到本地数据库(Buddy表)
[[EaseMob sharedInstance].chatManager setIsAutoFetchBuddyList:YES];
3. 添加好友后刷新通讯录(03.好友请求同意后刷新通讯录)
- 重新从服务器获取好友列表
[[EaseMob sharedInstance].chatManager asyncFetchBuddyListWithCompletion:^(NSArray *buddyList, EMError *error) {
NSLog(@"从服务器获取的好友列表 %@",buddyList);
// 赋值数据源
self.buddyList = buddyList;
// 刷新
[self.tableView reloadData];
} onQueue:nil];
- 调用上个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.聊天界面-工具条排版)
- 注意给底部工具条View添加底部约束的时候要选View不要选BottomLayoutGuide
- 给约束加动画
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拖拽时隐藏键盘,只需要一个属性搞定(Sb或xib可直接设置)
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
8. sb中让Label高度随文字变化(09.聊天界面-接收方cell的排版)
- 先设置上和左的约束
- 然后在sb里选中label的倒数第二个的尺子→preferred width设置最大宽度(在前面的学习中知道这一步也可以直接设置宽度约束也行)
9. get新的计算自定义cell高度的方法(10.聊天界面-发送方cell的排版)
- 先创建一个专门计算高度的工具类自定义cell
/** 计算高度的cell工具对象 */
@property (nonatomic, strong) XMGChatCell *chatCellTool;
- 在viewDidload方法里创建这个cell
// 给计算高度的cell工具对象 赋值
self.chatCellTool = [self.tableView dequeueReusableCellWithIdentifier:ReceiverCell];
- 在代理方法里计算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.聊天界面-发送聊天消息)
- 代码如下(Sb或xib的话可直接设置)
UITextView *textView = [UITextView new];
textView.returnKeyType = UIReturnKeySend;
- 获取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.聊天界面-加载本地聊天记录)
- 环信也是存在本地数据库里的,数据库的消息体是json格式,网络上发送的消息体是xml嵌套json