即时通讯(融云)

     个人邮箱:892569921@qq.com     我的CSDN:http://blog.csdn.net/cry__boy 

    github:  http://github.com/cryboyofyu

github上有自己写的开源库,cocoapods直接集成,大家如果需要的话,去支持一下,谢谢!!!

       博客中还有其他技术文章,也可以去看看哈...

     到现在为止做过三个社交类软件,刚开始想到的就是用第三方,因为即时通讯这个没有深厚的功底是弄不了滴。

比较:环信vs融云

      首先声明本人只是开发者,并不是针对哪个平台。刚开始项目中用的环信,当时好像是1.0.3版本,当时还是菜鸟一枚,集成过来后,对方头像和自己头像显示不出来,消息到是能发,现在不记得了,环信头像的管理方式和融云不一样。

      1.头像与昵称更新

环信:

昵称或头像处理的方法一和方法二区别:

  • 方法一:在发送消息时不含有任何扩展,收消息时如果本地不存在发送人的用户信息则需要从APP服务器查询发送人的昵称和头像的 URL。
  • 方法二:在发送消息时带有包含昵称和头像  URL 的消息扩展,收到消息时即可从消息扩展中取出,不需要再去 APP 服务器获取。

方法二和方法一相比:

  • 优点:收到消息立即显示昵称不用等待APP服务器返回数据后显示。
  • 缺点:每条消息都要带有扩展,增加消息体积,每次发消息都有一些不必要的数据。
融云:

1.会话列表头像不显示???

        在会话列表中的头像与昵称显示,融云有提供代理方法

 
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *))completion{
    //查看userId是否为空
    if(userId == nil || userId.length == 0){
        completion(nil);
        return;
    }
    //是否为自己id
    if([userId isEqualToString:[RCIM sharedRCIM].currentUserInfo.userId]){
        
        RCUserInfo * myselfInfo = [[RCUserInfo alloc]initWithUserId:[RCIM sharedRCIM].currentUserInfo.userId name:[RCIM sharedRCIM].currentUserInfo.name portrait:[RCIM sharedRCIM].currentUserInfo.portraitUri phone:[RCIM sharedRCIM].currentUserInfo.phone schoolName:[RCIM sharedRCIM].currentUserInfo.schoolName realName:[RCIM sharedRCIM].currentUserInfo.realName];
        completion(myselfInfo);
        
       
        }
    
    //是否为好友中的用户id/只要结果反回给融云,融云就知道,这样会话列表就会显示头像和用户名信息了
    for (NSInteger i = 0; i<[LVRCDataManager shareManager].rcFriendsArr.count; i++) {
        
        RCUserInfo *lvUser = [LVRCDataManager shareManager].rcFriendsArr[i];
        
        if ([userId isEqualToString:lvUser.userId]) {
            
            completion(lvUser);
            
        }
        
    }

    
}


2.群组头像不显示

    同理融云提供了群组信息提供者代理方法

- (void)getGroupInfoWithGroupId:(NSString *)groupId
                     completion:(void (^)(RCGroup *groupInfo))completion;

3.在单聊界面自己头像不显示

   需设置:

        [RCIMClient sharedRCIMClient].currentUserInfo = userInfo;
4.刷新角标 tabBar上面

   

NSInteger  unreadMsgCount = (NSInteger)[[RCIMClient sharedRCIMClient] getUnreadCount:@[@(ConversationType_PRIVATE),@(ConversationType_DISCUSSION),@(ConversationType_GROUP)]];
设置tabBar

AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
        
        UINavigationController  *chatNav = appDelegate.tabBarController.viewControllers[2];
        
        if (unreadMsgCount == 0) {
            chatNav.tabBarItem.badgeValue = nil;
        }else{
            chatNav.tabBarItem.badgeValue = [NSString stringWithFormat:@"%li",(long)unreadMsgCount];
        }

5.关于加好友/删好友这个问题,环信是有提供方法的,不过融云没有提供,这个动作,交给服务器就好,调自己服务器接口

6.群组问题

    融云没有提供拉人界面,需自己写,但是融云有提供@人列表界面

7.重要问题*

    关于好友/群组时时更新和远程通知对方问题(如:删除好友后,需通知对方,在对方的列表中把自己删掉,同时自己好友列表里也删掉对方),这个问题需要推送了(极光/融云)都可以,远程通知给对方,弄个删除好友还是加好友的推送标识,收到标识后,用KVO监测,然后更新好友列表/群组列表/换头像/昵称等同步问题

8.有关于融云的最好封装个管理类出来,直接调静态方法方便

         下面是粘贴出自己项目中的融云管理类代码,大家可以借鉴

.h

