这几天窥探了一下融云的sdk,由于对环信已经十分的了解,所以有意识的对比了一下这两个主流的即时通讯的sdk,有一下感受
- 感觉界面上来讲融云比环信更优好,更美观。
- 代码封装性来讲融云封装的也更适合直接使用,环信相对来讲,需要自定的部分比较多,比如融云有RCInformationNotificationMessage提醒消息,系统消息,环信的话就需要自己定制。融云还提供同类型会话聚合显示。
接下来看一下融云的使用
注册和连接融云
// 【注册融云】
- (void)setRongYun {
[[RCIM sharedRCIM] initWithAppKey:RongYunKey];
//用户信息提供者
[[RCIM sharedRCIM] setUserInfoDataSource:self];
//群信息提供者
[[RCIM sharedRCIM] setGroupInfoDataSource:self];
//群列表提供
[[RCIM sharedRCIM] setGroupMemberDataSource:self];
//开启消息撤回功能
[RCIM sharedRCIM].enableMessageRecall = YES;
//设置接收消息代理
[RCIM sharedRCIM].receiveMessageDelegate = self;
//设置列表圆角显示
[RCIM sharedRCIM].globalConversationAvatarStyle = RC_USER_AVATAR_CYCLE;
//设置会话圆角显示
[RCIM sharedRCIM].globalMessageAvatarStyle = RC_USER_AVATAR_CYCLE;
//设置链接状态
[[RCIM sharedRCIM] setConnectionStatusDelegate:self];
//设置发送消息时在消息体中携带用户信息。
[RCIM sharedRCIM].enableMessageAttachUserInfo = YES;
// 设置当前用户信息
[RCIM sharedRCIM].currentUserInfo = [[RCUserInfo alloc] initWithUserId:@"123456" name:@"mimi" portrait:@"https://health.sinoicity.com:9000/FileServer/open/file/url.htm?fileId=1513150425138l"];
// 设置消息体内是否携带用户信息
[RCIM sharedRCIM].enableMessageAttachUserInfo = YES;
NSString *token112233 = @"TOB64F3HTrKGBEYSGVn0p+RLrUtCL/W17n2N54m9mGqhVgUc3GEfcJsC2jLfZ/ZH7u34T0Je2JKPdq6yMRsPhQ==";
// NSString *token123456 = @"i7oPcnbmWJcubUvQGCmgG+RLrUtCL/W17n2N54m9mGqhVgUc3GEfcGN93nB4zcoPvnfWJeVwVaUSLF4bohCY0A==";
[[RCIM sharedRCIM] connectWithToken:token112233 success:^(NSString *userId) {
BYLog(@"userId-%@",userId);
} error:^(RCConnectErrorCode status) {
BYLog(@"%ld",status);
} tokenIncorrect:^{
BYLog(@"失败");
}];
}
这里说明一下connectWithToken的方法是在你的app成功登陆之后调用。
在加上代理
<
RCIMUserInfoDataSource,
RCIMReceiveMessageDelegate,
RCIMConnectionStatusDelegate,
RCIMGroupInfoDataSource,
RCIMGroupMemberDataSource
>
接下来就是更新用户信息,如头像和昵称的方法,环信的话获取用户头像和昵称一般都是存储在消息扩展中去完成,但是融云提供了
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *userInfo))completion;方法 可以有效的解决这个问题
#pragma mark--融云--RCIMUserInfoDataSource
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *userInfo))completion {
// 判断是自己的还是别人的info
if ([userId isEqualToString:@"自己账户"]) {
RCUserInfo *userInfo = [[RCUserInfo alloc] init];
userInfo.userId = userId;
userInfo.name = @"自己的昵称";
userInfo.portraitUri = @"自己的头像";
return completion(userInfo);
} else {
//这部分可以走自己服务的接口根据id查询昵称和头像,
NSArray *arr = @[@"小明",@"小王",@"小李",@"小张"];
RCUserInfo *userInfo = [[RCUserInfo alloc] init];
userInfo.userId = userId;
userInfo.name = arr[arc4random()%4];
userInfo.portraitUri = @"";
if (userInfo) {
[[RCIM sharedRCIM] refreshUserInfoCache:userInfo withUserId:userId];
return completion(userInfo);
}else {
return completion(nil);
}
}
return completion(nil);
}
融云也提供了更新群组信息的方法
- (void)getGroupInfoWithGroupId:(NSString *)groupId completion:(void (^)(RCGroup *))completion;
融云也提供了发送消息时在消息体中携带用户信息。
[RCIM sharedRCIM].enableMessageAttachUserInfo = YES;
这样我们在接受到新消息的代理里面也可以处理头像和昵称
#pragma mark--融云--RCIMReceiveMessageDelegate
- (void)onRCIMReceiveMessage:(RCMessage *)message left:(int)left {
// 直接取到携带的RCUserInfo 对象
message.content.senderUserInfo
//更新SDK中的用户信息缓存
[[RCIM sharedRCIM] refreshUserInfoCache:userInfo withUserId:message.targetId];
}
融云提供的关于融云连接状态的代理
- (void)onRCIMConnectionStatusChanged:(RCConnectionStatus)status {
BYLog(@"status == %ld",status);
//被踢下线
if (status == ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT) {
[ShareManager showRemind:@"账号在别处登陆"];
}
}
聊天列表和会话界面
聊天列表直接继承RCConversationListViewController即可,
会话界面直接继承RCConversationViewController即可。
自定义聊天列表和会话界面
在聊天列表页面中提供了
//处理数据源
-(NSMutableArray *)willReloadTableData:(NSMutableArray *)dataSource;
//自定义cell
- (RCConversationBaseCell *)rcConversationListTableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
//自定义cell height
-(CGFloat)rcConversationListTableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
//点击cell跳会话页面
- (void)onSelectedTableRow (RCConversationModelType)conversationModelType
conversationModel:(RCConversationModel *)model
atIndexPath:(NSIndexPath *)indexPath;
需要说明的是必须在willReloadTableData 数据源方法中把数据的类型RCConversationModelType 设为RC_CONVERSATION_MODEL_TYPE_CUSTOMIZATION才会去调用其他的代理.
需要注意使用IQKeyboardManager的时候一定要在聊天列表和会话页面禁用掉,否则键盘会出现漂移。
[IQKeyboardManager sharedManager].enable = NO;
这是昨天看融云的心得。感觉融云比环信要更好用一点。