首页 > 代码库 > 菜鸟搞环信

菜鸟搞环信

刚完成了环信的相关工作,刚好有时间来写一下关于环信的东西

马上进入主题吧

 

1.关于如何集成环信。

  集成环信的话就不多说了

2.如何修改环信的昵称和头像。

  这个我认为是重点。我也是一个新手,都是一步一个脚印,慢慢踩踏过来的。

  我的做法是分两个,一个是利用环信的ext扩展作为突破口。第二个是利用本地缓存作为突破口。

  首先说一下,为什么有两个?

  因为,我们在发消息的时候,可以利用环信的ext扩展,把头像之类的东西,存到消息里面。这样,我们在发消息的时候就可以获得头像之类的东西,然后就可以更新chatview。这个仅仅作用于发消息。在我们接收到一条新消息的时候,就不能这么搞了。因为,如果你之前没有发送过消息给他,那么你的ext扩展就不能穿过去给他。这样就会造成只有你发过消息的人才能正常显示。这里就需要用到本地缓存了。

  大致的思路就这样,那么我们就分散一步一步来~~

 

A。首先把单聊发消息的这个给先实现。

从这里push到环信的会话列表。push之前安全起见,先本地化头像。。

- (void)pushToChatViewController{

    /// 新建一个会话

    if ([self.model.user_no isEqualToString:[UserInfo shareUserInfo].user_no]) {

        [MBProgressHUD showAndDismissInWindow:@"不能与自己聊天"];

        return;

    }

    NSString *name = self.model.user_niname;

    if (name.length == 0 || [name isEqualToString:@""]) {

        name = @"xx";

    }

    //TODO:这里我只是为了测试

    NSString *img = self.model.user_headimg;

    if (img.length == 0 || [img isEqualToString:@""]) {

        img = @"";

    }

    

    //保存用户的昵称和头像到数据库

    MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",name]];

    if (nickNameDB) {

        MCNickNameDB *n = [MCNickNameDB new];

        n.conversationId = self.userId;

        n.niname = name;

        n.headimg = img;

        BOOL nick = [nickNameDB.niname isEqualToString:n.niname];

        BOOL img = [nickNameDB.headimg isEqualToString:n.headimg];

        if (!nick || !img) {

            [MCNickNameDB deleteObjectsByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",n.conversationId]];

            [n save];

            MCNickNameDB *nickNameDB2 = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",n.conversationId]];

            DLog(@"%@",nickNameDB2);

        }

        

    }else{

        MCNickNameDB *n = [MCNickNameDB new];

        n.conversationId = self.userId;

        n.niname = name;

        n.headimg = img;

        [n save];

    }

    

    NSDictionary *ext = @{

                          EASE_Nicname_Other_Key:name,

                          EASE_Avatar_Other_Key:img

                          };

    ChatViewController *chatController = [[ChatViewController alloc] initWithConversationChatter:_userId conversationType:EMConversationTypeChat ext:ext];

    DLog(@"新建一个会话 ext == %@ ",ext);

    chatController.title = _model.user_niname;

    [self.navigationController pushViewController:chatController animated:YES];

}

  既然是发消息,那么久肯定跟EaseChatToolbar输入框有关了

  找到EaseChatToolbar  

- (void)sendFaceWithEmotion:(EaseEmotion *)emotion{

  if (emotion) {

         if ([self.delegate respondsToSelector:@selector(didSendText:withExt:)]) {

             NSString *name = EASE_Nik_Name_Value;

             NSString *img = EASE_Avatar_Value;

             if ([name isEqualToString:@""] || name.length == 0) {

                 name = EASE_Nik_Name_Def;

            }

            if ([img isEqualToString:@""] || img.length == 0) {

                img = EASE_Avatar_Def;

            }

            ///  兔斯基表情文本扩展

            NSDictionary *ext = @{

                                  EASEUI_EMOTION_DEFAULT_EXT:emotion,

                                  EASE_Avatar_Key:img,

                                  EASE_Nik_Name_Key:name

                                  };

            [self.delegate didSendText:emotion.emotionTitle withExt:ext];

            [self _willShowInputTextViewToHeight:[self _getTextViewContentH:self.inputTextView]];;

        }

    }

 

      }      

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

if ([text isEqualToString:@"\n"]) {

        if ([self.delegate respondsToSelector:@selector(didSendText:)]) {

            NSString *name = EASE_Nik_Name_Value;

            NSString *img = EASE_Avatar_Value;

            if ([name isEqualToString:@""] || name.length == 0) {

                name = EASE_Nik_Name_Def;

            }

            if ([img isEqualToString:@""] || img.length == 0) {

                img = EASE_Avatar_Def;

            }

           NSDictionary *ext = @{

                                  EASE_Avatar_Key:img,

                                  EASE_Nik_Name_Key:name

 

                                  };

            [self.delegate didSendText:textView.text withExt:ext];

            //结束

            self.inputTextView.text = @"";

            [self _willShowInputTextViewToHeight:[self _getTextViewContentH:self.inputTextView]];

        }

        return NO;

    }

    else if ([text isEqualToString:@"@"]) {

        if ([self.delegate respondsToSelector:@selector(didInputAtInLocation:)]) {

            if ([self.delegate didInputAtInLocation:range.location]) {

                [self _willShowInputTextViewToHeight:[self _getTextViewContentH:self.inputTextView]];

                return NO;

            }

        }

    }

    else if ([text length] == 0) {

        //delete one character

        if (range.length == 1 && [self.delegate respondsToSelector:@selector(didDeleteCharacterFromLocation:)]) {

            return ![self.delegate didDeleteCharacterFromLocation:range.location];

        }

    }

    return YES;

 

}

        

  在这两个方法上面 ,添加ext。。其实细心的人可以发现EaseChatToolbar的delegate是EaseMessageViewController

  所以也可以

  我比较建议在EaseMessageViewController,因为不管什么类型的消息都是走这个类的

 

  代码如下

 