+ (LVRCDataManager *)shareManager;
@property (nonatomic,assign)BOOL lvSuccess;
@property (nonatomic,strong)NSMutableArray * rcFriendsArr;
@property (nonatomic,strong)NSMutableArray * rcGroupListMArr;
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *))completion;

- (BOOL)hasTheFriendWithUserId:(NSString *)userId;

- (void)loginRongCloudWithUserInfo:(RCUserInfo *)userInfo withToken:(NSString *)token;

- (void)syncFriendList:(void (^)(NSMutableArray * friends,BOOL isSuccess))completion;

- (void) syncGroupList:(void (^)(NSMutableArray * groups,BOOL isSuccess))completion;

- (void)refreshBadgeValue;

- (NSString *)currentNameWithUserId:(NSString *)userId;

- (RCUserInfo *)currentUserInfoWithUserId:(NSString *)userId;

- (RCGroup *)currentGroupInfoWithGroupId:(NSString *)groupId;

- (void)lvRCGetGroupMembersListWithGroupId:(NSString *)groupId success:(void (^)(id responseObject))lvSuccess fail:(void (^)())lvFail;


.m

{
    NSMutableArray * _dataSource;
    
}

- (instancetype)init{
    self = [super init];
    if(self){
        [RCIM sharedRCIM].userInfoDataSource = self;
        [RCIM sharedRCIM].receiveMessageDelegate = self;
        [RCIM sharedRCIM].connectionStatusDelegate = self;


        [self initMArr];
    }
    return self;
}

- (void)initMArr{
    _dataSource = [[NSMutableArray alloc]init];
    self.rcFriendsArr = [[NSMutableArray alloc]init];
    self.rcGroupListMArr = [[NSMutableArray alloc]init];
}

+ (LVRCDataManager *)shareManager{
    static LVRCDataManager * manager = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate,^{
        manager = [[self alloc]init];
    });
    return manager;
}

- (void)syncFriendList:(void (^)(NSMutableArray *, BOOL))completion{
    
    //网络获取好友列表,赋值给单例好友数组
    [_dataSource removeAllObjects];
    for(LVUserItem * item in [LVUserInfoManager managerCenter].lvMyFriendsArr){
        
        RCUserInfo * userInfo = [[RCUserInfo alloc]init];
        userInfo.userId = item.itemUserId;
        userInfo.name = item.itemUserName;
        userInfo.portraitUri = item.itemUserHead;
        userInfo.phone = item.itemUserPhone;
        userInfo.realName = item.itemUserRealName;
        [_dataSource addObject:userInfo];
        
    }
    [LVRCDataManager shareManager].rcFriendsArr = _dataSource;
    
    completion(_dataSource,YES);
    
    [[NSNotificationCenter defaultCenter] postNotificationName:@"lvSyncFriendListFinish" object:nil];
    
}

- (void)syncGroupList:(void (^)(NSMutableArray *, BOOL))completion{
    
  NSMutableArray * lvGroupListMArr = [[NSMutableArray alloc]init];
  for(LVGroupItem * groupItem in [LVUserInfoManager managerCenter].lvMyGroupListMArr){
    
    RCGroup * rcGroup = [[RCGroup alloc]init];
    rcGroup.groupId = groupItem.itemGroupId;
    rcGroup.groupName = groupItem.itemGroupName;
      NSLog(@"\n群组列表群组头像:%@\n",groupItem.itemGroupPortrait);
    rcGroup.portraitUri = groupItem.itemGroupPortrait;
    [lvGroupListMArr addObject:rcGroup];
      
    }
    self.rcGroupListMArr = [NSMutableArray arrayWithArray:lvGroupListMArr];
    completion(lvGroupListMArr,YES);
    
    [[NSNotificationCenter defaultCenter] postNotificationName:@"lvSyncGroupListFinish" object:nil];

}

- (RCUserInfo*)currentUserInfoWithUserId:(NSString *)userId{
    for(NSInteger i=0;i<[LVRCDataManager shareManager].rcFriendsArr.count;i++){
        RCUserInfo * lvUser = [[LVRCDataManager shareManager].rcFriendsArr objectAtIndex:i];
        if([userId isEqualToString:lvUser.userId]){
            return lvUser;
        }
    }
    
    return nil;
}

- (NSString *)currentNameWithUserId:(NSString *)userId{
    for(NSInteger i = 0;i<[LVRCDataManager shareManager].rcFriendsArr.count;i++){
        RCUserInfo * lvUser = [[LVUserInfoManager managerCenter].lvMyFriendsArr objectAtIndex:i];
        if([userId isEqualToString:lvUser.userId]){
            NSLog(@"current=%@",lvUser.name);
            return lvUser.name;
        }
    }
    return nil;
    
}

