详解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;i
5在任意地方获取聊天列表数量及删除列表
获取聊天列表
NSArray*privateArr=[[RCIMClientsharedRCIMClient]getConversationList:@[@(ConversationType_PRIVATE)]];
在ConversationList添加对应类型的聊天就可以获取对应类型的聊天列表删除方法类似
[[RCIMClientsharedRCIMClient]clearConversations:@[@(ConversationType_PRIVATE)]];
6背景图
融云聊天列表没有数据的默认图片下面有点击右上角加入聊天,可是不是所有的聊天都有这个功能(我的就没有)如何没有就可以在资源文件中找到no_message_img这张图片用ps去掉下面的那一行字