- (void)didSendText:(NSString *)text withExt:(NSDictionary*)ext

{

    //TODO:这里是不包括 add的 

    DLog(@"消息的携带体是ext == %@",ext);

    DLog(@"img == %@, name == %@",ext[EASE_Avatar_Key],ext[EASE_Nik_Name_Def]);

    NSMutableDictionary *dic = [NSMutableDictionary dictionary];

    dic[EASE_Avatar_Key] = ext[EASE_Avatar_Key];

    dic[EASE_Nik_Name_Def] = ext[EASE_Nik_Name_Def];

    DLog(@"conversation == %@",_conversation.conversationId);

    if (self.conversation.type == 1) {/// 群聊

        MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",_conversation.conversationId]];

        dic[EASE_GroupID__Key] = nickNameDB.conversationId;

        dic[EASE_Nicname_Group_Key] = nickNameDB.niname;

        dic[EASE_Avatar_Group_Key] = nickNameDB.headimg;

        DLog(@"EASE_GroupID__Key == %@",dic[EASE_Nicname_Group_Key]);

    }

    

    

    if ([ext objectForKey:EASEUI_EMOTION_DEFAULT_EXT]) {

        EaseEmotion *emotion = [ext objectForKey:EASEUI_EMOTION_DEFAULT_EXT];

        if (self.dataSource && [self.dataSource respondsToSelector:@selector(emotionExtFormessageViewController:easeEmotion:)]) {

            /// 这里是纯兔斯基 发送  

            NSDictionary *emojiDic = [self.dataSource emotionExtFormessageViewController:self easeEmotion:emotion];

            if (self.conversation.type == 1) {/// 群聊

                dic[@"em_expression_id"] = emojiDic[@"em_expression_id"];

                dic[@"em_is_big_expression"] = emojiDic[@"em_is_big_expression"];

            }

            

            [self sendTextMessage:emotion.emotionTitle withExt:dic];

        } else {

            // 这里需要加上消息扩张

            if (self.conversation.type == 0) {

                [self sendTextMessage:emotion.emotionTitle withExt:

                 @{

                   MESSAGE_ATTR_EXPRESSION_ID:emotion.emotionId,MESSAGE_ATTR_IS_BIG_EXPRESSION:@(YES),

                   EASE_Avatar_Key:dic[EASE_Avatar_Key],

                   EASE_Nik_Name_Key:dic[EASE_Nik_Name_Key]

                   }

                 

                 ];

            }else{/// 群聊

                [self sendTextMessage:emotion.emotionTitle withExt:

                 @{

                   MESSAGE_ATTR_EXPRESSION_ID:emotion.emotionId,MESSAGE_ATTR_IS_BIG_EXPRESSION:@(YES),

                   EASE_Avatar_Key:dic[EASE_Avatar_Key],

                   EASE_Nik_Name_Key:dic[EASE_Nik_Name_Key],

                   EASE_Avatar_Group_Key:dic[EASE_Avatar_Group_Key],

                   EASE_Nicname_Group_Key:dic[EASE_Nicname_Group_Key],

                   EASE_GroupID__Key:dic[EASE_GroupID__Key]

                   }

                 

                 ];

            }

            

        }

        return;

    }

    if (text && text.length > 0) {

        /// 纯文字副本发送    

        if (self.conversation.type == 0) { 

            [self sendTextMessage:text withExt:ext];

        }else{/// 群聊

            [self sendTextMessage:text withExt:dic];

        }

        

    }

}

 