- (RCGroup *)currentGroupInfoWithGroupId:(NSString *)groupId{
    
    for(NSInteger i=0;i<[LVRCDataManager shareManager].rcGroupListMArr.count;i++){
        RCGroup * lvGroup = [[LVRCDataManager shareManager].rcGroupListMArr objectAtIndex:i];
        if([groupId isEqualToString:lvGroup.groupId]){
            return lvGroup;
        }
    }
    
    return nil;
    
}

- (void)lvRCGetGroupMembersListWithGroupId:(NSString *)groupId success:(void (^)(id responseObject))lvSuccess fail:(void (^)())lvFail{
    
    __block NSMutableArray * lvGroupMembersMArr = [[NSMutableArray alloc]init];
    __block NSMutableArray * rcGroupMembersMArr = [[NSMutableArray alloc]init];

    [LVUserInfoManager lvGetGroupMembersListWithGroupId:groupId success:^(id responseObject) {
        lvGroupMembersMArr = [NSMutableArray arrayWithArray:responseObject];
        for(LVUserItem * item in lvGroupMembersMArr){
            
            RCUserInfo * userInfo = [[RCUserInfo alloc]init];
            userInfo.userId = item.itemUserId;
            userInfo.name = item.itemUserName;
            userInfo.portraitUri = item.itemUserHead;
            userInfo.phone = item.itemUserPhone;
            userInfo.realName = item.itemUserRealName;
            [rcGroupMembersMArr addObject:userInfo];
            
        }
        if(lvSuccess){
            lvSuccess(rcGroupMembersMArr);
        }
    } fail:^{
        
    }];
}


#pragma mark-lv ------------------代理位置-----------------------------------------
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *))completion{
    
    if(userId == nil || userId.length == 0){
        completion(nil);
        return;
    }
    
    if([userId isEqualToString:[RCIM sharedRCIM].currentUserInfo.userId]){
        
        RCUserInfo * myselfInfo = [[RCUserInfo alloc]initWithUserId:[RCIM sharedRCIM].currentUserInfo.userId name:[RCIM sharedRCIM].currentUserInfo.name portrait:[RCIM sharedRCIM].currentUserInfo.portraitUri phone:[RCIM sharedRCIM].currentUserInfo.phone schoolName:[RCIM sharedRCIM].currentUserInfo.schoolName realName:[RCIM sharedRCIM].currentUserInfo.realName];
        completion(myselfInfo);
        
       
        }
    
    
    for (NSInteger i = 0; i<[LVRCDataManager shareManager].rcFriendsArr.count; i++) {
        
        RCUserInfo *lvUser = [LVRCDataManager shareManager].rcFriendsArr[i];
        
        if ([userId isEqualToString:lvUser.userId]) {
            
            completion(lvUser);
            
        }
        
    }

    
}

- (void)getGroupInfoWithGroupId:(NSString *)groupId completion:(void (^)(RCGroup *))completion{
    NSLog(@"getGroupInfoWithGroupId");
    for(RCGroup * rcGroup in [LVRCDataManager shareManager].rcGroupListMArr){
        NSLog(@"\n你的:%@\n",rcGroup.portraitUri);
        if([rcGroup.groupId isEqualToString:groupId]){
            completion(rcGroup);
            break;
        }
    }
}

- (void)loginRongCloudWithUserInfo:(RCUserInfo *)userInfo withToken:(NSString *)token{
    
    [[RCIM sharedRCIM] connectWithToken:token success:^(NSString *userId) {
        
        [RCIM sharedRCIM].globalNavigationBarTintColor = [UIColor whiteColor];
        
        [self syncFriendList:^(NSMutableArray *friends, BOOL isSuccess) {
            if(isSuccess){
                
                NSLog(@"\n登录融云成功\n");
                
                
            }
        }];
        
        [RCIMClient sharedRCIMClient].currentUserInfo = userInfo;
        [[LVRCDataManager shareManager] refreshBadgeValue];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"lvSetRCLoginUserInfo" object:nil];

        
    } error:^(RCConnectErrorCode status) {
        NSLog(@"status = %ld",(long)status);

        
    } tokenIncorrect:^{
        self.lvSuccess = NO;
        
    }];
}

