环信头像和昵称显示的详细、详细、详细教程!

写在前边:本文由江南大神的环信集成demo衍生而来!

附上大神的集成链接:http://www.imgeek.org/article/825307886

通过官方的文档我们知道有两种显示头像和昵称的方式(http://docs.easemob.com/im/490integrationcases/10nickname官方文档)

这里主要讲方式二!(通过扩展消息传递显示)

这里主要有三个类需要改,分别是:

EaseMessageViewController

EaseBaseMessageCell

chatUIhelper

首先我们需要在发送消息的时候添加扩展字段,在EaseMessageViewController.m里。可以看到有以下方法:

#pragma mark - send message- (void)_refreshAfterSentMessage:(EMMessage*)aMessage{    if ([self.messsagesSource count] &&[EMClient sharedClient].options.sortMessageByServerTime) {        NSString *msgId = aMessage.messageId;        EMMessage *last = self.messsagesSource.lastObject;        if ([last isKindOfClass:[EMMessage class]]) {                        __block NSUInteger index = NSNotFound;            index = NSNotFound;[self.messsagesSource enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(EMMessage *obj, NSUInteger idx, BOOL *stop) {                if ([obj isKindOfClass:[EMMessage class]] &&[obj.messageId isEqualToString:msgId]) {                    index = idx;                    *stop = YES;                }            }];            if (index != NSNotFound) {[self.messsagesSource removeObjectAtIndex:index];[self.messsagesSource addObject:aMessage];                                //格式化消息                self.messageTimeIntervalTag = -1;                NSArray *formattedMessages =[self formatMessages:self.messsagesSource];[self.dataArray removeAllObjects];[self.dataArray addObjectsFromArray:formattedMessages];[self.tableView reloadData];[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[self.dataArray count] - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];                return;            }        }    }[self.tableView reloadData];}- (void)_sendMessage:(EMMessage *)message{    if (self.conversation.type == EMConversationTypeGroupChat){        message.chatType = EMChatTypeGroupChat;    }    else if (self.conversation.type == EMConversationTypeChatRoom){        message.chatType = EMChatTypeChatRoom;    }[self addMessageToDataSource:message                        progress:nil];        __weak typeof(self) weakself = self;[[EMClient sharedClient].chatManager sendMessage:message progress:nil completion:^(EMMessage *aMessage, EMError *aError) {        if (!aError) {[weakself _refreshAfterSentMessage:aMessage];        }        else {[weakself.tableView reloadData];        }    }];}- (void)sendTextMessage:(NSString *)text{    NSDictionary *ext = nil;    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];}- (void)sendTextMessage:(NSString *)text withExt:(NSDictionary*)ext{    EMMessage *message =[EaseSDKHelper sendTextMessage:text                                                  to:self.conversation.conversationId                                          messageType:[self _messageTypeFromConversationType]                                          messageExt:ext];[self _sendMessage:message];}- (void)sendLocationMessageLatitude:(double)latitude                          longitude:(double)longitude                        andAddress:(NSString *)address{    EMMessage *message =[EaseSDKHelper sendLocationMessageWithLatitude:latitude                                                            longitude:longitude                                                              address:address                                                                  to:self.conversation.conversationId                                                          messageType:[self _messageTypeFromConversationType]                                                          messageExt:nil];[self _sendMessage:message];}- (void)sendImageMessageWithData:(NSData *)imageData{    id progress = nil;    if (_dataSource &&[_dataSource respondsToSelector:@selector(messageViewController:progressDelegateForMessageBodyType:)]) {        progress =[_dataSource messageViewController:self progressDelegateForMessageBodyType:EMMessageBodyTypeImage];    }    else{        progress = self;    }        EMMessage *message =[EaseSDKHelper sendImageMessageWithImageData:imageData                                                                  to:self.conversation.conversationId                                                          messageType:[self _messageTypeFromConversationType]                                                          messageExt:nil];[self _sendMessage:message];}- (void)sendImageMessage:(UIImage *)image{    id progress = nil;    if (_dataSource &&[_dataSource respondsToSelector:@selector(messageViewController:progressDelegateForMessageBodyType:)]) {        progress =[_dataSource messageViewController:self progressDelegateForMessageBodyType:EMMessageBodyTypeImage];    }    else{        progress = self;    }        EMMessage *message =[EaseSDKHelper sendImageMessageWithImage:image                                                            to:self.conversation.conversationId                                                    messageType:[self _messageTypeFromConversationType]                                                    messageExt:nil];[self _sendMessage:message];}- (void)sendVoiceMessageWithLocalPath:(NSString *)localPath                            duration:(NSInteger)duration{    id progress = nil;    if (_dataSource &&[_dataSource respondsToSelector:@selector(messageViewController:progressDelegateForMessageBodyType:)]) {        progress =[_dataSource messageViewController:self progressDelegateForMessageBodyType:EMMessageBodyTypeVoice];    }    else{        progress = self;    }        EMMessage *message =[EaseSDKHelper sendVoiceMessageWithLocalPath:localPath                                                          duration:duration                                                                to:self.conversation.conversationId                                                        messageType:[self _messageTypeFromConversationType]                                                        messageExt:nil];[self _sendMessage:message];}- (void)sendVideoMessageWithURL:(NSURL *)url{    id progress = nil;    if (_dataSource &&[_dataSource respondsToSelector:@selector(messageViewController:progressDelegateForMessageBodyType:)]) {        progress =[_dataSource messageViewController:self progressDelegateForMessageBodyType:EMMessageBodyTypeVideo];    }    else{        progress = self;    }        EMMessage *message =[EaseSDKHelper sendVideoMessageWithURL:url                                                          to:self.conversation.conversationId                                                  messageType:[self _messageTypeFromConversationType]                                                  messageExt:nil];[self _sendMessage:message];}

有发送各种消息的,我们要每个里边都加扩展字段么?那恐怕要累死咯!  仔细看会发现发送消息的方法最后都会走一个方法:

- (void)_sendMessage:(EMMessage *)message{    if (self.conversation.type == EMConversationTypeGroupChat){        message.chatType = EMChatTypeGroupChat;    }    else if (self.conversation.type == EMConversationTypeChatRoom){        message.chatType = EMChatTypeChatRoom;    }[self addMessageToDataSource:message                        progress:nil];        __weak typeof(self) weakself = self;[[EMClient sharedClient].chatManager sendMessage:message progress:nil completion:^(EMMessage *aMessage, EMError *aError) {        if (!aError) {[weakself _refreshAfterSentMessage:aMessage];        }        else {[weakself.tableView reloadData];        }    }];}

好的,就是这里了,添加扩展字段,包含用户的头像地址,昵称和环信ID。 找到保存用户信息的类UserCacheInfo,找到相应的字段,在这个方法里添加如下代码:

NSMutableDictionary *Muext =[NSMutableDictionary dictionaryWithDictionary:message.ext];    UserCacheInfo *info =[UserCacheManager currUser];[Muext setObject:kCurrEaseUserId forKey:kChatUserId];[Muext setObject:info.NickName forKey:kChatUserNick];[Muext setObject:info.AvatarUrl forKey:kChatUserPic];    message.ext = Muext;

这样第一步就完成了!

接下来我们要在接收消息的方法里保存传过来的扩展消息里的头像、昵称和环信ID,这就用到chatUIhelper.m这个类,这个方法里:

- (void)didReceiveMessages:(NSArray *)aMessages{    BOOL isRefreshCons = YES;    for(EMMessage *message in aMessages){[UserCacheManager saveInfo:message.ext];// 通过消息的扩展属性传递昵称和头像时,需要调用这句代码缓存        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 playSoundAndVibration];                    break;                case UIApplicationStateInactive:[self playSoundAndVibration];                    break;                case UIApplicationStateBackground:[self 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) {                NOTIFY_POST(kSetupUnreadMessageCount);            }            return;        }                if (isChatting) {            isRefreshCons = NO;        }    }        if (isRefreshCons) {        if (self.conversationListVC) {[_conversationListVC refresh];        }                if (self.mainVC) {            NOTIFY_POST(kSetupUnreadMessageCount);        }    }}

关键就是这句话:

[UserCacheManager saveInfo:message.ext];// 通过消息的扩展属性传递昵称和头像时,需要调用这句代码缓存!!!

到这里头像和昵称的问题就基本解决了!

重要的总是留在最后!!!  不看后悔哦!!!

上两步完成后你会惊奇的发现头像和昵称正常显示了,然而当你换个头像测试的时候,你会发现很不美妙,头像没有更换,这是什么问题呢?   这就要用到开始讲到的第一个类EaseBaseMessageCell.m,我们仔细看代码会发现它是怎么赋值的,如下:

#pragma mark - setter- (void)setModel:(id)model{[super setModel:model];        if (model.avatarURLPath) {[self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.avatarURLPath] placeholderImage:model.avatarImage];    } else {        self.avatarView.image = model.avatarImage;    }    _nameLabel.text = model.nickname;        if (self.model.isSender) {        _hasRead.hidden = YES;        switch (self.model.messageStatus) {            case EMMessageStatusDelivering:            {                _statusButton.hidden = YES;[_activity setHidden:NO];[_activity startAnimating];            }                break;            case EMMessageStatusSuccessed:            {                _statusButton.hidden = YES;[_activity stopAnimating];                if (self.model.isMessageRead) {                    _hasRead.hidden = NO;                }            }                break;            case EMMessageStatusPending:            case EMMessageStatusFailed:            {[_activity stopAnimating];[_activity setHidden:YES];                _statusButton.hidden = NO;            }                break;            default:                break;        }    }}

看到这里就明白了是头像缓存了,直接用的是缓存里的头像,我们需要更新的话直接设置一下缓存策略就可以了,代码修改如下:

把[self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.avatarURLPath] placeholderImage:model.avatarImage];改成[self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.avatarURLPath] placeholderImage:model.avatarImage options:EMSDWebImageRefreshCached];

然后运行一下你会发现世界如此美好,大功告成!

对各位小伙伴you有没有帮助呢?

如有任何问题,请咨询【环信IM互帮互助群】,群号:340452063 (进群记得改名片哦!江南大神也在群里!)

本人群里的名片:上海-iOS-小码农  。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容