環(huán)信聊天自定義消息列表以及頭像昵稱問題

最近在弄環(huán)信,感覺接入還是比較容易的,網(wǎng)上大把教程,就不贅述了。但是后面根據(jù)需求的修改比較考驗(yàn)?zāi)托摹?。?/p>

我不知道別人怎么跑的官方demo,反正我是沒跑起來。。不過沒啥關(guān)系啊,簡單說下結(jié)構(gòu)咯,相信你自己也看得到:

是不是很簡單,比較懶,就沒拖在相鄰位置,有強(qiáng)迫癥的勿怪。我們要看的大概就是這個(gè)消息列表和聊天頁面了。

我是自己寫的一個(gè)消息列表頁面,網(wǎng)上有的直接用的EaseConversationListViewController,也有繼承一個(gè)EaseConversationListViewController的,其實(shí)都可以,因?yàn)橐婚_始我就自己寫了,后面就懶得改了。貼一點(diǎn)我自己的代碼:

首先,遵循相關(guān)的代理,有群組聊天的還要添加EMGroupManagerDelegate,并實(shí)現(xiàn)- (void)didUpdateGroupList:(NSArray *)groupList方法。

然后在viewWillAppear里,需要注冊(cè)消息通知,記得viewWillDisAppear里注銷咯~

接下來是重點(diǎn):

messagesDidReceive是接受消息的代理方法,tableViewDidTriggerHeaderRefresh是獲取會(huì)話列表的方法,獲取到conversations并依次加入數(shù)據(jù)源中。

/*!

@method

@brief 加載會(huì)話列表

@discussion

@result

*/

- (void)tableViewDidTriggerHeaderRefresh

{

? ? NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations];

? ? NSArray* sorted = [conversations sortedArrayUsingComparator:

? ? ? ? ? ? ? ? ? ? ? ^(EMConversation *obj1, EMConversation* obj2){

? ? ? ? ? ? ? ? ? ? ? ? ? EMMessage *message1 = [obj1 latestMessage];

? ? ? ? ? ? ? ? ? ? ? ? ? EMMessage *message2 = [obj2 latestMessage];

? ? ? ? ? ? ? ? ? ? ? ? ? if(message1.timestamp > message2.timestamp) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return(NSComparisonResult)NSOrderedAscending;

? ? ? ? ? ? ? ? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return(NSComparisonResult)NSOrderedDescending;

? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? }];

? ? [self.dataArr removeAllObjects];

? ? for (EMConversation *converstion in sorted) {

? ? ? ? EaseConversationModel *model = nil;

? ? ? ? model = [[EaseConversationModel alloc] initWithConversation:converstion];

? ? ? ? if (model) {

? ? ? ? ? ? [self.dataArr addObject:model];

? ? ? ? }

? ? }

? ? NSLog(@"data == %@",self.dataArr);

? ? [self.tableview reloadData];

}

然后,在自己的- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath方法中,我自定義了一個(gè)cell來坐消息列表顯示

id model = [self.dataArr objectAtIndex:indexPath.row]; 就是獲取到當(dāng)前cell的會(huì)話model。

有兩個(gè)private的方法也貼一下:


/*! @method @brief 獲取會(huì)話最近一條消息內(nèi)容提示 @discussion @param conversationModel 會(huì)話model @result 返回傳入會(huì)話model最近一條消息提示 */

- (NSString *)_latestMessageTitleForConversationModel:(id)conversationModel

{

? ? NSString *latestMessageTitle = @"";

? ? EMMessage *lastMessage = [conversationModel.conversation latestMessage];

? ? if (lastMessage) {

? ? ? ? EMMessageBody *messageBody = lastMessage.body;

? ? ? ? switch (messageBody.type) {

? ? ? ? ? ? case EMMessageBodyTypeImage:{

? ? ? ? ? ? ? ? latestMessageTitle = NSEaseLocalizedString(@"message.image1", @"[image]");

? ? ? ? ? ? } break;

? ? ? ? ? ? case EMMessageBodyTypeText:{

? ? ? ? ? ? ? ? NSString *didReceiveText = [EaseConvertToCommonEmoticonsHelper

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? convertToSystemEmoticons:((EMTextMessageBody *)messageBody).text];

? ? ? ? ? ? ? ? latestMessageTitle = didReceiveText;

? ? ? ? ? ? } break;

? ? ? ? ? ? case EMMessageBodyTypeVoice:{

? ? ? ? ? ? ? ? latestMessageTitle = NSEaseLocalizedString(@"message.voice1", @"[voice]");

? ? ? ? ? ? } break;

? ? ? ? ? ? case EMMessageBodyTypeLocation: {

? ? ? ? ? ? ? ? latestMessageTitle = NSEaseLocalizedString(@"message.location1", @"[location]");

? ? ? ? ? ? } break;

? ? ? ? ? ? case EMMessageBodyTypeVideo: {

? ? ? ? ? ? ? ? latestMessageTitle = NSEaseLocalizedString(@"message.video1", @"[video]");

? ? ? ? ? ? } break;

? ? ? ? ? ? case EMMessageBodyTypeFile: {

? ? ? ? ? ? ? ? latestMessageTitle = NSEaseLocalizedString(@"message.file1", @"[file]");

? ? ? ? ? ? } break;

? ? ? ? ? ? default: {

? ? ? ? ? ? } break;

? ? ? ? }

? ? }

? ? return latestMessageTitle;

}


