昵稱和頭像
注意:以下是在官方Demo3.0的基礎(chǔ)上修改的袱蜡。官方Demo下載地址
環(huán)信提供了獲取頭像和昵稱的兩種方式:
方法一 從APP服務(wù)器獲取昵稱和頭像
- 昵稱和頭像的獲人坎洹:當(dāng)收到一條消息(群消息)時(shí),得到發(fā)送者的用戶ID坪蚁,然后查找手機(jī)本地?cái)?shù)據(jù)庫是否有此用戶ID的昵稱和頭像奔穿,如沒有則調(diào)用APP服務(wù)器接口通過用戶ID查詢出昵稱和頭像镜沽,然后保存到本地?cái)?shù)據(jù)庫和緩存,下次此用戶發(fā)來信息即可直接查詢緩存或者本地?cái)?shù)據(jù)庫贱田,不需要再次向APP服務(wù)器發(fā)起請(qǐng)求
- 昵稱和頭像的更新:當(dāng)點(diǎn)擊發(fā)送者頭像時(shí)加載用戶詳情時(shí)從APP服務(wù)器查詢此用戶的具體信息然后更新本地?cái)?shù)據(jù)庫和緩存缅茉。當(dāng)用戶自己更新昵稱或頭像時(shí),也可以發(fā)送一條透傳消息到其他用戶和用戶所在的群男摧,來更新該用戶的昵稱和頭像蔬墩。
方法二 從消息擴(kuò)展中獲取昵稱和頭像
- 昵稱和頭像的獲取:把用戶基本的昵稱和頭像的URL放到消息的擴(kuò)展中耗拓,通過消息傳遞給接收方拇颅,當(dāng)收到一條消息時(shí),則能通過消息的擴(kuò)展得到發(fā)送者的昵稱和頭像URL乔询,然后保存到本地?cái)?shù)據(jù)庫和緩存蔬蕊。當(dāng)顯示昵稱和頭像時(shí),請(qǐng)從本地或者緩存中讀取哥谷,不要直接從消息中把賦值拿給界面(否則當(dāng)用戶昵稱改變后,同一個(gè)人會(huì)顯示不同的昵稱)麻献。
- 昵稱和頭像的更新:當(dāng)擴(kuò)展消息中的昵稱和頭像URI與當(dāng)前本地?cái)?shù)據(jù)庫和緩存中的相應(yīng)數(shù)據(jù)不同的時(shí)候们妥,需要把新的昵稱保存到本地?cái)?shù)據(jù)庫和緩存,并下載新的頭像并保存到本地?cái)?shù)據(jù)庫和緩存勉吻。
本文主要介紹第二種方法:給消息添加擴(kuò)展监婶,用于攜帶昵稱和頭像信息。先來看下效果:
效果圖
在消息發(fā)送時(shí)齿桃,設(shè)置并發(fā)送擴(kuò)展消息
- 因?yàn)槭窃诠俜紻emo里修改的惑惶,但對(duì)其還不熟悉,咋辦呢短纵?
其實(shí)带污,環(huán)信是基于XMPP優(yōu)化而來的,而XMPP消息又是基于XML的香到。已經(jīng)知道在XMPP里擴(kuò)展消息的方式了鱼冀,這里應(yīng)該也是類似的。只不過首先要找到發(fā)送消息的時(shí)機(jī)悠就∏鳎可是我不知道在哪?這里要善用搜索和斷點(diǎn)梗脾。下面簡要的說下我的思路:在項(xiàng)目里搜索【消息】荸型,找到了EaseChatToolbar.h
中的- (void)didSendText:(NSString *)text;
方法(別問我為什么是這個(gè)方法,不會(huì)告訴你我也是查了很久的)炸茧。然后在.m中該方法處設(shè)置斷點(diǎn)瑞妇,運(yùn)行程序稿静,輸入文字后點(diǎn)擊發(fā)送按鈕。然后看看程序執(zhí)行的流程是什么踪宠。依次向上修改方法自赔,添加頭像和昵稱信息。如圖:
工程截圖 - 修改
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
中的調(diào)用方法柳琢。并設(shè)定頭像和昵稱字典绍妨,代碼如下:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([text isEqualToString:@"\n"]) {
if ([self.delegate respondsToSelector:@selector(didSendText:)]) {
//注釋掉的 -- [self.delegate didSendText:textView.text];
//新增頭像和昵稱擴(kuò)展
NSDictionary *ext = @{@"accountName":accountName,@"img":@"http://7xo30v.com1.z0.glb.clouddn.com/animal.png"};
[self.delegate didSendText:textView.text withExt:ext];
//結(jié)束
self.inputTextView.text = @"";
[self _willShowInputTextViewToHeight:[self _getTextViewContentH:self.inputTextView]];;
}
return NO;
}
return YES;
}
- 從新運(yùn)行程序,發(fā)送消息柬脸,查看日志他去。在
<body>
元素里包含了額外添加的昵稱和頭像信息。如下:
ChatDemoJCV1[17136:720f] SEND: <message type="chat" to="easemob-demo#chatdemoui_zlanchun1@easemob.com" id="151a0fcc287"> <body>{"ext":{"img":"http://7xo30v.com1.z0.glb.clouddn.com/animal.png","accountName":"zlanchun"},"to":"zlanchun1","bodies":[{"type":"txt","msg":"You"}],"from":"zlanchun"}</body></message>
- 在聊天框中顯示消息里地頭像和昵稱倒堕。因?yàn)槭菧y試灾测,所以在
ChatViewController.m
直接將消息中的昵稱和頭像賦值給視圖(實(shí)際應(yīng)用中不推薦這么做,正如環(huán)信方法二缺點(diǎn)所說的垦巴,需要自己緩存媳搪,從本地提取信息)。
- (UITableViewCell *)messageViewController:(UITableView *)tableView cellForMessageModel:(id<IMessageModel>)model
{
if (model.bodyType == eMessageBodyType_Text ) {
NSString *CellIdentifier = [CustomMessageCell cellIdentifierWithModel:model];
//發(fā)送cell
CustomMessageCell *sendCell = (CustomMessageCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
if (sendCell == nil) {
sendCell = [[CustomMessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier model:model];
sendCell.selectionStyle = UITableViewCellSelectionStyleNone;
}
//設(shè)定頭像和昵稱
model.avatarURLPath = model.message.ext[@"img"];
model.nickname = model.message.ext[@"accountName"];
sendCell.model = model;
return sendCell;
}
return nil;
}
最后骤宣,這里只是修改了text類型消息的擴(kuò)展秦爆,還有其他幾種類型的消息擴(kuò)展也可以按照這樣來處理。