// // ChatViewController.m // myWatch // XX的家 // Created by mobao on 15/9/30. // Copyright (c) 2015年 xTT. All rights reserved. // #import "ChatViewController.h" #import #import "AppDelegate.h" #import "XHDisplayTextViewController.h" #import "XHDisplayMediaViewController.h" #import "XHDisplayLocationViewController.h" #import "XHAudioPlayerHelper.h" #import "XHImageViewer.h" #import "MJRefresh.h" #import "Locate.h" #import "ChatPresenter.h" #import "MyMQTT.h" #import "CJFileUtility.h" #import "VoiceConverter.h" //#import "VideoTabPopView.h" @interface ChatViewController () { ChatPresenter *presenter; } @property (nonatomic, strong) NSArray *emotionManagers; @property (nonatomic ,assign) NSInteger page; @end @implementation ChatViewController - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[XHAudioPlayerHelper shareInstance] stopAudio]; [self cancelRecord]; AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; [app initIQKeyBorard]; } - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; // self.title = self.infoCircle.group_name; self.messageSender = self.infoUser.name; [self reloadTableView]; AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; [app closeIQKeyBorard]; } #pragma app前后台 - (void)applicationWillResignActive:(NSNotification *)notification{ [[XHAudioPlayerHelper shareInstance] stopAudio]; [self cancelRecord]; } - (void)applicationDidBecomeActive:(NSNotification *)notification{ [self clearCornerMark]; if(cUser){ XHMessage *message = self.messages.lastObject; if(message){ [self getFamilyMessageLastMsg:message.id]; } }else{ [self.messages removeAllObjects]; self.messages = nil; } } #pragma mark 获取聊天信息(群聊) /// 获取聊天信息(群聊) - (void)getFamilyMessageRecv:(NSString *)messageid { [[XHAudioPlayerHelper shareInstance] stopAudio]; WEAKSELF [presenter P_getFamilyMessageRecv:messageid block:^(NSMutableArray *messageArr) { if (messageArr.count > 0) { [weakSelf.messages insertObjects:messageArr atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, messageArr.count)]]; messageArr = [weakSelf setMessagesHide:messageArr]; [weakSelf reloadTableView]; [weakSelf.messageTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:messageArr.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; } [weakSelf.messageTableView.mj_header endRefreshing]; }]; } #pragma mark 获取聊天信息(单聊) /// 获取聊天信息(单聊) - (void)getSingleMessage { [[XHAudioPlayerHelper shareInstance] stopAudio]; WEAKSELF [presenter P_getSingleFamilyMessageRecv:self.imei page:self.page block:^(NSMutableArray *messageArr) { self.page ++; if (messageArr.count > 0) { [weakSelf.messages insertObjects:messageArr atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, messageArr.count)]]; messageArr = [weakSelf setMessagesHide:messageArr]; [weakSelf reloadTableView]; [weakSelf.messageTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:messageArr.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; } [weakSelf.messageTableView.mj_header endRefreshing]; }]; } /** 查询 id 之后的消息 @param lastMsgid 消息id */ - (void)getFamilyMessageLastMsg:(NSString *)lastMsgid{ [[XHAudioPlayerHelper shareInstance] stopAudio]; WEAKSELF [presenter P_getFamilyMessageLastMsg:lastMsgid block:^(NSMutableArray *messageArr) { if (messageArr.count > 0) { [weakSelf.messages insertObjects:messageArr atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(weakSelf.messages.count, messageArr.count)]]; messageArr = [weakSelf setMessagesHide:messageArr]; [weakSelf reloadTableView]; [weakSelf.messageTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:weakSelf.messages.count-1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; } [weakSelf.messageTableView.mj_header endRefreshing]; }]; } - (NSMutableArray *)setMessagesHide:(NSMutableArray *)messages{ NSMutableArray *arr = [NSMutableArray arrayWithArray:messages]; [messages enumerateObjectsUsingBlock:^(XHMessage *obj, NSUInteger idx, BOOL * _Nonnull stop) { Device *device = [self.infoCircle getDeviceWithIMEI:obj.senderID]; if (device && [obj.type isEqual:@10005]) { if (!device.upDownNotice || ![device.upDownNotice boolValue]) { obj.hide = YES; [arr removeObject:obj]; }else{ obj.hide = NO; } } }]; return arr; } - (void)reloadTableView{ [self setMessagesHide:self.messages]; [self.messageTableView reloadData]; } - (void)viewDidLoad { // self.allowsSendText = YES; // self.allowsSendFace = YES; // self.allowsSendMultiMedia = NO; // self.allowsSendVoice = YES; [super viewDidLoad]; // Do any additional setup after loading the view. self.page = 0; self.zx_navRightBtn.zx_fixImageSize = ImageName_(@"chat_nav_icon_delect").size; [self zx_setRightBtnWithImg:ImageName_(@"chat_nav_icon_delect") clickedBlock:^(ZXNavItemBtn * _Nonnull btn) { [self setDeleteModel]; }]; UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:app]; presenter = [[ChatPresenter alloc] initWithViewController:self]; self.infoUser = cUser; self.infoUser.cDevice.imei = self.imei; // self.infoCircle = [cUser getCircleWithImei:cUser.cDevice.imei]; NSLog(@"%@",self.infoCircle); if (!self.chatType && self.infoCircle) self.chatType = 222; // [xMyMQTT setSubscriptions:self.infoCircle]; [self initView]; [self.messageTableView.mj_header beginRefreshing]; if (self.chatType == 222) [self presenterBlock]; [self clearCornerMark]; // 添加第三方接入数据 NSMutableArray *emotionManagers = [NSMutableArray array]; // for (NSInteger i = 0; i < 10; i ++) // { XHEmotionManager *emotionManager = [[XHEmotionManager alloc] init]; emotionManager.emotionName = @""; NSMutableArray *emotions = [NSMutableArray array]; for (NSInteger j = 1; j <= 12; j ++) { XHEmotion *emotion = [[XHEmotion alloc] init]; NSString *imageName = [NSString stringWithFormat:@"emoji_%ld",(long)j]; emotion.emotionPath = [NSString stringWithFormat:@"emoji_%ld",(long)j]; emotion.emotionConverPhoto = [UIImage imageNamed:imageName]; [emotions addObject:emotion]; } emotionManager.emotions = emotions; [emotionManagers addObject:emotionManager]; // } self.emotionManagers = emotionManagers; [self.emotionManagerView reloadData]; // if(self.chatType == 111) // { // NSMutableArray *shareMenuItems = [NSMutableArray array]; // NSArray *plugIcons = @[@"sharemore_videovoip"]; // NSArray *plugTitle = @[@"视频聊天"]; // for (NSString *plugIcon in plugIcons) // { // XHShareMenuItem *shareMenuItem = [[XHShareMenuItem alloc] initWithNormalIconImage:[UIImage imageNamed:plugIcon] title:[plugTitle objectAtIndex:[plugIcons indexOfObject:plugIcon]]]; // [shareMenuItems addObject:shareMenuItem]; // } // self.shareMenuItems = shareMenuItems; // [self.shareMenuView reloadData]; // } } //MARK: 退出聊天界面时取消这个通知 -(void)viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:animated]; UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:app]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:app]; } -(void)clearCornerMark{ //清除APP 角标 [UIApplication sharedApplication].applicationIconBadgeNumber = 0; } - (void)presenterBlock{ WEAKSELF presenter.blockRefreshUIData = ^(){ [weakSelf reloadTableView]; }; [presenter P_initData:^{}]; } - (void)initView{ self.navigationController.interactivePopGestureRecognizer.delaysTouchesBegan = NO; WEAKSELF //MARK :防止在ios 11 的系统中刷新Tableview 之后的抖动 // self.messageTableView.frame = CGRectMake(0, iPhoneX_NavHeight, ScreenWidth, ScreenHeight-iPhoneX_NavHeight); self.messageTableView.estimatedRowHeight = 0; self.messageTableView.estimatedSectionHeaderHeight = 0; self.messageTableView.estimatedSectionFooterHeight = 0; self.messageTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ if (weakSelf.chatType == 222) { XHMessage *message = weakSelf.messages.firstObject; [weakSelf getFamilyMessageRecv:message.id]; } else { [weakSelf getSingleMessage]; } }]; [self.messageTableView setBackgroundColor:RGB(241, 241, 241)]; } #pragma mark ---删除聊天消息, 调用删除接口 , 然后刷新 本页面----- /** 删除聊天消息, 调用删除接口 , 然后刷新 本页面 */ -(void)setDeleteModel { WEAKSELF LGAlertView *alertView = [[LGAlertView alloc] initWithTitle:@"注意" message:@"是否清除聊天消息?" style:LGAlertViewStyleAlert buttonTitles:@[@"确定"] cancelButtonTitle:@"取消" destructiveButtonTitle:nil actionHandler:^(LGAlertView *alertView, NSString *title, NSUInteger index) { [weakSelf deletChatMsg]; } cancelHandler:nil destructiveHandler:nil]; [alertView showAnimated:YES completionHandler:nil]; } -(void)deletChatMsg { WEAKSELF if ([self.messages.lastObject isKindOfClass:[XHMessage class]]) { if(self.chatType == 222) { XHMessage * lastMsgObject = self.messages.lastObject; NSTimeInterval newTime = [NSDate new].timeIntervalSince1970; NSDictionary * parameters = @{@"deletemsgid": lastMsgObject.id, @"deletetime": @(newTime)}; [self.infoCircle deleteCircleMessageWithParameters:parameters success:^(id responseObject) { // [SVProgressHUD show]; // [SVProgressHUD dismissWithDelay:5]; // [SVProgressHUD showErrorWithStatus:error.userInfo[NSLocalizedDescriptionKey]]; [SVProgressHUD showSuccessWithStatus:@"清除聊天消息成功"]; //成功之后 重新获取数据 [weakSelf.messages removeAllObjects]; [weakSelf reloadTableView]; } failure:^{ [SVProgressHUD showImage:nil status:@"清除聊天消息失败,请稍后重试..."]; }]; } else { [self.infoCircle deleteSingleMessage:self.imei success:^(id responseObject) { [SVProgressHUD showSuccessWithStatus:@"清除聊天消息成功"]; //成功之后 重新获取数据 [weakSelf.messages removeAllObjects]; [weakSelf reloadTableView]; } failure:^{ [SVProgressHUD showImage:nil status:@"清除聊天消息失败,请稍后重试..."]; }]; } } } - (User *)infoUser{ if (!_infoUser) { _infoUser = [self.infoCircle getUserWithUserID:[User currentUser].openid]; } return _infoUser; } - (void)dealloc { self.emotionManagers = nil; [[XHAudioPlayerHelper shareInstance] setDelegate:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self]; // self.infoCircle = [cUser getCircleWithImei:cUser.cDevice.imei]; // [xMyMQTT setSubscriptions:nil]; } - (void)prepareRecordingVoiceActionWithCompletion:(BOOL (^)(void))completion{ WEAKSELF [weakSelf.currentSelectedCell.messageBubbleView.animationVoiceImageView stopAnimating]; [[XHAudioPlayerHelper shareInstance] stopAudio]; [super prepareRecordingVoiceActionWithCompletion:completion]; } #pragma mark - XHMessageTableViewCell delegate - (void)multiMediaMessageDidSelectedOnMessage:(XHMessage *)message atIndexPath:(NSIndexPath *)indexPath onMessageTableViewCell:(XHMessageTableViewCell *)messageTableViewCell { if (!message) { [self.messageInputView.inputTextView resignFirstResponder]; return; } UIViewController *disPlayViewController; switch (message.messageMediaType) { case XHBubbleMessageMediaTypeVideo: case XHBubbleMessageMediaTypePhoto: { XHDisplayMediaViewController *messageDisplayTextView = [[XHDisplayMediaViewController alloc] init]; messageDisplayTextView.message = message; disPlayViewController = messageDisplayTextView; break; } break; case XHBubbleMessageMediaTypeVoice: { DLog(@"message : %@", message.voicePath); // Mark the voice as read and hide the red dot. if(message.bubbleMessageType == XHBubbleMessageTypeReceiving){ //MARK: 记录已读消息 NSArray *pathArr = [UserDefaults objectForKey:kReadRecordArrKey]; NSMutableArray *mPathArr = [NSMutableArray array]; if (pathArr) { [mPathArr addObjectsFromArray:pathArr]; [mPathArr addObject:message.content]; [UserDefaults setObject:mPathArr forKey:kReadRecordArrKey]; }else{ [mPathArr addObject:message.content]; [UserDefaults setObject:mPathArr forKey:kReadRecordArrKey]; } } message.isRead = YES; messageTableViewCell.messageBubbleView.voiceUnreadDotImageView.hidden = YES; [[XHAudioPlayerHelper shareInstance] setDelegate:(id)self]; if (self.currentSelectedCell) { [self.currentSelectedCell.messageBubbleView.animationVoiceImageView stopAnimating]; } if (self.currentSelectedCell == messageTableViewCell) { [messageTableViewCell.messageBubbleView.animationVoiceImageView stopAnimating]; [[XHAudioPlayerHelper shareInstance] stopAudio]; self.currentSelectedCell = nil; } else { self.currentSelectedCell = messageTableViewCell; [presenter P_playVoiceWithMessage:message block:^(NSString *wavPath) { if (self.currentSelectedCell == messageTableViewCell){ [messageTableViewCell.messageBubbleView.animationVoiceImageView startAnimating]; [[XHAudioPlayerHelper shareInstance] managerAudioWithFileName:wavPath toPlay:YES]; } }]; } break; } case XHBubbleMessageMediaTypeEmotion: DLog(@"facePath : %@", message.emotionPath); break; case XHBubbleMessageMediaTypeLocalPosition: { // DLog(@"facePath : %@", message.localPositionPhoto); Locate *locate = [[Locate alloc] init]; locate.lon = @([message location].coordinate.longitude); locate.lat = @([message location].coordinate.latitude); locate.address = [message geolocations]; locate.timestamp = message.timestamp; Device *obj = [self.infoCircle getDeviceWithIMEI:message.senderID]; [self performSegueWithIdentifier:@"goRtTrackView" sender:@{@"map":[NSMutableArray arrayWithArray:@[locate]], @"device":obj}]; break; } default: break; } if (disPlayViewController) { [self.navigationController pushViewController:disPlayViewController animated:YES]; } } - (void)didDoubleSelectedOnTextMessage:(XHMessage *)message atIndexPath:(NSIndexPath *)indexPath { DLog(@"text : %@", message.content); XHDisplayTextViewController *displayTextViewController = [[XHDisplayTextViewController alloc] init]; displayTextViewController.message = message; [self.navigationController pushViewController:displayTextViewController animated:YES]; } #pragma 聊天头像 - (void)didSelectedAvatarOnMessage:(XHMessage *)message atIndexPath:(NSIndexPath *)indexPath { // WEAKSELF // [presenter P_didSelectedAvatarOnMessage:message // atIndexPath:indexPath // block:^(NSString *identifier, id sender) { // [weakSelf performSegueWithIdentifier:identifier sender:sender]; // }]; } - (void)menuDidSelectedAtBubbleMessageMenuSelecteType:(XHBubbleMessageMenuSelecteType)bubbleMessageMenuSelecteType { } #pragma mark - XHAudioPlayerHelper Delegate - (void)didAudioPlayerStopPlay:(AVAudioPlayer *)audioPlayer { if (!self.currentSelectedCell) { return; } [self.currentSelectedCell.messageBubbleView.animationVoiceImageView stopAnimating]; self.currentSelectedCell = nil; } #pragma mark - XHEmotionManagerView DataSource - (NSInteger)numberOfEmotionManagers { return self.emotionManagers.count; } - (XHEmotionManager *)emotionManagerForColumn:(NSInteger)column { return [self.emotionManagers objectAtIndex:column]; } - (NSArray *)emotionManagersAtManager { return self.emotionManagers; } #pragma mark - XHMessageTableViewController Delegate //- (BOOL)shouldLoadMoreMessagesScrollToTop { // return YES; //} // //- (void)loadMoreMessagesScrollTotop { // if (!self.loadingMoreMessage) { // self.loadingMoreMessage = YES; // // NSLog(@"%d",self.loadingMoreMessage); // WEAKSELF // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // [_circle getCircleMessageWithParameters:@{@"session":[User currentUser].session, // @"group_id":_circle.group_id} // success:^(NSMutableArray *messageArr) { // dispatch_async(dispatch_get_main_queue(), ^{ // [weakSelf insertOldMessages:messageArr]; // weakSelf.loadingMoreMessage = NO; // }); // } failure:^{}]; // // }); // } //} #pragma 照片 - (void)moreButtonClick:(void (^)())PickerMediaBlock{ WEAKSELF UIAlertController *sheet = [Circle getCameraSheetCamera:^{ [weakSelf.photographyHelper showOnPickerViewControllerSourceType:UIImagePickerControllerSourceTypeCamera onViewController:weakSelf compled:PickerMediaBlock]; } photoLibrary:^{ [weakSelf.photographyHelper showOnPickerViewControllerSourceType:UIImagePickerControllerSourceTypePhotoLibrary onViewController:weakSelf compled:PickerMediaBlock]; }]; [self presentViewController:sheet animated:YES completion:nil]; } //- (void)groupUserLeaveWithAPNS:(NSNotification *)noti{ // if ([noti.object[@"group_id"] isEqualToNumber:self.circle.group_id]) { // if ([noti.object[@"user_id"] isEqualToString:[User currentUser].user_id] && // ![noti.object[@"operator"] isEqualToString:[User currentUser].user_id]) { // Circle *circle = [[User currentUser] getCircleWithId:noti.object[@"group_id"]]; // User *operator = [circle getUserWithUserID:noti.object[@"operator"]]; // NSString *msg = [NSString stringWithFormat:NSLocalizedStringFromTable(@"你被%@从%@中踢出", @"Localization", @""),operator.user_name,circle.group_name]; // UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:msg // message:nil // delegate:self // cancelButtonTitle:NSLocalizedStringFromTable(@"确定", @"Localization", @"") // otherButtonTitles:nil]; // alertView.tag = group_user_leaveTag; // [alertView show]; // // [[XHAudioPlayerHelper shareInstance] setDelegate:nil]; // [[NSNotificationCenter defaultCenter] removeObserver:self]; // } // } //} /* - (void)newLocateWithAPNS:(NSNotification *)noti{ if ([noti.object[@"locus"] integerValue] == 1 && [noti.object[@"message_id"] length] > 0){ Device *device = [self.circle getDeviceWithIMEI:noti.object[@"imei"]]; if (device) { NSTimeInterval tamp = [noti.object[@"timestamp"] doubleValue]; CLLocation *location = [[CLLocation alloc] initWithLatitude:[noti.object[@"lat"] doubleValue] longitude:[noti.object[@"lon"] doubleValue]]; XHMessage *locMessage = [[XHMessage alloc] initWithLocalPositionPhoto:[UIImage imageNamed:@"Fav_Cell_Loc"] geolocations:noti.object[@"address"] location:location sender:device.dev_name timestamp:[NSDate dateWithTimeIntervalSince1970:tamp]]; [self setLastShowTimetampWithMessage:locMessage]; locMessage.message_id = noti.object[@"message_id"]; locMessage.sender_id = device.imei; locMessage.avatar = [device getImageWithRim:CGSizeMake(60, 60)]; locMessage.isRead = YES; locMessage.shouldShowUserName = YES; locMessage.bubbleMessageType = XHBubbleMessageTypeReceiving; [self addMessage:locMessage]; // [self finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypeLocalPosition]; } } } */ /** * 发送文本消息的回调方法 * * @param text 目标文本字符串 * @param sender 发送者的名字 * @param date 发送时间 */ - (void)didSendText:(NSString *)text fromSender:(NSString *)sender onDate:(NSDate *)date { if (text.length > 0) { [self finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypeText]; XHMessage *message = [[XHMessage alloc] initWithText:text sender:sender timestamp:date]; message.avatar = self.infoUser.image; message.senderID = self.infoUser.openid; presenter.isSended = NO; WEAKSELF if (self.chatType == 222) { NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:@{@"type":@(1),@"content":text}]; [self.infoCircle sendCircleMessageWithParameters:parameters success:^(id responseObject) { [weakSelf setLastShowTimetampWithMessage:message]; message.id = responseObject[@"id"]; [weakSelf addMessage:message]; self->presenter.isSended = YES; } failure:^{ weakSelf.messageInputView.inputTextView.text = text; }]; } else { NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:@(1) forKey:@"type"]; [parameters setValue:text forKey:@"content"]; [parameters setValue:cUser.openid forKey:@"openid"]; [parameters setValue:cUser.accesstoken forKey:@"token"]; [self.infoCircle sendCircleMessageWithImei:self.imei Parameters:parameters success:^(id responseObject) { [weakSelf setLastShowTimetampWithMessage:message]; message.id = responseObject[@"id"]; [weakSelf addMessage:message]; self->presenter.isSended = YES; } failure:^{ weakSelf.messageInputView.inputTextView.text = text; }]; } } } /** * 发送图片消息的回调方法 * * @param photo 目标图片对象,后续有可能会换 * @param sender 发送者的名字 * @param date 发送时间 */ - (void)didSendPhoto:(UIImage *)photo fromSender:(NSString *)sender onDate:(NSDate *)date { XHMessage *message = [[XHMessage alloc] initWithPhoto:photo thumbnailUrl:nil originPhotoUrl:nil sender:sender timestamp:date]; message.avatar = self.infoUser.image; message.senderID = self.infoUser.openid; WEAKSELF if (self.chatType == 222) { NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:@{@"type":@(2), @"content":UIImageJPEGRepresentation(photo, 0.1)}]; [self.infoCircle sendCircleMessageWithParameters:parameters success:^(id responseObject) { message.id = responseObject[@"id"]; [weakSelf setLastShowTimetampWithMessage:message]; [weakSelf addMessage:message]; [weakSelf finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypePhoto]; } failure:^{ }]; } else{ NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:@(2) forKey:@"type"]; [parameters setValue:UIImageJPEGRepresentation(photo, 0.1) forKey:@"content"]; [parameters setValue:cUser.openid forKey:@"openid"]; [parameters setValue:cUser.accesstoken forKey:@"token"]; [self.infoCircle sendCircleMessageWithImei:self.imei Parameters:parameters success:^(id responseObject) { message.id = responseObject[@"id"]; [weakSelf setLastShowTimetampWithMessage:message]; [weakSelf addMessage:message]; [weakSelf finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypePhoto]; } failure:^{ }]; } } /** * 发送视频消息的回调方法 * * @param videoPath 目标视频本地路径 * @param sender 发送者的名字 * @param date 发送时间 */ - (void)didSendVideoConverPhoto:(UIImage *)videoConverPhoto videoPath:(NSString *)videoPath fromSender:(NSString *)sender onDate:(NSDate *)date { // XHMessage *videoMessage = [[XHMessage alloc] initWithVideoConverPhoto:videoConverPhoto videoPath:videoPath videoUrl:nil sender:sender timestamp:date]; // videoMessage.avatar = [UIImage imageNamed:@"avatar"]; // videoMessage.avator = @"http://www.pailixiu.com/jack/meIcon@2x.png"; // [self addMessage:videoMessage]; // [self finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypeVideo]; // VideoTabPopView.sharedManager.deviceModel = self.infoUser.cDevice; // [VideoTabPopView.sharedManager monitorDevice]; } /** * 发送语音消息的回调方法 * * @param voicePath 目标语音本地路径 * @param voiceDuration 目标语音时长 * @param sender 发送者的名字 * @param date 发送时间 */ - (void)didSendVoice:(NSString *)voicePath voiceDuration:(NSNumber *)voiceDuration fromSender:(NSString *)sender onDate:(NSDate *)date { if ([voiceDuration doubleValue] < 1) { [SVProgressHUD showErrorWithStatus:NSLocalizedStringFromTable(@"录音时间太短", @"Localization", @"")]; return; } XHMessage *message = [[XHMessage alloc] initWithVoicePath:voicePath voiceUrl:nil voiceDuration:voiceDuration sender:sender timestamp:date]; message.avatar = self.infoUser.image; message.senderID = self.infoUser.openid; [self wavToAmr:voicePath]; voicePath = [CJFileUtility changeFileExt:voicePath ext:@"amr"]; NSData *data = [NSData dataWithContentsOfFile:voicePath]; presenter.isSended = NO; WEAKSELF if(self.chatType == 222) { NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:@{@"type":@(3), @"content":data,@"duration":voiceDuration}]; [self.infoCircle sendCircleMessageWithParameters:parameters success:^(id responseObject) { message.id = responseObject[@"id"]; [weakSelf setLastShowTimetampWithMessage:message]; NSString *fileName = [NSString stringWithFormat:@"%@.wav",responseObject[@"id"]]; NSString *wavPath = [CJFileUtility documentsPathSubDir:@"msg_audio" andFile:fileName]; [CJFileUtility moveFile:[CJFileUtility changeFileExt:voicePath ext:@"wav"] to:wavPath]; message.voicePath = wavPath; [weakSelf addMessage:message]; [weakSelf finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypeVoice]; presenter.isSended = YES; } failure:^{ }]; } else { NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:@(3) forKey:@"type"]; [parameters setValue:data forKey:@"content"]; [parameters setValue:voiceDuration forKey:@"duration"]; [parameters setValue:cUser.openid forKey:@"openid"]; [parameters setValue:cUser.accesstoken forKey:@"token"]; [self.infoCircle sendCircleMessageWithImei:self.imei Parameters:parameters success:^(id responseObject) { message.id = responseObject[@"id"]; [weakSelf setLastShowTimetampWithMessage:message]; NSString *fileName = [NSString stringWithFormat:@"%@.wav",responseObject[@"id"]]; NSString *wavPath = [CJFileUtility documentsPathSubDir:@"msg_audio" andFile:fileName]; [CJFileUtility moveFile:[CJFileUtility changeFileExt:voicePath ext:@"wav"] to:wavPath]; message.voicePath = wavPath; [weakSelf addMessage:message]; [weakSelf finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypeVoice]; presenter.isSended = YES; } failure:^{ }]; } } /** * 发送第三方表情消息的回调方法 * * @param emotionPath 目标第三方表情的本地路径 * @param sender 发送者的名字 * @param date 发送时间 */ - (void)didSendEmotion:(NSString *)emotionPath fromSender:(NSString *)sender onDate:(NSDate *)date { NSString *emotion = [emotionPath stringByReplacingOccurrencesOfString:@"emoji_" withString:@""]; XHMessage *emotionMessage = [[XHMessage alloc] initWithEmotionPath:emotionPath sender:sender timestamp:date]; emotionMessage.avatar = self.infoUser.image; emotionMessage.senderID = self.infoUser.openid; emotionMessage.avator = self.infoUser.avator; emotionMessage.content = emotion; presenter.isSended = NO; WEAKSELF if (self.chatType == 222) { NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:@{@"type":@(4),@"content":emotion}]; [self.infoCircle sendCircleMessageWithParameters:parameters success:^(id responseObject) { [weakSelf setLastShowTimetampWithMessage:emotionMessage]; emotionMessage.id = responseObject[@"id"]; [weakSelf addMessage:emotionMessage]; self->presenter.isSended = YES; [weakSelf finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypeEmotion]; } failure:^{ }]; } else { NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:@(4) forKey:@"type"]; [parameters setValue:emotion forKey:@"content"]; [parameters setValue:cUser.openid forKey:@"openid"]; [parameters setValue:cUser.accesstoken forKey:@"token"]; [self.infoCircle sendCircleMessageWithImei:self.imei Parameters:parameters success:^(id responseObject) { [weakSelf setLastShowTimetampWithMessage:emotionMessage]; emotionMessage.id = responseObject[@"id"]; [weakSelf addMessage:emotionMessage]; self->presenter.isSended = YES; [weakSelf finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypeEmotion]; } failure:^{ }]; } } /** * 有些网友说需要发送地理位置,这个我暂时放一放 */ - (void)didSendGeoLocationsPhoto:(UIImage *)geoLocationsPhoto geolocations:(NSString *)geolocations location:(CLLocation *)location fromSender:(NSString *)sender onDate:(NSDate *)date { XHMessage *geoLocationsMessage = [[XHMessage alloc] initWithLocalPositionPhoto:geoLocationsPhoto geolocations:geolocations location:location sender:sender timestamp:date]; geoLocationsMessage.avatar = [UIImage imageNamed:@"avatar"]; geoLocationsMessage.avator = @"http://www.pailixiu.com/jack/meIcon@2x.png"; [self addMessage:geoLocationsMessage]; [self finishSendMessageWithBubbleMessageType:XHBubbleMessageMediaTypeLocalPosition]; } /** * 是否显示时间轴Label的回调方法 * * @param indexPath 目标消息的位置IndexPath * * @return 根据indexPath获取消息的Model的对象,从而判断返回YES or NO来控制是否显示时间轴Label */ //- (BOOL)shouldDisplayTimestampForRowAtIndexPath:(NSIndexPath *)indexPath { // NSLog(@"indexPath = %@",indexPath); // if (indexPath.row == 0) { // return YES; // }else{ // XHMessage *message = self.messages[indexPath.row]; // XHMessage *lastMessage = self.messages[indexPath.row - 1]; // if ([message.timestamp doubleValue] - [lastMessage.timestamp doubleValue] > 60 * 5){ // return YES; // } // return NO; // } //} - (void)setLastShowTimetampWithMessage:(XHMessage *)message{ if ([message.timestamp doubleValue] - [self.lastShowTimetamp doubleValue] >= 60 * 5) { message.shouldShowTimestamp = YES; self.lastShowTimetamp = message.timestamp; }else{ message.shouldShowTimestamp = NO; } } /** * 配置Cell的样式或者字体 * * @param cell 目标Cell * @param indexPath 目标Cell所在位置IndexPath */ - (void)configureCell:(XHMessageTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { baseModel *obj = [self.infoCircle getObjWithID:cell.messageBubbleView.message.senderID]; if (obj) { NSString *imageName = @"chat_user"; if ([obj isKindOfClass:[Device class]]) { Device *device = (Device*)obj; if([device.sex isEqualToString:@"girl"]){ imageName = @"icon_girl_head_portrait"; }else{ imageName = @"icon_boy_head_portrait"; } } [cell.avatarButton sd_setImageWithURL:[NSURL URLWithString:obj.avator] forState:UIControlStateNormal placeholderImage:[myHelper getImageWithName:imageName] options:SDWebImageRetryFailed]; }else{ [cell.avatarButton setImage:[myHelper getImageWithName:@"chat_user"] forState:UIControlStateNormal]; } [cell setBackgroundColor:RGB(241, 241, 241)]; if (self.currentSelectedCell == cell && [[XHAudioPlayerHelper shareInstance] isPlaying]) { [self.currentSelectedCell.messageBubbleView.animationVoiceImageView startAnimating]; }else{ [self.currentSelectedCell.messageBubbleView.animationVoiceImageView stopAnimating]; } } /** * 协议回掉是否支持用户手动滚动 * * @return 返回YES or NO */ - (BOOL)shouldPreventScrollToBottomWhileUserScrolling { return YES; } - (void)wavToAmr:(NSString *)path { //转格式 if ([CJFileUtility fileExists:path]) { NSString *armPath = [CJFileUtility changeFileExt:path ext:@"amr"]; [VoiceConverter wavToAmr:path amrSavePath:armPath]; } } //转换后删掉amr文件 - (void)amrToWav:(NSString *)path { //转格式 if ([CJFileUtility fileExists:path]) { NSString *wavPath = [CJFileUtility changeFileExt:path ext:@"wav"]; [VoiceConverter amrToWav:path wavSavePath:wavPath]; [CJFileUtility deleteFile:path]; } } #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. [super prepareForSegue:segue sender:sender]; if ([segue.identifier isEqualToString:@"goMemberInfo"]){ [segue.destinationViewController setValue:sender forKey:@"infoUser"]; }else if ([segue.identifier isEqualToString:@"goWatchInfo"]){ [segue.destinationViewController setValue:sender forKey:@"infoDevice"]; }else if ([segue.identifier isEqualToString:@"goRtTrackView"]){ [segue.destinationViewController setValue:sender[@"map"] forKey:@"mapPoints"]; [segue.destinationViewController setValue:sender[@"device"] forKey:@"infoDevice"]; } } @end