950 lines
35 KiB
Objective-C
950 lines
35 KiB
Objective-C
//
|
||
// IfishSessionViewController.m
|
||
// Ifish
|
||
//
|
||
// Created by imac on 16/9/13.
|
||
// Copyright © 2016年 lianxiang. All rights reserved.
|
||
//
|
||
|
||
#import "IfishSessionViewController.h"
|
||
@import MobileCoreServices;
|
||
@import AVFoundation;
|
||
#import "Reachability.h"
|
||
#import "UIActionSheet+NTESBlock.h"
|
||
#import "NTESCustomSysNotificationSender.h"
|
||
//#import "NTESSessionConfig.h"
|
||
#import "NIMMediaItem.h"
|
||
#import "NTESSessionMsgConverter.h"
|
||
#import "NTESFileLocationHelper.h"
|
||
#import "NTESSessionMsgConverter.h"
|
||
//#import "UIView+Toast.h"
|
||
//#import "Toast+UIView.h"
|
||
#import "NTESSnapchatAttachment.h"
|
||
#import "NTESJanKenPonAttachment.h"
|
||
#import "NTESFileTransSelectViewController.h"
|
||
#import "NTESAudioChatViewController.h"
|
||
#import "NTESWhiteboardViewController.h"
|
||
#import "NTESVideoChatViewController.h"
|
||
#import "NTESChartletAttachment.h"
|
||
#import "NTESGalleryViewController.h"
|
||
#import "NTESVideoViewController.h"
|
||
#import "NTESFilePreViewController.h"
|
||
#import "NTESAudio2TextViewController.h"
|
||
#import "NSDictionary+NTESJson.h"
|
||
#import "NIMAdvancedTeamCardViewController.h"
|
||
#import "NTESSessionRemoteHistoryViewController.h"
|
||
#import "NIMNormalTeamCardViewController.h"
|
||
#import "UIView+NTES.h"
|
||
#import "NTESBundleSetting.h"
|
||
#import "NTESPersonalCardViewController.h"
|
||
#import "NTESSessionSnapchatContentView.h"
|
||
#import "NTESSessionLocalHistoryViewController.h"
|
||
#import "NIMContactSelectViewController.h"
|
||
#import "SVProgressHUD.h"
|
||
#import "NTESSessionCardViewController.h"
|
||
#import "NTESFPSLabel.h"
|
||
#import "UIAlertView+NTESBlock.h"
|
||
#import "NIMKit.h"
|
||
#import "NTESSessionUtil.h"
|
||
#import "CTAssetsPickerController.h"
|
||
#import "NIMKitMediaFetcher.h"
|
||
#import "NIMKitLocationPoint.h"
|
||
#import "NIMLocationViewController.h"
|
||
|
||
#import "SessionConfig.h"
|
||
#import "PushMasssageWebViewController.h"
|
||
#import "ShareReportViewController.h"
|
||
#import "KanHuBaoGaoModel.h"
|
||
#import "PingfenModel.h"
|
||
|
||
#import "NIMSessionConfig.h"
|
||
|
||
@interface IfishSessionViewController ()
|
||
<UIImagePickerControllerDelegate,
|
||
UINavigationControllerDelegate,
|
||
NIMSystemNotificationManagerDelegate,
|
||
NTESTimerHolderDelegate,
|
||
NIMMediaManagerDelgate,
|
||
NIMContactSelectDelegate
|
||
>
|
||
|
||
@property (nonatomic,strong) SessionConfig *sessionConfig;
|
||
|
||
@property (nonatomic,strong) NTESCustomSysNotificationSender *notificaionSender;
|
||
|
||
@property (nonatomic,strong) NTESTimerHolder *titleTimer;
|
||
|
||
@property (nonatomic,strong) NTESFPSLabel *fpsLabel;
|
||
|
||
@property (nonatomic,strong) UIView *currentSingleSnapView;
|
||
|
||
@property (nonatomic,strong) UIImagePickerController *imagePicker;
|
||
@property (nonatomic,strong) NIMKitMediaFetcher *mediaFetcher;
|
||
|
||
|
||
@end
|
||
|
||
@implementation IfishSessionViewController
|
||
|
||
- (void)viewDidLoad {
|
||
[super viewDidLoad];
|
||
// Do any additional setup after loading the view.
|
||
_notificaionSender = [[NTESCustomSysNotificationSender alloc] init];
|
||
BOOL disableCommandTyping = self.disableCommandTyping || (self.session.sessionType == NIMSessionTypeP2P &&[[NIMSDK sharedSDK].userManager isUserInBlackList:self.session.sessionId]);
|
||
if (!disableCommandTyping) {
|
||
_titleTimer = [[NTESTimerHolder alloc] init];
|
||
[[[NIMSDK sharedSDK] systemNotificationManager] addDelegate:self];
|
||
}
|
||
|
||
if ([[NTESBundleSetting sharedConfig] showFps])
|
||
{
|
||
self.fpsLabel = [[NTESFPSLabel alloc] initWithFrame:CGRectZero];
|
||
[self.view addSubview:self.fpsLabel];
|
||
self.fpsLabel.right = self.view.width;
|
||
self.fpsLabel.top = self.tableView.top + self.tableView.contentInset.top;
|
||
}
|
||
|
||
|
||
[self setNav];
|
||
|
||
//+ 号中只用相册 摄像 位置
|
||
|
||
}
|
||
|
||
-(void)viewWillAppear:(BOOL)animated{
|
||
|
||
//判断是否是爱鱼奇官方帐号
|
||
if (self.isAiYuQi) {
|
||
|
||
self.sessionInputView.hidden = YES;
|
||
|
||
}else{
|
||
|
||
self.sessionInputView.hidden = NO;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
-(void)setNav{
|
||
|
||
if (_navState ==1) {
|
||
|
||
[self setWhiteNav];
|
||
}else{
|
||
|
||
[self setBalcknav];
|
||
}
|
||
|
||
}
|
||
|
||
-(void)setBalcknav{
|
||
|
||
//黑色
|
||
UIButton *bakbutton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
bakbutton.frame = CGRectMake(0,0,48,44);
|
||
[bakbutton setImage:[UIImage imageNamed:@"back_btn"] forState:UIControlStateNormal];
|
||
|
||
[bakbutton addTarget: self action: @selector(goBackAction) forControlEvents: UIControlEventTouchUpInside];
|
||
|
||
UIBarButtonItem *back=[[UIBarButtonItem alloc] initWithCustomView:bakbutton];
|
||
self.navigationItem.leftBarButtonItem=back;
|
||
UILabel*labe=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 60, 44)];
|
||
labe.text=[self sessionTitle];;
|
||
labe.textAlignment=NSTextAlignmentCenter;
|
||
labe.textColor=[UIColor whiteColor];
|
||
self.navigationItem.titleView=labe;
|
||
|
||
}
|
||
|
||
-(void)setWhiteNav{
|
||
//白色
|
||
UIButton *bakbutton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
bakbutton.frame = CGRectMake(0,0,48,44);
|
||
[bakbutton setImage:[UIImage imageNamed:@"arrow_b"] forState:UIControlStateNormal];
|
||
|
||
[bakbutton addTarget: self action: @selector(goBackAction) forControlEvents: UIControlEventTouchUpInside];
|
||
|
||
UIBarButtonItem *back=[[UIBarButtonItem alloc] initWithCustomView:bakbutton];
|
||
self.navigationItem.leftBarButtonItem=back;
|
||
UILabel*labe=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 60, 44)];
|
||
labe.text=[self sessionTitle];;
|
||
labe.textAlignment=NSTextAlignmentCenter;
|
||
labe.textColor=[UIColor blackColor];
|
||
self.navigationItem.titleView=labe;
|
||
|
||
|
||
}
|
||
-(void)goBackAction{
|
||
|
||
[self.navigationController popViewControllerAnimated:YES];
|
||
}
|
||
|
||
|
||
|
||
|
||
- (id<NIMSessionConfig>)sessionConfig{
|
||
if (_sessionConfig == nil) {
|
||
_sessionConfig = [[SessionConfig alloc] init];
|
||
_sessionConfig.session = self.session;
|
||
}
|
||
return _sessionConfig;
|
||
}
|
||
|
||
|
||
#pragma mark - NIMSystemNotificationManagerProcol
|
||
- (void)onReceiveCustomSystemNotification:(NIMCustomSystemNotification *)notification
|
||
{
|
||
if (!notification.sendToOnlineUsersOnly) {
|
||
return;
|
||
}
|
||
NSData *data = [[notification content] dataUsingEncoding:NSUTF8StringEncoding];
|
||
if (data) {
|
||
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data
|
||
options:0
|
||
error:nil];
|
||
if ([dict jsonInteger:NTESNotifyID] == NTESCommandTyping && self.session.sessionType == NIMSessionTypeP2P && [notification.sender isEqualToString:self.session.sessionId])
|
||
{
|
||
self.title = @"正在输入...";
|
||
[_titleTimer startTimer:5
|
||
delegate:self
|
||
repeats:NO];
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
- (void)onNTESTimerFired:(NTESTimerHolder *)holder
|
||
{
|
||
self.title = [self sessionTitle];
|
||
}
|
||
|
||
- (NSString *)sessionTitle{
|
||
if ([self.session.sessionId isEqualToString:[NIMSDK sharedSDK].loginManager.currentAccount]) {
|
||
return @"我的电脑";
|
||
}
|
||
return [super sessionTitle];
|
||
|
||
|
||
//使用 爱鱼奇用户系统 用户名 在父类中改
|
||
//return self.targetChatname;
|
||
|
||
}
|
||
|
||
|
||
- (void)onTextChanged:(id)sender
|
||
{
|
||
[_notificaionSender sendTypingState:self.session];
|
||
}
|
||
|
||
- (void)onSelectChartlet:(NSString *)chartletId
|
||
catalog:(NSString *)catalogId
|
||
{
|
||
NTESChartletAttachment *attachment = [[NTESChartletAttachment alloc] init];
|
||
attachment.chartletId = chartletId;
|
||
attachment.chartletCatalog = catalogId;
|
||
[self sendMessage:[NTESSessionMsgConverter msgWithChartletAttachment:attachment]];
|
||
}
|
||
|
||
|
||
#pragma mark - 石头剪子布
|
||
- (void)mediaJankenponPressed
|
||
{
|
||
NTESJanKenPonAttachment *attachment = [[NTESJanKenPonAttachment alloc] init];
|
||
attachment.value = arc4random() % 3 + 1;
|
||
[self sendMessage:[NTESSessionMsgConverter msgWithJenKenPon:attachment]];
|
||
}
|
||
|
||
#pragma mark - 实时语音
|
||
#pragma mark - 实时语音
|
||
- (void)onTapMediaItemAudioChat:(NIMMediaItem *)item
|
||
{
|
||
if ([self checkCondition]) {
|
||
//由于音视频聊天里头有音频和视频聊天界面的切换,直接用present的话页面过渡会不太自然,这里还是用push,然后做出present的效果
|
||
NTESAudioChatViewController *vc = [[NTESAudioChatViewController alloc] initWithCallee:self.session.sessionId];
|
||
CATransition *transition = [CATransition animation];
|
||
transition.duration = 0.25;
|
||
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
|
||
transition.type = kCATransitionPush;
|
||
transition.subtype = kCATransitionFromTop;
|
||
[self.navigationController.view.layer addAnimation:transition forKey:nil];
|
||
self.navigationController.navigationBarHidden = YES;
|
||
[self.navigationController pushViewController:vc animated:NO];
|
||
}
|
||
}
|
||
|
||
|
||
#pragma mark - 视频聊天
|
||
- (void)onTapMediaItemVideoChat:(NIMMediaItem *)item
|
||
{
|
||
if ([self checkCondition]) {
|
||
//由于音视频聊天里头有音频和视频聊天界面的切换,直接用present的话页面过渡会不太自然,这里还是用push,然后做出present的效果
|
||
NTESVideoChatViewController *vc = [[NTESVideoChatViewController alloc] initWithCallee:self.session.sessionId];
|
||
CATransition *transition = [CATransition animation];
|
||
transition.duration = 0.25;
|
||
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
|
||
transition.type = kCATransitionPush;
|
||
transition.subtype = kCATransitionFromTop;
|
||
[self.navigationController.view.layer addAnimation:transition forKey:nil];
|
||
self.navigationController.navigationBarHidden = YES;
|
||
[self.navigationController pushViewController:vc animated:NO];
|
||
}
|
||
}
|
||
|
||
#pragma mark - 文件传输
|
||
- (void)mediaFileTransPressed
|
||
{
|
||
NTESFileTransSelectViewController *vc = [[NTESFileTransSelectViewController alloc]
|
||
initWithNibName:nil bundle:nil];
|
||
__weak typeof(self) wself = self;
|
||
vc.completionBlock = ^void(id sender,NSString *ext){
|
||
if ([sender isKindOfClass:[NSString class]]) {
|
||
[wself sendMessage:[NTESSessionMsgConverter msgWithFilePath:sender]];
|
||
}else if ([sender isKindOfClass:[NSData class]]){
|
||
[wself sendMessage:[NTESSessionMsgConverter msgWithFileData:sender extension:ext]];
|
||
}
|
||
};
|
||
[self.navigationController pushViewController:vc animated:YES];
|
||
}
|
||
|
||
#pragma mark - 阅后即焚
|
||
- (void)onTapMediaItemSnapChat:(NIMMediaItem *)item
|
||
{
|
||
UIActionSheet *sheet;
|
||
BOOL isCamraAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
|
||
if (isCamraAvailable) {
|
||
sheet = [[UIActionSheet alloc] initWithTitle:@"请选择" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"从相册中选取",@"拍照",nil];
|
||
}else{
|
||
sheet = [[UIActionSheet alloc] initWithTitle:@"请选择" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"从相册中选取",nil];
|
||
}
|
||
__weak typeof(self) wself = self;
|
||
[sheet showInView:self.view completionHandler:^(NSInteger index) {
|
||
switch (index) {
|
||
case 0:{
|
||
//相册
|
||
[wself.mediaFetcher fetchPhotoFromLibrary:^(NSString *path, PHAssetMediaType type) {
|
||
if (type == PHAssetMediaTypeImage) {
|
||
[wself sendSnapchatMessagePath:path];
|
||
}else{
|
||
dispatch_async(dispatch_get_main_queue(), ^{
|
||
[wself.view makeToast:@"阅后即焚只支持图片"];
|
||
});
|
||
}
|
||
|
||
}];
|
||
|
||
}
|
||
break;
|
||
case 1:{
|
||
//相机
|
||
[wself.mediaFetcher fetchMediaFromCamera:^(NSString *path, UIImage *image) {
|
||
if (image) {
|
||
[wself sendSnapchatMessage:image];
|
||
}
|
||
}];
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
}];
|
||
}
|
||
|
||
- (void)sendSnapchatMessagePath:(NSString *)path
|
||
{
|
||
NTESSnapchatAttachment *attachment = [[NTESSnapchatAttachment alloc] init];
|
||
[attachment setImageFilePath:path];
|
||
[self sendMessage:[NTESSessionMsgConverter msgWithSnapchatAttachment:attachment]];
|
||
}
|
||
|
||
- (void)sendSnapchatMessage:(UIImage *)image
|
||
{
|
||
NTESSnapchatAttachment *attachment = [[NTESSnapchatAttachment alloc] init];
|
||
[attachment setImage:image];
|
||
[self sendMessage:[NTESSessionMsgConverter msgWithSnapchatAttachment:attachment]];
|
||
}
|
||
|
||
#pragma mark - 白板
|
||
- (void)mediaWhiteBoardPressed
|
||
{
|
||
NTESWhiteboardViewController *vc = [[NTESWhiteboardViewController alloc] initWithSessionID:nil
|
||
peerID:self.session.sessionId
|
||
types:NIMRTSServiceReliableTransfer | NIMRTSServiceAudio
|
||
info:@"白板演示"];
|
||
[self presentViewController:vc animated:NO completion:nil];
|
||
}
|
||
|
||
|
||
|
||
#pragma mark - 提醒消息
|
||
- (void)mediaTipPressed
|
||
{
|
||
UIAlertView *alert =[[UIAlertView alloc] initWithTitle:nil message:@"输入提醒" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
|
||
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
|
||
[alert showAlertWithCompletionHandler:^(NSInteger index) {
|
||
switch (index) {
|
||
case 1:{
|
||
UITextField *textField = [alert textFieldAtIndex:0];
|
||
NIMMessage *message = [NTESSessionMsgConverter msgWithTip:textField.text];
|
||
[self sendMessage:message];
|
||
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}];
|
||
}
|
||
|
||
#pragma mark - 录音事件
|
||
- (void)onRecordFailed:(NSError *)error
|
||
{
|
||
[self.view makeToast:@"录音失败"];
|
||
}
|
||
|
||
- (BOOL)recordFileCanBeSend:(NSString *)filepath
|
||
{
|
||
NSURL *URL = [NSURL fileURLWithPath:filepath];
|
||
AVURLAsset *urlAsset = [[AVURLAsset alloc]initWithURL:URL options:nil];
|
||
CMTime time = urlAsset.duration;
|
||
CGFloat mediaLength = CMTimeGetSeconds(time);
|
||
return mediaLength > 2;
|
||
}
|
||
|
||
- (void)showRecordFileNotSendReason
|
||
{
|
||
[self.view makeToast:@"录音时间太短"];
|
||
}
|
||
|
||
#pragma mark - Cell事件
|
||
- (void)onTapCell:(NIMKitEvent *)event
|
||
{
|
||
//remoteExt 服务器扩展
|
||
BOOL handled = NO;
|
||
NSString *eventName = event.eventName;
|
||
if ([eventName isEqualToString:NIMKitEventNameTapContent])
|
||
{
|
||
NIMMessage *message = event.messageModel.message;
|
||
NSDictionary *actions = [self cellActions];
|
||
NSString *value = actions[@(message.messageType)];
|
||
if (value) {
|
||
SEL selector = NSSelectorFromString(value);
|
||
if (selector && [self respondsToSelector:selector]) {
|
||
SuppressPerformSelectorLeakWarning([self performSelector:selector withObject:message]);
|
||
handled = YES;
|
||
}
|
||
}
|
||
}
|
||
else if([eventName isEqualToString:NIMKitEventNameTapLabelLink])
|
||
{
|
||
NSString *link = event.data;
|
||
//[self.view makeToast:[NSString stringWithFormat:@"tap link : %@",link]
|
||
//];
|
||
PushMasssageWebViewController *urlVC=[[PushMasssageWebViewController alloc] init];
|
||
urlVC.pushtitle = @"浏览网页";
|
||
|
||
urlVC.pushlink = link;
|
||
self.hidesBottomBarWhenPushed = YES;
|
||
[self.navigationController pushViewController:urlVC animated:YES];
|
||
handled = YES;
|
||
}
|
||
|
||
else if([eventName isEqualToString:NIMDemoEventNameOpenSnapPicture])
|
||
{
|
||
NIMCustomObject *object = event.messageModel.message.messageObject;
|
||
NTESSnapchatAttachment *attachment = (NTESSnapchatAttachment *)object.attachment;
|
||
if(attachment.isFired){
|
||
return;
|
||
}
|
||
UIView *sender = event.data;
|
||
self.currentSingleSnapView = [NTESGalleryViewController alertSingleSnapViewWithMessage:object.message baseView:sender];
|
||
handled = YES;
|
||
}
|
||
else if([eventName isEqualToString:NIMDemoEventNameCloseSnapPicture])
|
||
{
|
||
//点击很快的时候可能会触发两次查看,所以这里不管有没有查看过 先强直销毁掉
|
||
NIMCustomObject *object = event.messageModel.message.messageObject;
|
||
UIView *senderView = event.data;
|
||
[senderView dismissPresentedView:YES complete:nil];
|
||
|
||
NTESSnapchatAttachment *attachment = (NTESSnapchatAttachment *)object.attachment;
|
||
if(attachment.isFired){
|
||
return;
|
||
}
|
||
attachment.isFired = YES;
|
||
NIMMessage *message = object.message;
|
||
if ([NTESBundleSetting sharedConfig].autoRemoveSnapMessage) {
|
||
[[NIMSDK sharedSDK].conversationManager deleteMessage:message];
|
||
[self uiDeleteMessage:message];
|
||
|
||
}else{
|
||
[[NIMSDK sharedSDK].conversationManager updateMessage:message forSession:message.session completion:nil];
|
||
[self uiUpdateMessage:message];
|
||
}
|
||
[[NSFileManager defaultManager] removeItemAtPath:attachment.filepath error:nil];
|
||
handled = YES;
|
||
self.currentSingleSnapView = nil;
|
||
}
|
||
else if ([eventName isEqualToString:NIMDemoEventNameCloseSnapPicture])
|
||
{
|
||
|
||
}
|
||
|
||
if (!handled) {
|
||
NSAssert(0, @"invalid event");
|
||
}
|
||
}
|
||
|
||
- (void)onLongPressCell:(NIMMessage *)message inView:(UIView *)view
|
||
{
|
||
[super onLongPressCell:message
|
||
inView:view];
|
||
}
|
||
|
||
#pragma mark - 头像点击事件
|
||
|
||
- (void)onTapAvatar:(NSString *)userId{
|
||
|
||
//爱鱼奇
|
||
// UserModel*umodel=[[DataCenter defaultDtacenter]valueForKey:@"UserLogIn"];
|
||
// NSString *localUserId =[NSString stringWithFormat:@"%@",umodel.userId];
|
||
// if ([userId isEqualToString:localUserId]) {
|
||
//
|
||
// InfoViewController *vc = [[InfoViewController alloc] init];
|
||
// [self.navigationController pushViewController:vc animated:YES];
|
||
//
|
||
// }else{
|
||
//// // UIViewController *vc = [[NTESPersonalCardViewController alloc] initWithUserId:userId];
|
||
//// // [self.navigationController pushViewController:vc animated:YES];
|
||
// ////需要获取爱鱼奇用户信息非本地用户暂无 建议查询爱鱼奇自己的用户系统
|
||
// NIMUser *user = [[NIMSDK sharedSDK].userManager userInfo:userId];
|
||
// //本地sdk缓存
|
||
// NSLog(@"user1%@",user);
|
||
// NSArray *IDArr=@[userId];
|
||
//
|
||
// [[NIMSDK sharedSDK].userManager fetchUserInfos:IDArr completion:^(NSArray<NIMUser *> * _Nullable users, NSError * _Nullable error) {
|
||
// NIMUser *user = users[0];
|
||
// //云信服务器
|
||
// NSLog(@"user2%@",user);
|
||
//
|
||
// }];
|
||
//
|
||
//
|
||
//
|
||
// }
|
||
//
|
||
|
||
//云信
|
||
//UIViewController *vc = [[NTESPersonalCardViewController alloc] initWithUserId:userId];
|
||
// [self.navigationController pushViewController:vc animated:YES];
|
||
|
||
|
||
}
|
||
|
||
|
||
#pragma mark - Cell Actions
|
||
- (void)showImage:(NIMMessage *)message
|
||
{
|
||
|
||
self.hidesBottomBarWhenPushed = YES;
|
||
|
||
NIMImageObject *object = message.messageObject;
|
||
NTESGalleryItem *item = [[NTESGalleryItem alloc] init];
|
||
item.thumbPath = [object thumbPath];
|
||
item.imageURL = [object url];
|
||
item.name = [object displayName];
|
||
NTESGalleryViewController *vc = [[NTESGalleryViewController alloc] initWithItem:item];
|
||
[self.navigationController pushViewController:vc animated:YES];
|
||
if(![[NSFileManager defaultManager] fileExistsAtPath:object.thumbPath]){
|
||
//如果缩略图下跪了,点进看大图的时候再去下一把缩略图
|
||
__weak typeof(self) wself = self;
|
||
[[NIMSDK sharedSDK].resourceManager download:object.thumbUrl filepath:object.thumbPath progress:nil completion:^(NSError *error) {
|
||
if (!error) {
|
||
[wself uiUpdateMessage:message];
|
||
}
|
||
}];
|
||
}
|
||
}
|
||
|
||
- (void)showVideo:(NIMMessage *)message
|
||
{
|
||
NIMVideoObject *object = message.messageObject;
|
||
NTESVideoViewController *playerViewController = [[NTESVideoViewController alloc] initWithVideoObject:object];
|
||
|
||
self.hidesBottomBarWhenPushed = YES;
|
||
|
||
[self.navigationController pushViewController:playerViewController animated:YES];
|
||
if(![[NSFileManager defaultManager] fileExistsAtPath:object.coverPath]){
|
||
//如果封面图下跪了,点进视频的时候再去下一把封面图
|
||
__weak typeof(self) wself = self;
|
||
[[NIMSDK sharedSDK].resourceManager download:object.coverUrl filepath:object.coverPath progress:nil completion:^(NSError *error) {
|
||
if (!error) {
|
||
[wself uiUpdateMessage:message];
|
||
}
|
||
}];
|
||
}
|
||
}
|
||
|
||
- (void)showLocation:(NIMMessage *)message
|
||
{
|
||
NIMLocationObject *object = message.messageObject;
|
||
NIMKitLocationPoint *locationPoint = [[NIMKitLocationPoint alloc] initWithLocationObject:object];
|
||
NIMLocationViewController *vc = [[NIMLocationViewController alloc] initWithLocationPoint:locationPoint];
|
||
self.hidesBottomBarWhenPushed = YES;
|
||
[self.navigationController pushViewController:vc animated:YES];
|
||
|
||
}
|
||
|
||
- (void)showFile:(NIMMessage *)message
|
||
{
|
||
NIMFileObject *object = message.messageObject;
|
||
NTESFilePreViewController *vc = [[NTESFilePreViewController alloc] initWithFileObject:object];
|
||
[self.navigationController pushViewController:vc animated:YES];
|
||
}
|
||
|
||
- (void)showCustom:(NIMMessage *)message
|
||
{
|
||
//普通的自定义消息点击事件可以在这里做哦~
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
#pragma mark - 导航按钮
|
||
- (void)onTouchUpInfoBtn:(id)sender{
|
||
NTESSessionCardViewController *vc = [[NTESSessionCardViewController alloc] initWithSession:self.session];
|
||
[self.navigationController pushViewController:vc animated:YES];
|
||
}
|
||
|
||
- (void)enterHistory:(id)sender{
|
||
[self.view endEditing:YES];
|
||
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"选择操作" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"云消息记录",@"搜索本地消息记录",@"清空本地聊天记录", nil];
|
||
[sheet showInView:self.view completionHandler:^(NSInteger index) {
|
||
switch (index) {
|
||
case 0:{ //查看云端消息
|
||
NTESSessionRemoteHistoryViewController *vc = [[NTESSessionRemoteHistoryViewController alloc] initWithSession:self.session];
|
||
self.hidesBottomBarWhenPushed = YES;
|
||
[self.navigationController pushViewController:vc animated:YES];
|
||
break;
|
||
}
|
||
case 1:{ //搜索本地消息
|
||
NTESSessionLocalHistoryViewController *vc = [[NTESSessionLocalHistoryViewController alloc] initWithSession:self.session];
|
||
self.hidesBottomBarWhenPushed = YES;
|
||
[self.navigationController pushViewController:vc animated:YES];
|
||
break;
|
||
}
|
||
case 2:{ //清空聊天记录
|
||
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定清空聊天记录?" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:nil, nil];
|
||
__weak UIActionSheet *wSheet;
|
||
[sheet showInView:self.view completionHandler:^(NSInteger index) {
|
||
if (index == wSheet.destructiveButtonIndex) {
|
||
BOOL removeRecentSession = [NTESBundleSetting sharedConfig].removeSessionWheDeleteMessages;
|
||
[[NIMSDK sharedSDK].conversationManager deleteAllmessagesInSession:self.session removeRecentSession:removeRecentSession];
|
||
}
|
||
}];
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
}];
|
||
}
|
||
|
||
- (void)enterTeamCard:(id)sender{
|
||
NIMTeam *team = [[NIMSDK sharedSDK].teamManager teamById:self.session.sessionId];
|
||
UIViewController *vc;
|
||
if (team.type == NIMTeamTypeNormal) {
|
||
vc = [[NIMNormalTeamCardViewController alloc] initWithTeam:team];
|
||
}else if(team.type == NIMTeamTypeAdvanced){
|
||
vc = [[NIMAdvancedTeamCardViewController alloc] initWithTeam:team];
|
||
}
|
||
self.hidesBottomBarWhenPushed = YES;
|
||
[self.navigationController pushViewController:vc animated:YES];
|
||
}
|
||
|
||
#pragma mark - 菜单
|
||
- (NSArray *)menusItems:(NIMMessage *)message
|
||
{
|
||
NSMutableArray *items = [NSMutableArray array];
|
||
NSArray *defaultItems = [super menusItems:message];
|
||
if (defaultItems) {
|
||
[items addObjectsFromArray:defaultItems];
|
||
}
|
||
|
||
// if ([NTESSessionUtil canMessageBeForwarded:message]) {
|
||
// [items addObject:[[UIMenuItem alloc] initWithTitle:@"转发" action:@selector(forwardMessage:)]];
|
||
// }
|
||
|
||
// if ([NTESSessionUtil canMessageBeRevoked:message]) {
|
||
// [items addObject:[[UIMenuItem alloc] initWithTitle:@"撤回" action:@selector(revokeMessage:)]];
|
||
// }
|
||
|
||
// if (message.messageType == NIMMessageTypeAudio) {
|
||
// [items addObject:[[UIMenuItem alloc] initWithTitle:@"转文字" action:@selector(audio2Text:)]];
|
||
// }
|
||
|
||
return items;
|
||
|
||
}
|
||
|
||
- (void)audio2Text:(id)sender
|
||
{
|
||
NIMMessage *message = [self messageForMenu];
|
||
__weak typeof(self) wself = self;
|
||
NTESAudio2TextViewController *vc = [[NTESAudio2TextViewController alloc] initWithMessage:message];
|
||
vc.completeHandler = ^(void){
|
||
[wself uiUpdateMessage:message];
|
||
};
|
||
[self presentViewController:vc
|
||
animated:YES
|
||
completion:nil];
|
||
}
|
||
|
||
|
||
- (void)forwardMessage:(id)sender
|
||
{
|
||
NIMMessage *message = [self messageForMenu];
|
||
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"选择会话类型" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"个人",@"群组", nil];
|
||
__weak typeof(self) weakSelf = self;
|
||
[sheet showInView:self.view completionHandler:^(NSInteger index) {
|
||
switch (index) {
|
||
case 0:{
|
||
NIMContactFriendSelectConfig *config = [[NIMContactFriendSelectConfig alloc] init];
|
||
config.needMutiSelected = NO;
|
||
NIMContactSelectViewController *vc = [[NIMContactSelectViewController alloc] initWithConfig:config];
|
||
vc.finshBlock = ^(NSArray *array){
|
||
NSString *userId = array.firstObject;
|
||
NIMSession *session = [NIMSession session:userId type:NIMSessionTypeP2P];
|
||
[weakSelf forwardMessage:message toSession:session];
|
||
};
|
||
[vc show];
|
||
}
|
||
break;
|
||
case 1:{
|
||
NIMContactTeamSelectConfig *config = [[NIMContactTeamSelectConfig alloc] init];
|
||
NIMContactSelectViewController *vc = [[NIMContactSelectViewController alloc] initWithConfig:config];
|
||
vc.finshBlock = ^(NSArray *array){
|
||
NSString *teamId = array.firstObject;
|
||
NIMSession *session = [NIMSession session:teamId type:NIMSessionTypeTeam];
|
||
[weakSelf forwardMessage:message toSession:session];
|
||
};
|
||
[vc show];
|
||
}
|
||
break;
|
||
case 2:
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}];
|
||
}
|
||
|
||
|
||
- (void)revokeMessage:(id)sender
|
||
{
|
||
NIMMessage *message = [self messageForMenu];
|
||
__weak typeof(self) weakSelf = self;
|
||
[[NIMSDK sharedSDK].chatManager revokeMessage:message completion:^(NSError * _Nullable error) {
|
||
if (error) {
|
||
if (error.code == NIMRemoteErrorCodeDomainExpireOld) {
|
||
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"发送时间超过2分钟的消息,不能被撤回" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
|
||
[alert show];
|
||
}else{
|
||
NSLog(@"revoke message eror code %zd",error.code);
|
||
[weakSelf.view makeToast:@"消息撤回失败,请重试"];
|
||
}
|
||
}
|
||
else
|
||
{
|
||
NIMMessageModel *model = [self uiDeleteMessage:message];
|
||
NIMMessage *tip = [NTESSessionMsgConverter msgWithTip:[NTESSessionUtil tipOnMessageRevoked:message]];
|
||
tip.timestamp = model.messageTime;
|
||
[self uiAddMessages:@[tip]];
|
||
|
||
tip.timestamp = message.timestamp;
|
||
// saveMessage 方法执行成功后会触发 onRecvMessages: 回调,但是这个回调上来的 NIMMessage 时间为服务器时间,和界面上的时间有一定出入,所以要提前先在界面上插入一个和被删消息的界面时间相符的 Tip, 当触发 onRecvMessages: 回调时,组件判断这条消息已经被插入过了,就会忽略掉。
|
||
[[NIMSDK sharedSDK].conversationManager saveMessage:tip forSession:message.session completion:nil];
|
||
}
|
||
}];
|
||
}
|
||
|
||
|
||
- (void)forwardMessage:(NIMMessage *)message toSession:(NIMSession *)session
|
||
{
|
||
NSString *name;
|
||
if (session.sessionType == NIMSessionTypeP2P)
|
||
{
|
||
name = [[NIMKit sharedKit] infoByUser:session.sessionId inSession:session].showName;
|
||
}
|
||
else
|
||
{
|
||
name = [[NIMKit sharedKit] infoByTeam:session.sessionId].showName;
|
||
}
|
||
NSString *tip = [NSString stringWithFormat:@"确认转发给 %@ ?",name];
|
||
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"确认转发" message:tip delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil];
|
||
|
||
__weak typeof(self) weakSelf = self;
|
||
[alert showAlertWithCompletionHandler:^(NSInteger index) {
|
||
if(index == 1){
|
||
[[NIMSDK sharedSDK].chatManager forwardMessage:message toSession:session error:nil];
|
||
[weakSelf.view makeToast:@"已发送" ];
|
||
}
|
||
}];
|
||
}
|
||
|
||
#pragma mark - 辅助方法
|
||
- (BOOL)checkCondition
|
||
{
|
||
BOOL result = YES;
|
||
|
||
if (![[Reachability reachabilityForInternetConnection] isReachable]) {
|
||
[self.view makeToast:@"请检查网络"];
|
||
result = NO;
|
||
}
|
||
NSString *currentAccount = [[NIMSDK sharedSDK].loginManager currentAccount];
|
||
if ([currentAccount isEqualToString:self.session.sessionId]) {
|
||
[self.view makeToast:@"不能和自己通话哦" ];
|
||
result = NO;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
- (NSDictionary *)cellActions
|
||
{
|
||
static NSDictionary *actions = nil;
|
||
static dispatch_once_t onceToken;
|
||
dispatch_once(&onceToken, ^{
|
||
actions = @{@(NIMMessageTypeImage) : @"showImage:",
|
||
@(NIMMessageTypeAudio) : @"playAudio:",
|
||
@(NIMMessageTypeVideo) : @"showVideo:",
|
||
@(NIMMessageTypeLocation) : @"showLocation:",
|
||
@(NIMMessageTypeFile) : @"showFile:",
|
||
@(NIMMessageTypeCustom): @"showCustom:"};
|
||
});
|
||
return actions;
|
||
}
|
||
|
||
- (BOOL)shouldAutorotate{
|
||
return !self.currentSingleSnapView;
|
||
}
|
||
|
||
- (void)didReceiveMemoryWarning {
|
||
[super didReceiveMemoryWarning];
|
||
// Dispose of any resources that can be recreated.
|
||
}
|
||
|
||
- (void)dealloc
|
||
{
|
||
[[[NIMSDK sharedSDK] systemNotificationManager] removeDelegate:self];
|
||
[_fpsLabel invalidate];
|
||
}
|
||
|
||
- (void)viewDidLayoutSubviews{
|
||
[super viewDidLayoutSubviews];
|
||
self.fpsLabel.right = self.view.width;
|
||
self.fpsLabel.top = self.tableView.top + self.tableView.contentInset.top;
|
||
}
|
||
|
||
- (void)viewWillDisappear:(BOOL)animated{
|
||
[super viewWillDisappear:animated];
|
||
[[NIMSDK sharedSDK].mediaManager stopRecord];
|
||
[[NIMSDK sharedSDK].mediaManager stopPlay];
|
||
}
|
||
|
||
|
||
//爱鱼奇消息扩展
|
||
|
||
-(void)onTapContentText:(RemoteExtMassageModel *)massageModel
|
||
{
|
||
|
||
//all_shops_push 所有商家推送
|
||
if ([massageModel.pushType isEqualToString:@"all_push"]||[massageModel.pushType isEqualToString:@"all_ios_push"]||[massageModel.pushType isEqualToString:@"all_shops_push"]) {
|
||
|
||
if (![massageModel.pushlink isKindOfClass:[NSNull class]] &&massageModel.pushlink &&![massageModel.pushlink isEqualToString:@""]) {
|
||
|
||
PushMasssageWebViewController *webVC = [[PushMasssageWebViewController alloc] init];
|
||
webVC.pushlink = massageModel.pushlink;
|
||
webVC.pushtitle = massageModel.pushTitle;
|
||
self.hidesBottomBarWhenPushed = YES;
|
||
|
||
[self.navigationController pushViewController:webVC animated:YES];
|
||
}
|
||
|
||
}else if ([massageModel.pushType isEqualToString:@"send_report"]){
|
||
|
||
|
||
if (![massageModel.pushId isKindOfClass:[NSNull class]] && ![massageModel.pushlink isKindOfClass:[NSNull class]] && massageModel.pushId !=nil && massageModel.pushlink!=nil) {
|
||
|
||
[self kanHuBaoGaoXiangQingwithReportId:massageModel.pushId addUrl:massageModel.pushlink];
|
||
|
||
}else{
|
||
|
||
[self.view makeToast:@"reportId 或 url 为空"];
|
||
}
|
||
}
|
||
}
|
||
|
||
//查询看护报告详情
|
||
-(void)kanHuBaoGaoXiangQingwithReportId:(NSString*)reportId addUrl:(NSString *)shareUrl{
|
||
|
||
[AFNOHeaderHttpTool getLookReportById:reportId success:^(id response) {
|
||
|
||
NSDictionary*resultDic=[NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableContainers error:nil];
|
||
|
||
if ([resultDic[@"result"] isEqualToString:@"100"]) {
|
||
|
||
NSDictionary *dataDic = resultDic[@"data"];
|
||
|
||
ShareReportViewController *shareVC=[[ShareReportViewController alloc] init];
|
||
|
||
KanHuBaoGaoModel *bagM =[[KanHuBaoGaoModel alloc] init];
|
||
bagM.shareImg = dataDic[@"shareImg"];
|
||
bagM.timestamp = dataDic[@"timestamp"];
|
||
bagM.totalIndex = dataDic[@"totalIndex"];
|
||
bagM.baifenbi = dataDic[@"baifenbi"];
|
||
bagM.reportId = dataDic[@"reportId"];
|
||
bagM.userImg = dataDic[@"userImg"];
|
||
bagM.shopsName =dataDic[@"shopsName"];
|
||
bagM.signature = dataDic[@"signature"];
|
||
shareVC.baGaoMod = bagM;
|
||
PingfenModel *PFMode1=[[PingfenModel alloc] init];
|
||
PFMode1.pingFenDesc = dataDic[@"index1Text"];
|
||
PFMode1.pingFenNumber = dataDic[@"index1"];
|
||
|
||
PingfenModel *PFMode2=[[PingfenModel alloc] init];
|
||
PFMode2.pingFenDesc = dataDic[@"index2Text"];
|
||
PFMode2.pingFenNumber = dataDic[@"index2"];
|
||
|
||
PingfenModel *PFMode3=[[PingfenModel alloc] init];
|
||
PFMode3.pingFenDesc = dataDic[@"index3Text"];
|
||
PFMode3.pingFenNumber = dataDic[@"index3"];
|
||
NSArray *pingfenArr=@[PFMode1,PFMode2,PFMode3];
|
||
shareVC.pinFenArr = pingfenArr;
|
||
|
||
NSString *suggesttrue=dataDic[@"suggestion"];
|
||
|
||
shareVC.suggesttrue = suggesttrue;
|
||
shareVC.shareUrl = shareUrl;
|
||
|
||
self.hidesBottomBarWhenPushed = YES;
|
||
[self.navigationController pushViewController:shareVC animated:YES];
|
||
|
||
|
||
}else{
|
||
|
||
[self.view makeToast:@"看护报告详情查询失败"];
|
||
}
|
||
|
||
|
||
} failure:^(NSError *err) {
|
||
|
||
[self.view makeToast:@"请检查网络"];
|
||
|
||
}];
|
||
|
||
}
|
||
|
||
@end
|