以上标有群聊的可以先忽略不做

在所有发消息的(兔斯基,表情,文字,表情+文字等等)统统加上ext

例如

- (void)sendTextMessage:(NSString *)text

{

    // NSDictionary *ext = nil;

    /// 在这里添加emoji 头像 

    NSString *name = EASE_Nik_Name_Value;

    NSString *img = EASE_Avatar_Value;

    if ([name isEqualToString:@""] || name.length == 0) {

        name = EASE_Nik_Name_Def;

    }

    if ([img isEqualToString:@""] || img.length == 0) {

        img = EASE_Avatar_Def;

    }

    

    NSMutableDictionary *ext = [NSMutableDictionary dictionary];

    ext[EASE_Avatar_Key] = img;

    ext[EASE_Nik_Name_Key] = name;

    

    if (self.conversation.type == 1) {//群聊

        MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",_conversation.conversationId]];

        ext[EASE_GroupID__Key] = nickNameDB.conversationId;

        ext[EASE_Nicname_Group_Key] = nickNameDB.niname;

        ext[EASE_Avatar_Group_Key] = nickNameDB.headimg;

        DLog(@"EASE_GroupID__Key == %@",ext[EASE_Nicname_Group_Key]);

    }

    if (self.conversation.type == EMConversationTypeGroupChat) {

        NSArray *targets = [self _searchAtTargets:text];

        if ([targets count]) {

            __block BOOL atAll = NO;

            [targets enumerateObjectsUsingBlock:^(NSString *target, NSUInteger idx, BOOL *stop) {

                if ([target compare:kGroupMessageAtAll options:NSCaseInsensitiveSearch] == NSOrderedSame) {

                    atAll = YES;

                    *stop = YES;

                }

            }];

            if (atAll) {

                ext = @{kGroupMessageAtList: kGroupMessageAtAll};

            }

            else {

                ext = @{kGroupMessageAtList: targets};

            }

        }

    }

    [self sendTextMessage:text withExt:ext];

}

 

那么,所有的消息都带上了ext,基本上发消息的就完成了。

回到chatViewController里面

- (NSDictionary*)emotionExtFormessageViewController:(EaseMessageViewController *)viewController

                                        easeEmotion:(EaseEmotion*)easeEmotion{

    ///  兔斯基表情文本扩展

    NSString *name = EASE_Nik_Name_Value;

    NSString *img = EASE_Avatar_Value;

    if ([name isEqualToString:@""] || name.length == 0) {

        name = EASE_Nik_Name_Def;

    }

    if ([img isEqualToString:@""] || img.length == 0) {

        img = EASE_Avatar_Def;

    }

    return @{

             MESSAGE_ATTR_EXPRESSION_ID:easeEmotion.emotionId,MESSAGE_ATTR_IS_BIG_EXPRESSION:@(YES),

             EASE_Avatar_Key:img,

             EASE_Nik_Name_Key:name

             };

}

 

- (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController

                           modelForMessage:(EMMessage *)message{

    id<IMessageModel> model = nil;

    model = [[EaseMessageModel alloc] initWithMessage:message];

    //TODO:这里设置环信的头像

    NSDictionary *dic  = message.ext;

    NSString *userName = dic[EASE_Nik_Name_Key];

    NSString *sendUserImg = dic[EASE_Avatar_Key];

    model.avatarURLPath = sendUserImg;

    model.nickname = userName;

    UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:model.nickname];

    if (profileEntity) {

        model.avatarURLPath = profileEntity.imageUrl;

        model.nickname = profileEntity.nickname;

    }

    model.failImageName = @"imageDownloadFail";

    return model;

}

 

这样发消息就ok了。。。

下面就说一下接收消息,接收消息我用本地缓存。

接收消息的话,就找chatdemohelper

找到

/// 这里好重要   就是收到消息扩张 

- (void)didReceiveMessages:(NSArray *)aMessages

