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

//
// 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