You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
966 lines
38 KiB
966 lines
38 KiB
// |
|
// ChatViewController.m |
|
// myWatch |
|
// XX的家 |
|
// Created by mobao on 15/9/30. |
|
// Copyright (c) 2015年 xTT. All rights reserved. |
|
// |
|
|
|
#import "ChatViewController.h" |
|
#import <SDWebImage/UIButton+WebCache.h> |
|
#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 () <XHAudioPlayerHelperDelegate,UIActionSheetDelegate>{ |
|
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<NSFileManagerDelegate>)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 |
|
|
|
|