- (void)refreshBadgeValue{
    
    dispatch_async(dispatch_get_main_queue(), ^{
        
        NSInteger  unreadMsgCount = (NSInteger)[[RCIMClient sharedRCIMClient] getUnreadCount:@[@(ConversationType_PRIVATE),@(ConversationType_DISCUSSION),@(ConversationType_GROUP)]];
        
        NSLog(@"未读消息数:%ld",unreadMsgCount);
        if(unreadMsgCount >0){
            [LVRemoteNotificationManager managerCenter].lvUnreadMessageCount = [NSString stringWithFormat:@"%ld",unreadMsgCount];
            
            [UIApplication sharedApplication].applicationIconBadgeNumber = unreadMsgCount;

        }else{
            if([LVRemoteNotificationManager managerCenter].lvUnreadMessageCount){
                [LVRemoteNotificationManager managerCenter].lvUnreadMessageCount = @"0";

            }

        }
        AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
        
        UINavigationController  *chatNav = appDelegate.tabBarController.viewControllers[2];
        
        if (unreadMsgCount == 0) {
            chatNav.tabBarItem.badgeValue = nil;
        }else{
            chatNav.tabBarItem.badgeValue = [NSString stringWithFormat:@"%li",(long)unreadMsgCount];
        }
        
        
    });
    
}

- (BOOL)hasTheFriendWithUserId:(NSString *)userId{
   
    if([LVRCDataManager shareManager].rcFriendsArr.count){
        NSMutableArray * tempArr = [[NSMutableArray alloc]init];
        
        for(RCUserInfo * lvUserInfo in [LVRCDataManager shareManager].rcFriendsArr){
            [tempArr addObject:lvUserInfo.userId];
        }
        
        if([tempArr containsObject:userId]){
            return YES;
        }
    }
    return NO;
    
}

- (void)onRCIMReceiveMessage:(RCMessage *)message left:(int)left{
    NSLog(@"LVRCDataManager-onRCIMReceiveMessageType:%ld",message.conversationType);
    if(message.conversationType == ConversationType_SYSTEM){
        [LVUserInfoManager lvSyncMyFriendsList];
    }
    [self refreshBadgeValue];
    
    NSString *extraString = [[message valueForKey:@"content"] valueForKey:@"extra"];
    if (extraString)
    {
        NSData *jsonData = [extraString dataUsingEncoding:NSUTF8StringEncoding];
        NSError *err;
        if (jsonData) {
            NSDictionary *userInfoDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
            if (userInfoDic) {
                LVUserItem * lvOppositeItem = [LVUserInfoManager lvGetCurrentUserInfoWithUserId:userInfoDic[@"sendUsersId"]];
                
                
                RCUserInfo *theLastedInfo = [[RCUserInfo alloc]initWithUserId:userInfoDic[@"sendUsersId"] name:userInfoDic[@"sendUsersName"]portrait:userInfoDic[@"sendUsersPhoto"]];
                
                if (![userInfoDic[@"sendUsersPhoto"] isEqualToString:lvOppositeItem.itemUserHead] || ![userInfoDic[@"sendUsersName"] isEqualToString:lvOppositeItem.itemUserName]) {
                    
                        [LVUserInfoManager lvSyncMyFriendsList];

                        [[RCIM sharedRCIM] refreshUserInfoCache:theLastedInfo withUserId:lvOppositeItem.itemUserId];

                  
                
                };
            };
        };
    }
}

- (void)onRCIMConnectionStatusChanged:(RCConnectionStatus)status{
    NSLog(@"LVRCDataManageronRCIMConnectionStatusChanged:%ld",status);
    if(status == ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT){
        UIAlertView *alert = [[UIAlertView alloc]
                              initWithTitle:nil
                              message:@"您的帐号已在别的设备上登录,\n您被迫下线!"
                              delegate:self
                              cancelButtonTitle:@"知道了"
                              otherButtonTitles:nil, nil];
        [alert show];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    [[RCIMClient sharedRCIMClient] disconnect:YES];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"LVOFFLINE" object:nil];
    
}

- (void)getAllMembersOfGroup:(NSString *)groupId result:(void (^)(NSArray<NSString *> *))resultBlock{
    [LVUserInfoManager lvGetGroupMembersListWithGroupId:groupId success:^(id responseObject) {
        NSMutableArray *lvResult =
        [[NSMutableArray alloc] init];
        for (LVUserItem *item in responseObject) {
            [lvResult addObject:item.itemUserId];
            NSLog(@"\n群成员id:%@\n",item.itemUserId);
        }
        resultBlock(lvResult);
        
    } fail:^{
        
    }];
    
    
}

  暂时只总结这些,时间长了也忘记了还有什么重要的地方了,大家如果有什么问题尽管发言啊?我会及时回答的。

  QQ技术群:549943887

  希望大家多多支持哈, github:  http://github.com/cryboyofyu

  github上有自己写的开源库,cocoapods直接集成,大家如果需要的话,去支持一下,谢谢!!!








  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值