| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- /************************************************************
- * * Hyphenate CONFIDENTIAL
- * __________________
- * Copyright (C) 2016 Hyphenate Inc. All rights reserved.
- *
- * NOTICE: All information contained herein is, and remains
- * the property of Hyphenate Inc.
- * Dissemination of this information or reproduction of this material
- * is strictly forbidden unless prior written permission is obtained
- * from Hyphenate Inc.
- */
- #import <MobileCoreServices/MobileCoreServices.h>
- #import <AVFoundation/AVFoundation.h>
- #import <MediaPlayer/MediaPlayer.h>
- #import "EaseRefreshTableViewController.h"
- #import "IMessageModel.h"
- #import "EaseMessageModel.h"
- #import "EaseBaseMessageCell.h"
- #import "EaseMessageTimeCell.h"
- #import "EaseChatToolbar.h"
- //#import "EaseLocationViewController.h"
- #import "EMCDDeviceManager+Media.h"
- #import "EMCDDeviceManager+ProximitySensor.h"
- #import "UIViewController+HUD.h"
- #import "EaseSDKHelper.h"
- @interface EaseAtTarget : NSObject
- @property (nonatomic, copy) NSString *userId;
- @property (nonatomic, copy) NSString *nickname;
- - (instancetype)initWithUserId:(NSString*)userId andNickname:(NSString*)nickname;
- @end
- typedef void(^EaseSelectAtTargetCallback)(EaseAtTarget*);
- @class EaseMessageViewController;
- @protocol EaseMessageViewControllerDelegate <NSObject>
- @optional
- /*!
- @method
- @brief 获取消息自定义cell
- @discussion 用户根据messageModel判断是否显示自定义cell,返回nil显示默认cell,否则显示用户自定义cell
- @param tableView 当前消息视图的tableView
- @param messageModel 消息模型
- @result 返回用户自定义cell
- */
- - (UITableViewCell *)messageViewController:(UITableView *)tableView
- cellForMessageModel:(id<IMessageModel>)messageModel;
- /*!
- @method
- @brief 获取消息cell高度
- @discussion 用户根据messageModel判断,是否自定义显示cell的高度
- @param viewController 当前消息视图
- @param messageModel 消息模型
- @param cellWidth 视图宽度
- @result 返回用户自定义cell
- */
- - (CGFloat)messageViewController:(EaseMessageViewController *)viewController
- heightForMessageModel:(id<IMessageModel>)messageModel
- withCellWidth:(CGFloat)cellWidth;
- /*!
- @method
- @brief 接收到消息的已读回执
- @discussion 接收到消息的已读回执的回调,用户可以自定义处理
- @param viewController 当前消息视图
- @param messageModel 消息模型
- @result
- */
- - (void)messageViewController:(EaseMessageViewController *)viewController
- didReceiveHasReadAckForModel:(id<IMessageModel>)messageModel;
- /*!
- @method
- @brief 选中消息
- @discussion 选中消息的回调,用户可以自定义处理
- @param viewController 当前消息视图
- @param messageModel 消息模型
- @result
- */
- - (BOOL)messageViewController:(EaseMessageViewController *)viewController
- didSelectMessageModel:(id<IMessageModel>)messageModel;
- /*!
- @method
- @brief 点击消息头像
- @discussion 获取用户点击头像回调
- @param viewController 当前消息视图
- @param messageModel 消息模型
- @result
- */
- - (void)messageViewController:(EaseMessageViewController *)viewController
- didSelectAvatarMessageModel:(id<IMessageModel>)messageModel;
- /*!
- @method
- @brief 选中底部功能按钮
- @discussion 消息发送成功的回调,用户可以自定义处理
- @param viewController 当前消息视图
- @param messageModel 消息模型
- @param index 选中底部功能按钮索引
- @result
- */
- - (void)messageViewController:(EaseMessageViewController *)viewController
- didSelectMoreView:(EaseChatBarMoreView *)moreView
- AtIndex:(NSInteger)index;
- /*!
- @method
- @brief 底部录音功能按钮状态回调
- @discussion 获取底部录音功能按钮状态回调,根据EaseRecordViewType,用户自定义处理UI的逻辑
- @param viewController 当前消息视图
- @param recordView 录音视图
- @param type 录音按钮当前状态
- @result
- */
- - (void)messageViewController:(EaseMessageViewController *)viewController
- didSelectRecordView:(UIView *)recordView
- withEvenType:(EaseRecordViewType)type;
- /*!
- @method
- @brief 获取要@的对象
- @discussion 用户输入了@,选择要@的对象
- @param selectedCallback 用于回调要@的对象的block
- @result
- */
- - (void)messageViewController:(EaseMessageViewController *)viewController
- selectAtTarget:(EaseSelectAtTargetCallback)selectedCallback;
- @end
- @protocol EaseMessageViewControllerDataSource <NSObject>
- @optional
- /*!
- @method
- @brief 指定消息附件上传或者下载进度的监听者,默认self
- @discussion
- @param viewController 当前消息视图
- @param messageBodyType
- @result
- */
- - (id)messageViewController:(EaseMessageViewController *)viewController
- progressDelegateForMessageBodyType:(EMMessageBodyType)messageBodyType;
- /*!
- @method
- @brief 附件进度有更新
- @discussion
- @param viewController 当前消息视图
- @param progress
- @param messageModel
- @param messageBody
- @result
- */
- - (void)messageViewController:(EaseMessageViewController *)viewController
- updateProgress:(float)progress
- messageModel:(id<IMessageModel>)messageModel
- messageBody:(EMMessageBody*)messageBody;
- /*!
- @method
- @brief 消息时间间隔描述
- @discussion
- @param viewController 当前消息视图
- @param NSDate 时间
- @result 返回消息时间描述
- */
- - (NSString *)messageViewController:(EaseMessageViewController *)viewController
- stringForDate:(NSDate *)date;
- /*!
- @method
- @brief 将EMMessage类型转换为符合<IMessageModel>协议的类型
- @discussion 将EMMessage类型转换为符合<IMessageModel>协议的类型,设置用户信息,消息显示用户昵称和头像
- @param viewController 当前消息视图
- @param EMMessage 聊天消息对象类型
- @result 返回<IMessageModel>协议的类型
- */
- - (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController
- modelForMessage:(EMMessage *)message;
- /*!
- @method
- @brief 是否允许长按
- @discussion 获取是否允许长按的回调,默认是NO
- @param viewController 当前消息视图
- @param indexPath 长按消息对应的indexPath
- @result
- */
- - (BOOL)messageViewController:(EaseMessageViewController *)viewController
- canLongPressRowAtIndexPath:(NSIndexPath *)indexPath;
- /*!
- @method
- @brief 触发长按手势
- @discussion 获取触发长按手势的回调,默认是NO
- @param viewController 当前消息视图
- @param indexPath 长按消息对应的indexPath
- @result
- */
- - (BOOL)messageViewController:(EaseMessageViewController *)viewController
- didLongPressRowAtIndexPath:(NSIndexPath *)indexPath;
- /*!
- @method
- @brief 是否标记为已读
- @discussion 是否标记为已读的回调
- @param viewController 当前消息视图
- @result
- */
- - (BOOL)messageViewControllerShouldMarkMessagesAsRead:(EaseMessageViewController *)viewController;
- /*!
- @method
- @brief 是否发送已读回执
- @discussion
- @param viewController 当前消息视图
- @param message 要发送已读回执的message
- @param read message是否已读
- @result
- */
- - (BOOL)messageViewController:(EaseMessageViewController *)viewController
- shouldSendHasReadAckForMessage:(EMMessage *)message
- read:(BOOL)read;
- /*!
- @method
- @brief 判断消息是否为表情消息
- @discussion
- @param viewController 当前消息视图
- @param message 要发送已读回执的message
- @param messageModel 消息模型
- @result
- */
- - (BOOL)isEmotionMessageFormessageViewController:(EaseMessageViewController *)viewController
- messageModel:(id<IMessageModel>)messageModel;
- /*!
- @method
- @brief 根据消息获取表情信息
- @discussion
- @param viewController 当前消息视图
- @param message 要发送已读回执的message
- @param messageModel 消息模型
- @result
- */
- - (EaseEmotion*)emotionURLFormessageViewController:(EaseMessageViewController *)viewController
- messageModel:(id<IMessageModel>)messageModel;
- /*!
- @method
- @brief 获取表情列表
- @discussion
- @param viewController 当前消息视图
- @result
- */
- - (NSArray*)emotionFormessageViewController:(EaseMessageViewController *)viewController;
- /*!
- @method
- @brief 获取发送表情消息的扩展字段
- @discussion
- @param viewController 当前消息视图
- @param easeEmotion
- @result
- */
- - (NSDictionary*)emotionExtFormessageViewController:(EaseMessageViewController *)viewController
- easeEmotion:(EaseEmotion*)easeEmotion;
- /*!
- @method
- @brief view标记已读
- @discussion
- @param viewController 当前消息视图
- @result
- */
- - (void)messageViewControllerMarkAllMessagesAsRead:(EaseMessageViewController *)viewController;
- @end
- @interface EaseMessageViewController : EaseRefreshTableViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate, EMChatManagerDelegate, EMCDDeviceManagerDelegate, EMChatToolbarDelegate, EaseChatBarMoreViewDelegate,EMChatroomManagerDelegate, EaseMessageCellDelegate>
- @property (weak, nonatomic) id<EaseMessageViewControllerDelegate> delegate;
- @property (weak, nonatomic) id<EaseMessageViewControllerDataSource> dataSource;
- /*!
- @property
- @brief 聊天的会话对象
- */
- @property (strong, nonatomic) EMConversation *conversation;
- /*!
- @property
- @brief 时间间隔标记
- */
- @property (nonatomic) NSTimeInterval messageTimeIntervalTag;
- /*!
- @property
- @brief 如果conversation中没有任何消息,退出该页面时是否删除该conversation
- */
- @property (nonatomic) BOOL deleteConversationIfNull; //default YES;
- /*!
- @property
- @brief 当前页面显示时,是否滚动到最后一条
- */
- @property (nonatomic) BOOL scrollToBottomWhenAppear; //default YES;
- /*!
- @property
- @brief 页面是否处于显示状态
- */
- @property (nonatomic) BOOL isViewDidAppear;
- /*!
- @property
- @brief 加载的每页message的条数
- */
- @property (nonatomic) NSInteger messageCountOfPage; //default 50
- /*!
- @property
- @brief 时间分割cell的高度
- */
- @property (nonatomic) CGFloat timeCellHeight;
- /*!
- @property
- @brief 显示的EMMessage类型的消息列表
- */
- @property (strong, nonatomic) NSMutableArray *messsagesSource;
- /*!
- @property
- @brief 底部输入控件
- */
- @property (strong, nonatomic) UIView *chatToolbar;
- /*!
- @property
- @brief 底部功能控件
- */
- @property(strong, nonatomic) EaseChatBarMoreView *chatBarMoreView;
- /*!
- @property
- @brief 底部表情控件
- */
- @property(strong, nonatomic) EaseFaceView *faceView;
- /*!
- @property
- @brief 底部录音控件
- */
- @property(strong, nonatomic) EaseRecordView *recordView;
- /*!
- @property
- @brief 菜单(消息复制,删除)
- */
- @property (strong, nonatomic) UIMenuController *menuController;
- /*!
- @property
- @brief 选中消息菜单索引
- */
- @property (strong, nonatomic) NSIndexPath *menuIndexPath;
- /*!
- @property
- @brief 图片选择器
- */
- @property (strong, nonatomic) UIImagePickerController *imagePicker;
- /*!
- @property
- @brief 是否已经加入聊天室
- */
- @property (nonatomic) BOOL isJoinedChatroom;
- /*!
- @method
- @brief 初始化聊天页面
- @discussion
- @param conversationChatter 会话对方的用户名. 如果是群聊, 则是群组的id
- @param conversationType 会话类型
- @result
- */
- - (instancetype)initWithConversationChatter:(NSString *)conversationChatter
- conversationType:(EMConversationType)conversationType;
- /*!
- @method
- @brief 下拉加载更多
- @discussion
- @result
- */
- - (void)tableViewDidTriggerHeaderRefresh;
- /*!
- @method
- @brief 发送文本消息
- @discussion
- @param text 文本消息
- @result
- */
- - (void)sendTextMessage:(NSString *)text;
- /*!
- @method
- @brief 发送文本消息
- @discussion
- @param text 文本消息
- @param ext 扩展信息
- @result
- */
- - (void)sendTextMessage:(NSString *)text withExt:(NSDictionary*)ext;
- /*!
- @method
- @brief 发送图片消息
- @discussion
- @param image 发送图片
- @result
- */
- - (void)sendImageMessage:(UIImage *)image;
- /*!
- @method
- @brief 发送位置消息
- @discussion
- @param latitude 经度
- @param longitude 纬度
- @param address 地址
- @result
- */
- - (void)sendLocationMessageLatitude:(double)latitude
- longitude:(double)longitude
- andAddress:(NSString *)address;
- /*!
- @method
- @brief 发送语音消息
- @discussion
- @param localPath 语音本地地址
- @param duration 时长
- @result
- */
- - (void)sendVoiceMessageWithLocalPath:(NSString *)localPath
- duration:(NSInteger)duration;
- /*!
- @method
- @brief 发送视频消息
- @discussion
- @param url 视频url
- @result
- */
- - (void)sendVideoMessageWithURL:(NSURL *)url;
- /*!
- @method
- @brief 发送视频消息
- @discussion
- @param url 视频url
- @result
- */
- - (void)sendFileMessageWith:(EMMessage *)message;
- /*!
- @method
- @brief 添加消息
- @discussion
- @param message 聊天消息类
- @param progress 聊天消息发送接收进度条
- @result
- */
- - (void)addMessageToDataSource:(EMMessage *)message
- progress:(id)progress;
- /*!
- @method
- @brief 显示消息长按菜单
- @discussion
- @param showInView 菜单的父视图
- @param showInView 索引
- @param messageType 消息类型
- @result
- */
- - (void)showMenuViewController:(UIView *)showInView
- andIndexPath:(NSIndexPath *)indexPath
- messageType:(EMMessageBodyType)messageType;
- /*!
- @method
- @brief 判断消息是否要发送已读回执
- @discussion
- @param message 聊天消息
- @param read 是否附件消息已读
- @result
- */
- - (BOOL)shouldSendHasReadAckForMessage:(EMMessage *)message
- read:(BOOL)read;
- @end
|