融云(一)

这几天窥探了一下融云的sdk,由于对环信已经十分的了解,所以有意识的对比了一下这两个主流的即时通讯的sdk,有一下感受

  1. 感觉界面上来讲融云比环信更优好,更美观。
  2. 代码封装性来讲融云封装的也更适合直接使用,环信相对来讲,需要自定的部分比较多,比如融云有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;

这是昨天看融云的心得。感觉融云比环信要更好用一点。

打工是不可能的.gif

你可能感兴趣的:(融云(一))