详解iOS集成融云SDK即时通讯整理
最近很少写一下项目总结了,最近项目虽然做了很多,但是都是一些外包项目,做下来也没有什么值得总结的。最近一个项目用到了融云即时通讯,以前基本都是用环信,所以还遇到了一些问题,在此总结一下记录一下。
1头像、昵称等用户信息(融云对这个问题有两种处理方式)
1.用户信息提供者
实现步骤(以下代码放在单例中,可以是AppDelegate,最好单独写一个单例)
首先遵守RCIMUserInfoDataSource这个协议
然后是要设置代理
[[RCIMsharedRCIM]setUserInfoDataSource:self];
最后实现代理方法:
-(void)getUserInfoWithUserId:(NSString*)userIdcompletion:(void(^)(RCUserInfo*))completion{ NSLog(@"getUserInfoWithUserId-----%@",userId); RCUserInfo*user=[RCUserInfonew]; if(userId==nil||[userIdlength]==0){ user.userId=userId; user.portraitUri=@""; user.name=@""; completion(user); return; } if([userIdisEqualToString:[UserInfoshareInstance].uid]){ NSString*urlSelf=[BASIC_URL_imagestringByAppendingString:[UserInfoshareInstance].photo]; returncompletion([[RCUserInfoalloc]initWithUserId:userIdname:[UserInfoshareInstance].nicknameportrait:urlSelf]); }else{ //根据存储联系人信息的模型,通过userId来取得对应的name和头像url,进行以下设置 [WTBaseHttpRequstpostRequstWithURL:getUserHttpparams:@{@"uid":[UserInfoshareInstance].uid,@"api_token":[UserInfoshareInstance].api_token,@"k_uid":userId}successBlock:^(NSDictionary*returnData){ if([returnData[@"status"]integerValue]==1){ NSString*urlStr=[BASIC_URL_imagestringByAppendingString:returnData[@"data"][@"user"][@"photo"]]; returncompletion([[RCUserInfoalloc]initWithUserId:userIdname:returnData[@"data"][@"user"][@"nickname"]portrait:urlStr]); }else{ completion(user); } }failureBlock:^(NSString*error){ completion(user); }showHUD:NO]; } }
这个方法不需要你自己手动调用,只是当你在修改用户信息时调用
[[RCIMsharedRCIM]refreshUserInfoCache:userwithUserId:[UserInfoshareInstance].uid]
方法即可
WS(weakSelf); //修改用户信息调用 [WTBaseHttpRequstpostRequstWithURL:modifyInfoHttpparams:dictsuccessBlock:^(NSDictionary*returnData){ [weakSelfMBProgressHudShowWithTextOnlyWithText:returnData[@"msg"]]; if([returnData[@"status"]integerValue]==1){ RCUserInfo*user=[RCUserInfonew]; user.userId=[UserInfoshareInstance].uid; user.portraitUri=[BASIC_URL_imagestringByAppendingString:[UserInfoshareInstance].photo]; user.name=weakSelf.nickNameTextField.text; [[RCIMsharedRCIM]refreshUserInfoCache:userwithUserId:[UserInfoshareInstance].uid]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(1.5*NSEC_PER_SEC)),dispatch_get_main_queue(),^{ [self.navigationControllerpopViewControllerAnimated:YES]; }); } }failureBlock:^(NSString*error){ [weakSelfMBProgressHudShowWithTextOnlyWithText:error]; }showHUD:YES];
2.在扩展消息中携带用户信息
设置发送消息时在消息体中携带用户信息(从2.4.1之后附加用户信息之后cell默认会显示附加的用户信息的头像,即用户信息不会取用户信息提供者里提供的用户信息)
[RCIMsharedRCIM].enableMessageAttachUserInfo=YES;
你设置了enableMessageAttachUserInfo之后,可以取到
/** *发送者信息 ***/ @property(nonatomic,strong)RCUserInfo*senderUserInfo;
当然我觉得还可以从后台获取好友关系后,我们在每次登陆后,开一个线程把好友关系请求下来存起来然后根据环信ID查找好友的昵称和头像
2给输入框添加提示语(这个我一直觉得环信应该给了方法修改,只是我一直没有找到这个方法,所以只有自己去写了)
1.创建提示的label
_lab=[[UILabelalloc]initWithFrame:self.chatSessionInputBarControl.inputTextView.bounds]; _lab.text=@"请输入文字信息..."; _lab.textColor=[UIColorcolorWithHexColor:@"dddddd"]; _lab.font=[UIFontsystemFontOfSize:15]; _lab.center=CGPointMake(_lab.center.x+15,_lab.center.y);
2.判定是否有草稿来显示和隐藏提示的label
[self.chatSessionInputBarControl.inputTextViewaddSubview:_lab]; if(self.chatSessionInputBarControl.draft==nil||self.chatSessionInputBarControl.draft.length==0){ _lab.hidden=NO; }else{ _lab.hidden=YES; }
3.根据输入数据来判定显示隐藏提示label
-(void)inputTextView:(UITextView*)inputTextViewshouldChangeTextInRange:(NSRange)rangereplacementText:(NSString*)text{ if(((inputTextView.text.length==1&&[textisEqualToString:@""])||(inputTextView.text.length==0&&text.length>0))&&range.length==1&&range.location==0){ _lab.hidden=NO; }else{ _lab.hidden=YES; } }
3取消输入@弹出好友列表界面,保留长按头像@方法
1.首先在AppDelegate中开启消息@功能(只支持群聊和讨论组,App需要实现群成员数据源groupMemberDataSource)
[RCIMsharedRCIM].enableMessageMentioned=YES;
然后在继承RCConversationViewController的控制器中调用
-(void)showChooseUserViewController:(void(^)(RCUserInfo*selectedUserInfo))selectedBlock cancel:(void(^)())cancelBlock{ }
4在会话列表中添加一些固定的cell(继承RCConversationListViewController)
//对自定义cell赋值 -(RCConversationBaseCell*)rcConversationListTableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{ RCCustomCell*cell=(RCCustomCell*)[[RCCustomCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"RCCustomCell"]; RCConversationModel*model=self.conversationListDataSource[indexPath.row]; cell.nameLabel.text=model.conversationTitle; returncell; } //添加自定义cell的数据源 -(NSMutableArray*)willReloadTableData:(NSMutableArray*)dataSource{ NSArray*arr=@[@"论坛回复和@我的",@"陌生人私信",@"幸存者部落@我的",@"问卷调查"]; for(inti=0;i5在任意地方获取聊天列表数量及删除列表
获取聊天列表
NSArray*privateArr=[[RCIMClientsharedRCIMClient]getConversationList:@[@(ConversationType_PRIVATE)]];在ConversationList添加对应类型的聊天就可以获取对应类型的聊天列表删除方法类似
[[RCIMClientsharedRCIMClient]clearConversations:@[@(ConversationType_PRIVATE)]];6背景图
融云聊天列表没有数据的默认图片下面有点击右上角加入聊天,可是不是所有的聊天都有这个功能(我的就没有)如何没有就可以在资源文件中找到no_message_img这张图片用ps去掉下面的那一行字