{

    //保存用户的昵称和头像到数据库

    BOOL isRefreshCons = YES;

    for(EMMessage *message in aMessages){

        

        DLog(@"EMChatType == %d  ext == %@",message.chatType,message.ext);

        

        if (message.chatType == 0) { // 单聊

            //保存用户的昵称和头像到数据库

            MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",message.conversationId]];

            if (nickNameDB) {

                MCNickNameDB *n = [MCNickNameDB new];

                n.conversationId = message.conversationId;

                n.niname = message.ext[EASE_Nik_Name_Key];

                n.headimg = message.ext[EASE_Avatar_Key];

                BOOL nick = [nickNameDB.niname isEqualToString:n.niname];

                BOOL img = [nickNameDB.headimg isEqualToString:n.headimg];

                if (!nick || !img) {

                    [MCNickNameDB deleteObjectsByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",message.conversationId]];

                    [n save];

                    MCNickNameDB *nickNameDB2 = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",message.conversationId]];

                    DLog(@"%@",nickNameDB2);

                }

                

            }else{

                MCNickNameDB *n = [MCNickNameDB new];

                n.conversationId = message.conversationId;

                n.niname = message.ext[EASE_Nik_Name_Key];

                n.headimg = message.ext[EASE_Avatar_Key];

                [n save];

            }

        }else{ //TODO: 聊天时 群聊

            //保存群聊的昵称和头像到数据库

            NSDictionary *ext = message.ext;

            MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",message.conversationId]];

            if (nickNameDB) {

                MCNickNameDB *n = [MCNickNameDB new];

                n.conversationId = ext[EASE_GroupID__Key];

                n.niname = ext[EASE_Nicname_Group_Key];

                n.headimg = ext[EASE_Avatar_Group_Key];

                BOOL nick = [nickNameDB.niname isEqualToString:n.niname];

                BOOL img = [nickNameDB.headimg isEqualToString:n.headimg];

                if (!nick || !img) {

                    [MCNickNameDB deleteObjectsByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",n.conversationId]];

                    [n save];

                    MCNickNameDB *nickNameDB2 = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",n.conversationId]];

                    DLog(@"%@",nickNameDB2);

                }

                

            }else{

                MCNickNameDB *n = [MCNickNameDB new];

                n.conversationId = ext[EASE_GroupID__Key];

                n.niname = ext[EASE_Nicname_Group_Key];;

                n.headimg = ext[EASE_Avatar_Group_Key];

                [n save];

            }

 

            

        }

        BOOL needShowNotification = (message.chatType != EMChatTypeChat) ? [self _needShowNotification:message.conversationId] : YES;

        

#ifdef REDPACKET_AVALABLE

        /**

         *  屏蔽红包被抢消息的提示

         */

        NSDictionary *dict = message.ext;

        needShowNotification = (dict && [dict valueForKey:RedpacketKeyRedpacketTakenMessageSign]) ? NO : needShowNotification;

#endif

        

        UIApplicationState state = [[UIApplication sharedApplication] applicationState];

        if (needShowNotification) {

#if !TARGET_IPHONE_SIMULATOR

            switch (state) {

                case UIApplicationStateActive:

                    [self.mainVC playSoundAndVibration];

                    break;

                case UIApplicationStateInactive:

                    [self.mainVC playSoundAndVibration];

                    break;

                case UIApplicationStateBackground:

                    [self.mainVC showNotificationWithMessage:message];

                    break;

                default:

                    break;

            }

#endif

        }

        

        if (_chatVC == nil) {

            _chatVC = [self _getCurrentChatView];

        }

        BOOL isChatting = NO;

        if (_chatVC) {

            isChatting = [message.conversationId isEqualToString:_chatVC.conversation.conversationId];

        }

        if (_chatVC == nil || !isChatting || state == UIApplicationStateBackground) {

            [self _handleReceivedAtMessage:message];

            

            if (self.conversationListVC) {

                [_conversationListVC refresh];

            }

            

            if (self.mainVC) {

                [_mainVC setupUnreadMessageCount];

            }

            return;

        }

        

        if (isChatting) {

            isRefreshCons = NO;

        }

    }

    

    if (isRefreshCons) {

        if (self.conversationListVC) {

            [_conversationListVC refresh];

        }

        

        if (self.mainVC) {

            [_mainVC setupUnreadMessageCount];

        }

    }

}

 

以上,,单聊的基本完成。。。。如果有遗漏,请留言,,

下面是群聊

其实群聊跟单聊是一样,,不过,就是给ext扩展再添加一个群的名称,一个群的头像。

然后在拿属性的时候,划分一下是群聊还是单聊。。。

这里就不一一到来,上面有标注群聊的大家可以看一下~~~

 

菜鸟搞环信