EaseMessageViewController.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. /************************************************************
  2. * * Hyphenate CONFIDENTIAL
  3. * __________________
  4. * Copyright (C) 2016 Hyphenate Inc. All rights reserved.
  5. *
  6. * NOTICE: All information contained herein is, and remains
  7. * the property of Hyphenate Inc.
  8. * Dissemination of this information or reproduction of this material
  9. * is strictly forbidden unless prior written permission is obtained
  10. * from Hyphenate Inc.
  11. */
  12. #import <MobileCoreServices/MobileCoreServices.h>
  13. #import <AVFoundation/AVFoundation.h>
  14. #import <MediaPlayer/MediaPlayer.h>
  15. #import "EaseRefreshTableViewController.h"
  16. #import "IMessageModel.h"
  17. #import "EaseMessageModel.h"
  18. #import "EaseBaseMessageCell.h"
  19. #import "EaseMessageTimeCell.h"
  20. #import "EaseChatToolbar.h"
  21. //#import "EaseLocationViewController.h"
  22. #import "EMCDDeviceManager+Media.h"
  23. #import "EMCDDeviceManager+ProximitySensor.h"
  24. #import "UIViewController+HUD.h"
  25. #import "EaseSDKHelper.h"
  26. @interface EaseAtTarget : NSObject
  27. @property (nonatomic, copy) NSString *userId;
  28. @property (nonatomic, copy) NSString *nickname;
  29. - (instancetype)initWithUserId:(NSString*)userId andNickname:(NSString*)nickname;
  30. @end
  31. typedef void(^EaseSelectAtTargetCallback)(EaseAtTarget*);
  32. @class EaseMessageViewController;
  33. @protocol EaseMessageViewControllerDelegate <NSObject>
  34. @optional
  35. /*!
  36. @method
  37. @brief 获取消息自定义cell
  38. @discussion 用户根据messageModel判断是否显示自定义cell,返回nil显示默认cell,否则显示用户自定义cell
  39. @param tableView 当前消息视图的tableView
  40. @param messageModel 消息模型
  41. @result 返回用户自定义cell
  42. */
  43. - (UITableViewCell *)messageViewController:(UITableView *)tableView
  44. cellForMessageModel:(id<IMessageModel>)messageModel;
  45. /*!
  46. @method
  47. @brief 获取消息cell高度
  48. @discussion 用户根据messageModel判断,是否自定义显示cell的高度
  49. @param viewController 当前消息视图
  50. @param messageModel 消息模型
  51. @param cellWidth 视图宽度
  52. @result 返回用户自定义cell
  53. */
  54. - (CGFloat)messageViewController:(EaseMessageViewController *)viewController
  55. heightForMessageModel:(id<IMessageModel>)messageModel
  56. withCellWidth:(CGFloat)cellWidth;
  57. /*!
  58. @method
  59. @brief 接收到消息的已读回执
  60. @discussion 接收到消息的已读回执的回调,用户可以自定义处理
  61. @param viewController 当前消息视图
  62. @param messageModel 消息模型
  63. @result
  64. */
  65. - (void)messageViewController:(EaseMessageViewController *)viewController
  66. didReceiveHasReadAckForModel:(id<IMessageModel>)messageModel;
  67. /*!
  68. @method
  69. @brief 选中消息
  70. @discussion 选中消息的回调,用户可以自定义处理
  71. @param viewController 当前消息视图
  72. @param messageModel 消息模型
  73. @result
  74. */
  75. - (BOOL)messageViewController:(EaseMessageViewController *)viewController
  76. didSelectMessageModel:(id<IMessageModel>)messageModel;
  77. /*!
  78. @method
  79. @brief 点击消息头像
  80. @discussion 获取用户点击头像回调
  81. @param viewController 当前消息视图
  82. @param messageModel 消息模型
  83. @result
  84. */
  85. - (void)messageViewController:(EaseMessageViewController *)viewController
  86. didSelectAvatarMessageModel:(id<IMessageModel>)messageModel;
  87. /*!
  88. @method
  89. @brief 选中底部功能按钮
  90. @discussion 消息发送成功的回调,用户可以自定义处理
  91. @param viewController 当前消息视图
  92. @param messageModel 消息模型
  93. @param index 选中底部功能按钮索引
  94. @result
  95. */
  96. - (void)messageViewController:(EaseMessageViewController *)viewController
  97. didSelectMoreView:(EaseChatBarMoreView *)moreView
  98. AtIndex:(NSInteger)index;
  99. /*!
  100. @method
  101. @brief 底部录音功能按钮状态回调
  102. @discussion 获取底部录音功能按钮状态回调,根据EaseRecordViewType,用户自定义处理UI的逻辑
  103. @param viewController 当前消息视图
  104. @param recordView 录音视图
  105. @param type 录音按钮当前状态
  106. @result
  107. */
  108. - (void)messageViewController:(EaseMessageViewController *)viewController
  109. didSelectRecordView:(UIView *)recordView
  110. withEvenType:(EaseRecordViewType)type;
  111. /*!
  112. @method
  113. @brief 获取要@的对象
  114. @discussion 用户输入了@,选择要@的对象
  115. @param selectedCallback 用于回调要@的对象的block
  116. @result
  117. */
  118. - (void)messageViewController:(EaseMessageViewController *)viewController
  119. selectAtTarget:(EaseSelectAtTargetCallback)selectedCallback;
  120. @end
  121. @protocol EaseMessageViewControllerDataSource <NSObject>
  122. @optional
  123. /*!
  124. @method
  125. @brief 指定消息附件上传或者下载进度的监听者,默认self
  126. @discussion
  127. @param viewController 当前消息视图
  128. @param messageBodyType
  129. @result
  130. */
  131. - (id)messageViewController:(EaseMessageViewController *)viewController
  132. progressDelegateForMessageBodyType:(EMMessageBodyType)messageBodyType;
  133. /*!
  134. @method
  135. @brief 附件进度有更新
  136. @discussion
  137. @param viewController 当前消息视图
  138. @param progress
  139. @param messageModel
  140. @param messageBody
  141. @result
  142. */
  143. - (void)messageViewController:(EaseMessageViewController *)viewController
  144. updateProgress:(float)progress
  145. messageModel:(id<IMessageModel>)messageModel
  146. messageBody:(EMMessageBody*)messageBody;
  147. /*!
  148. @method
  149. @brief 消息时间间隔描述
  150. @discussion
  151. @param viewController 当前消息视图
  152. @param NSDate 时间
  153. @result 返回消息时间描述
  154. */
  155. - (NSString *)messageViewController:(EaseMessageViewController *)viewController
  156. stringForDate:(NSDate *)date;
  157. /*!
  158. @method
  159. @brief 将EMMessage类型转换为符合<IMessageModel>协议的类型
  160. @discussion 将EMMessage类型转换为符合<IMessageModel>协议的类型,设置用户信息,消息显示用户昵称和头像
  161. @param viewController 当前消息视图
  162. @param EMMessage 聊天消息对象类型
  163. @result 返回<IMessageModel>协议的类型
  164. */
  165. - (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController
  166. modelForMessage:(EMMessage *)message;
  167. /*!
  168. @method
  169. @brief 是否允许长按
  170. @discussion 获取是否允许长按的回调,默认是NO
  171. @param viewController 当前消息视图
  172. @param indexPath 长按消息对应的indexPath
  173. @result
  174. */
  175. - (BOOL)messageViewController:(EaseMessageViewController *)viewController
  176. canLongPressRowAtIndexPath:(NSIndexPath *)indexPath;
  177. /*!
  178. @method
  179. @brief 触发长按手势
  180. @discussion 获取触发长按手势的回调,默认是NO
  181. @param viewController 当前消息视图
  182. @param indexPath 长按消息对应的indexPath
  183. @result
  184. */
  185. - (BOOL)messageViewController:(EaseMessageViewController *)viewController
  186. didLongPressRowAtIndexPath:(NSIndexPath *)indexPath;
  187. /*!
  188. @method
  189. @brief 是否标记为已读
  190. @discussion 是否标记为已读的回调
  191. @param viewController 当前消息视图
  192. @result
  193. */
  194. - (BOOL)messageViewControllerShouldMarkMessagesAsRead:(EaseMessageViewController *)viewController;
  195. /*!
  196. @method
  197. @brief 是否发送已读回执
  198. @discussion
  199. @param viewController 当前消息视图
  200. @param message 要发送已读回执的message
  201. @param read message是否已读
  202. @result
  203. */
  204. - (BOOL)messageViewController:(EaseMessageViewController *)viewController
  205. shouldSendHasReadAckForMessage:(EMMessage *)message
  206. read:(BOOL)read;
  207. /*!
  208. @method
  209. @brief 判断消息是否为表情消息
  210. @discussion
  211. @param viewController 当前消息视图
  212. @param message 要发送已读回执的message
  213. @param messageModel 消息模型
  214. @result
  215. */
  216. - (BOOL)isEmotionMessageFormessageViewController:(EaseMessageViewController *)viewController
  217. messageModel:(id<IMessageModel>)messageModel;
  218. /*!
  219. @method
  220. @brief 根据消息获取表情信息
  221. @discussion
  222. @param viewController 当前消息视图
  223. @param message 要发送已读回执的message
  224. @param messageModel 消息模型
  225. @result
  226. */
  227. - (EaseEmotion*)emotionURLFormessageViewController:(EaseMessageViewController *)viewController
  228. messageModel:(id<IMessageModel>)messageModel;
  229. /*!
  230. @method
  231. @brief 获取表情列表
  232. @discussion
  233. @param viewController 当前消息视图
  234. @result
  235. */
  236. - (NSArray*)emotionFormessageViewController:(EaseMessageViewController *)viewController;
  237. /*!
  238. @method
  239. @brief 获取发送表情消息的扩展字段
  240. @discussion
  241. @param viewController 当前消息视图
  242. @param easeEmotion
  243. @result
  244. */
  245. - (NSDictionary*)emotionExtFormessageViewController:(EaseMessageViewController *)viewController
  246. easeEmotion:(EaseEmotion*)easeEmotion;
  247. /*!
  248. @method
  249. @brief view标记已读
  250. @discussion
  251. @param viewController 当前消息视图
  252. @result
  253. */
  254. - (void)messageViewControllerMarkAllMessagesAsRead:(EaseMessageViewController *)viewController;
  255. @end
  256. @interface EaseMessageViewController : EaseRefreshTableViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate, EMChatManagerDelegate, EMCDDeviceManagerDelegate, EMChatToolbarDelegate, EaseChatBarMoreViewDelegate,EMChatroomManagerDelegate, EaseMessageCellDelegate>
  257. @property (weak, nonatomic) id<EaseMessageViewControllerDelegate> delegate;
  258. @property (weak, nonatomic) id<EaseMessageViewControllerDataSource> dataSource;
  259. /*!
  260. @property
  261. @brief 聊天的会话对象
  262. */
  263. @property (strong, nonatomic) EMConversation *conversation;
  264. /*!
  265. @property
  266. @brief 时间间隔标记
  267. */
  268. @property (nonatomic) NSTimeInterval messageTimeIntervalTag;
  269. /*!
  270. @property
  271. @brief 如果conversation中没有任何消息,退出该页面时是否删除该conversation
  272. */
  273. @property (nonatomic) BOOL deleteConversationIfNull; //default YES;
  274. /*!
  275. @property
  276. @brief 当前页面显示时,是否滚动到最后一条
  277. */
  278. @property (nonatomic) BOOL scrollToBottomWhenAppear; //default YES;
  279. /*!
  280. @property
  281. @brief 页面是否处于显示状态
  282. */
  283. @property (nonatomic) BOOL isViewDidAppear;
  284. /*!
  285. @property
  286. @brief 加载的每页message的条数
  287. */
  288. @property (nonatomic) NSInteger messageCountOfPage; //default 50
  289. /*!
  290. @property
  291. @brief 时间分割cell的高度
  292. */
  293. @property (nonatomic) CGFloat timeCellHeight;
  294. /*!
  295. @property
  296. @brief 显示的EMMessage类型的消息列表
  297. */
  298. @property (strong, nonatomic) NSMutableArray *messsagesSource;
  299. /*!
  300. @property
  301. @brief 底部输入控件
  302. */
  303. @property (strong, nonatomic) UIView *chatToolbar;
  304. /*!
  305. @property
  306. @brief 底部功能控件
  307. */
  308. @property(strong, nonatomic) EaseChatBarMoreView *chatBarMoreView;
  309. /*!
  310. @property
  311. @brief 底部表情控件
  312. */
  313. @property(strong, nonatomic) EaseFaceView *faceView;
  314. /*!
  315. @property
  316. @brief 底部录音控件
  317. */
  318. @property(strong, nonatomic) EaseRecordView *recordView;
  319. /*!
  320. @property
  321. @brief 菜单(消息复制,删除)
  322. */
  323. @property (strong, nonatomic) UIMenuController *menuController;
  324. /*!
  325. @property
  326. @brief 选中消息菜单索引
  327. */
  328. @property (strong, nonatomic) NSIndexPath *menuIndexPath;
  329. /*!
  330. @property
  331. @brief 图片选择器
  332. */
  333. @property (strong, nonatomic) UIImagePickerController *imagePicker;
  334. /*!
  335. @property
  336. @brief 是否已经加入聊天室
  337. */
  338. @property (nonatomic) BOOL isJoinedChatroom;
  339. /*!
  340. @method
  341. @brief 初始化聊天页面
  342. @discussion
  343. @param conversationChatter 会话对方的用户名. 如果是群聊, 则是群组的id
  344. @param conversationType 会话类型
  345. @result
  346. */
  347. - (instancetype)initWithConversationChatter:(NSString *)conversationChatter
  348. conversationType:(EMConversationType)conversationType;
  349. /*!
  350. @method
  351. @brief 下拉加载更多
  352. @discussion
  353. @result
  354. */
  355. - (void)tableViewDidTriggerHeaderRefresh;
  356. /*!
  357. @method
  358. @brief 发送文本消息
  359. @discussion
  360. @param text 文本消息
  361. @result
  362. */
  363. - (void)sendTextMessage:(NSString *)text;
  364. /*!
  365. @method
  366. @brief 发送文本消息
  367. @discussion
  368. @param text 文本消息
  369. @param ext 扩展信息
  370. @result
  371. */
  372. - (void)sendTextMessage:(NSString *)text withExt:(NSDictionary*)ext;
  373. /*!
  374. @method
  375. @brief 发送图片消息
  376. @discussion
  377. @param image 发送图片
  378. @result
  379. */
  380. - (void)sendImageMessage:(UIImage *)image;
  381. /*!
  382. @method
  383. @brief 发送位置消息
  384. @discussion
  385. @param latitude 经度
  386. @param longitude 纬度
  387. @param address 地址
  388. @result
  389. */
  390. - (void)sendLocationMessageLatitude:(double)latitude
  391. longitude:(double)longitude
  392. andAddress:(NSString *)address;
  393. /*!
  394. @method
  395. @brief 发送语音消息
  396. @discussion
  397. @param localPath 语音本地地址
  398. @param duration 时长
  399. @result
  400. */
  401. - (void)sendVoiceMessageWithLocalPath:(NSString *)localPath
  402. duration:(NSInteger)duration;
  403. /*!
  404. @method
  405. @brief 发送视频消息
  406. @discussion
  407. @param url 视频url
  408. @result
  409. */
  410. - (void)sendVideoMessageWithURL:(NSURL *)url;
  411. /*!
  412. @method
  413. @brief 发送视频消息
  414. @discussion
  415. @param url 视频url
  416. @result
  417. */
  418. - (void)sendFileMessageWith:(EMMessage *)message;
  419. /*!
  420. @method
  421. @brief 添加消息
  422. @discussion
  423. @param message 聊天消息类
  424. @param progress 聊天消息发送接收进度条
  425. @result
  426. */
  427. - (void)addMessageToDataSource:(EMMessage *)message
  428. progress:(id)progress;
  429. /*!
  430. @method
  431. @brief 显示消息长按菜单
  432. @discussion
  433. @param showInView 菜单的父视图
  434. @param showInView 索引
  435. @param messageType 消息类型
  436. @result
  437. */
  438. - (void)showMenuViewController:(UIView *)showInView
  439. andIndexPath:(NSIndexPath *)indexPath
  440. messageType:(EMMessageBodyType)messageType;
  441. /*!
  442. @method
  443. @brief 判断消息是否要发送已读回执
  444. @discussion
  445. @param message 聊天消息
  446. @param read 是否附件消息已读
  447. @result
  448. */
  449. - (BOOL)shouldSendHasReadAckForMessage:(EMMessage *)message
  450. read:(BOOL)read;
  451. @end