个人邮箱:892569921@qq.com 我的CSDN:http://blog.csdn.net/cry__boy
github: http://github.com/cryboyofyu
github上有自己写的开源库,cocoapods直接集成,大家如果需要的话,去支持一下,谢谢!!!
博客中还有其他技术文章,也可以去看看哈...
到现在为止做过三个社交类软件,刚开始想到的就是用第三方,因为即时通讯这个没有深厚的功底是弄不了滴。
比较:环信vs融云
首先声明本人只是开发者,并不是针对哪个平台。刚开始项目中用的环信,当时好像是1.0.3版本,当时还是菜鸟一枚,集成过来后,对方头像和自己头像显示不出来,消息到是能发,现在不记得了,环信头像的管理方式和融云不一样。
1.头像与昵称更新
环信:
昵称或头像处理的方法一和方法二区别:
方法二和方法一相比:
融云: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直接集成,大家如果需要的话,去支持一下,谢谢!!!