/*! @method @brief 獲取會(huì)話最近一條消息時(shí)間 @discussion @param conversationModel 會(huì)話model @result 返回傳入會(huì)話model最近一條消息時(shí)間 */- (NSString *)_latestMessageTimeForConversationModel:(id)conversationModel

{

? ? NSString *latestMessageTime = @"";

? ? EMMessage *lastMessage = [conversationModel.conversation latestMessage];;

? ? if (lastMessage) {

? ? ? ? double timeInterval = lastMessage.timestamp ;

? ? ? ? if(timeInterval > 140000000000) {

? ? ? ? ? ? timeInterval = timeInterval / 1000;

? ? ? ? }

? ? ? ? NSDateFormatter* formatter = [[NSDateFormatter alloc]init];

? ? ? ? [formatter setDateFormat:@"YYYY-MM-dd"];

? ? ? ? latestMessageTime = [formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:timeInterval]];

? ? }

? ? return latestMessageTime;

}


關(guān)于聊天頁面的話,可以寫一個(gè)繼承EaseMessageViewController的VC,我是直接用的EaseMessageViewController。然后定義了一個(gè)公共方法,push到creat的聊天頁面

chatBarMoreView是底部的菜單欄,根據(jù)需求,加入新的按鈕和圖案,- (void)messageViewController:(EaseMessageViewController *)viewController ? didSelectMoreView:(EaseChatBarMoreView *)moreView AtIndex:(NSInteger)index實(shí)現(xiàn)點(diǎn)擊方法。此方法需遵循EaseMessageViewControllerDelegate代理


另外,關(guān)于聊天的頭像和昵稱,需要用到message的擴(kuò)展功能,遵循代理EaseMessageViewControllerDataSource

官方提供的ext擴(kuò)展消息結(jié)構(gòu)


代理方法- (id)messageViewController:(EaseMessageViewController *)viewController modelForMessage:(EMMessage *)message,自己的頭像和昵稱,可以在登錄成功的方法里,存入本地,然后這里直接調(diào)用。而接受的消息里,也需要根據(jù)key去ext里取出相關(guān)的value。

#pragma mark - EaseMessageViewControllerDataSource

- (id)messageViewController:(EaseMessageViewController *)viewController modelForMessage:(EMMessage *)message{ id model = nil;

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

? ? if (model.isSender) {//自己發(fā)送

? ? ? ? model.message.ext = @{@"avatar":[[NSUserDefaults standardUserDefaults] objectForKey:@"headimgurl"],@"nickname":[[NSUserDefaults standardUserDefaults] objectForKey:@"nickname"]};

? ? ? ? //頭像

? ? ? ? model.avatarURLPath = [[NSUserDefaults standardUserDefaults] objectForKey:@"headimgurl"];

? ? ? ? //昵稱

? ? ? ? model.nickname = [[NSUserDefaults standardUserDefaults] objectForKey:@"nickname"];

? ? ? ? //頭像占位圖

? ? ? ? model.avatarImage = [UIImage imageNamed:@"toux.png"];

? ? }else{//對(duì)方發(fā)送

? ? ? ? //頭像占位圖

? ? ? ? model.avatarImage = [UIImage imageNamed:@"toux.png"];

? ? ? ? //頭像

? ? ? ? model.avatarURLPath = message.ext[@"avatar"];

? ? ? ? //昵稱

? ? ? ? model.nickname =? message.ext[@"nickname"];

? ?}

? ? return model;

}

just so easy。不知道說的清不清楚,??。有疑問的可以評(píng)論留言~~歡迎討論??

可以參考一個(gè)妹子程序媛的,感覺寫的比我仔細(xì),哈哈~妹子博文在此

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容