融云(一)

作者: 蚯小麦 | 来源:发表于2018-07-06 11:24 被阅读7次

这几天窥探了一下融云的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

相关文章

  • 融云(一)

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

  • 融云 Flutter IM SDK 解析

    融云 Flutter IM SDK 解析 最近准备使用融云的 Flutter SDK,所以顺便记录一下。 融云 F...

  • 融云

    融云登录账号:771764208@qq.com 调试地址:调试地址 Server开发文档地址:Server开发文档...

  • IM 的集成

    1.1:融云的分类(简介) 1.1.1:融云 IM 界面组件 - RongCloud IMKit IMKit 是融...

  • Swift3.0使用Alamofire获取融云SDK的token

    最近使用融云SDK,需要向融云服务器请求一个token参数参考融云官方文档:http://www.rongclou...

  • 融云聊天之iOS笔记摘录

    1. 概念 融云SDK的系统架构 相关名词 2. 集成融云 登录融云 断开融云 会话列表页 聊天内容页 3. IM...

  • 音视频服务开发指南

    概述 融云音视频服务提供两类 SDK: 融云 Call 界面组件 - RongCloud CallKit 融云 C...

  • 极光推送,融云即时通讯 原理

    融云即时通讯: 1,App Key / Secret : 相当于当前 App 在融云的账号和密码,是融云SDK连接...

  • 【指南】广播推送开发

    一、概述 依托融云在即时通讯领域深厚的技术积累及多年稳定可靠的消息推送服务能力,融云决定推出广播推送产品。融云广播...

  • 融云-添加好友流程。

    融云是干嘛的? 融云就是提供了一个稳定的消息通道,这是他的根本作用。 另外融云提供了一些 UI 组件,目的是让用户...

网友评论

    本文标题:融云(一)

    本文链接:https://www.haomeiwen.com/subject/bysvuftx.html