最近在弄環(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


代理方法- (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ì),哈哈~妹子博文在此