JMSGMessage.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. /*
  2. * | | | | \ \ / / | | | | / _______|
  3. * | |____| | \ \/ / | |____| | / /
  4. * | |____| | \ / | |____| | | | _____
  5. * | | | | / \ | | | | | | |____ |
  6. * | | | | / /\ \ | | | | \ \______| |
  7. * | | | | /_/ \_\ | | | | \_________|
  8. *
  9. * Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved.
  10. */
  11. #import <Foundation/Foundation.h>
  12. #import <UIKit/UIKit.h>
  13. #import <JMessage/JMSGConstants.h>
  14. #import <JMessage/JMSGConversation.h>
  15. @class JMSGAbstractContent;
  16. @class JMSGUser;
  17. @protocol JMSGTargetProtocol;
  18. @class JMSGOptionalContent;
  19. /*!
  20. * 消息
  21. *
  22. * 本类 JMSGMessage 是 JMessage SDK 里的消息实体。
  23. * 收到的消息、发送的消息、获取历史消息,其中的消息类,都是这个 JMSGMessage。
  24. *
  25. * 以下分别描述消息相关主要使用场景。
  26. *
  27. * #### 获取历史消息
  28. *
  29. * 先基于聊天对象ID与会话类型,拿到会话对象,然后调用会话对象里的 [JMSGConversation allMessages:] 获取到某会话的全部历史消息列表。
  30. *
  31. * #### 展示一条消息
  32. *
  33. * 发送者、接收者等基本属性都有相应的属性。消息内容则在一个 content 对象里,访问时先通过 contentType 拿到内容类型,
  34. * 然后把 content 转型为相应的具体内容类型,再进一步可拿到具体的信息。
  35. *
  36. * ```
  37. * JMSGTextContent *textContent = (JMSGTextContent *)message.content;
  38. * NSString *msgText = textContent.text;
  39. * ```
  40. *
  41. * #### 接收消息
  42. *
  43. * 参考 JMessageDelegate 里的说明.
  44. *
  45. * #### 发送消息
  46. *
  47. * 参考 JMessageDelegate 里的说明.
  48. *
  49. */
  50. @interface JMSGMessage : NSObject <NSCopying>
  51. JMSG_ASSUME_NONNULL_BEGIN
  52. ///----------------------------------------------------
  53. /// @name Class APIs 类方法 - 创建与发送消息
  54. ///----------------------------------------------------
  55. /*!
  56. * @abstract 创建单聊消息(快捷接口)
  57. *
  58. * @param content 消息内容对象
  59. * @param username 单聊用户 username
  60. *
  61. * #### 注意:
  62. *
  63. * 1、单独调用此接口创建消息,SDK 不会本地保存消息,再调用发送接口时才会保存;
  64. *
  65. * 2、如果上层希望创建消息时就本地化保存,请使用 [JMSGConversation createMessageWithContent:]
  66. */
  67. + (JMSGMessage *)createSingleMessageWithContent:(JMSGAbstractContent *)content
  68. username:(NSString *)username;
  69. /*!
  70. * @abstract 创建群聊消息
  71. *
  72. * @param content 消息内容对象
  73. * @param groupId 群聊ID
  74. *
  75. * #### 注意:
  76. *
  77. * 1、单独调用此接口创建消息,SDK 不会本地保存消息,再调用发送接口时才会保存;
  78. *
  79. * 2、如果上层希望创建消息时就本地化保存,请使用 [JMSGConversation createMessageWithContent:]
  80. */
  81. + (JMSGMessage *)createGroupMessageWithContent:(JMSGAbstractContent *)content
  82. groupId:(NSString *)groupId;
  83. /*!
  84. * @abstract 创建聊天室消息
  85. *
  86. * @param content 消息内容对象
  87. * @param roomId 聊天室ID
  88. *
  89. * @discussion 不关心会话时的直接创建聊天消息的接口。一般建议使用 JMSGConversation -> createMessageWithContent:
  90. */
  91. + (JMSGMessage *)createChatRoomMessageWithContent:(JMSGAbstractContent *)content
  92. chatRoomId:(NSString *)roomId;
  93. /*!
  94. * @abstract 创建@人的群聊消息
  95. *
  96. * @param content 消息内容对象
  97. * @param groupId 群聊ID
  98. * @param at_list @对象的数组
  99. *
  100. * #### 注意:
  101. *
  102. * 1、单独调用此接口创建消息,SDK 不会本地保存消息,再调用发送接口时才会保存;
  103. *
  104. * 2、如果上层希望创建消息时就本地化保存,请使用 [JMSGConversation createMessageWithContent:]
  105. */
  106. + (JMSGMessage *)createGroupMessageWithContent:(JMSGAbstractContent *)content
  107. groupId:(NSString *)groupId
  108. at_list:(NSArray<__kindof JMSGUser *> *)at_list;
  109. /*!
  110. * @abstract 创建@所有人的群聊消息
  111. *
  112. * @param content 消息内容对象
  113. * @param groupId 群聊ID
  114. *
  115. * #### 注意:
  116. *
  117. * 1、单独调用此接口创建消息,SDK 不会本地保存消息,再调用发送接口时才会保存;
  118. *
  119. * 2、如果上层希望创建消息时就本地化保存,请使用 [JMSGConversation createMessageWithContent:]
  120. */
  121. + (JMSGMessage *)createGroupAtAllMessageWithContent:(JMSGAbstractContent *)content
  122. groupId:(NSString *)groupId;
  123. /*!
  124. * @abstract 发送消息(已经创建好的)
  125. *
  126. * @param message 消息对象。
  127. *
  128. * @discussion 此接口与 createMessage:: 相关接口配合使用,创建好后使用此接口发送。
  129. */
  130. + (void)sendMessage:(JMSGMessage *)message;
  131. /*!
  132. * @abstract 发送消息(附带可选功能,如:控制离线消息存储、自定义通知栏内容、消息已读回执等)
  133. *
  134. * @param message 通过消息创建类接口,创建好的消息对象
  135. * @param optionalContent 可选功能,具体请查看 JMSGOptionalContent 类
  136. *
  137. * @discussion 可选功能里可以设置离线消息存储、自定义通知栏内容、消息已读回执等,具体请查看 JMSGOptionalContent 类。
  138. *
  139. */
  140. + (void)sendMessage:(JMSGMessage *)message optionalContent:(JMSGOptionalContent *)optionalContent;
  141. /*!
  142. * @abstract 发送单聊文本消息
  143. *
  144. * @param text 文本内容
  145. * @param username 单聊对象 username
  146. *
  147. * @discussion 快捷方法,不需要先创建消息而直接发送。
  148. */
  149. + (void)sendSingleTextMessage:(NSString *)text
  150. toUser:(NSString *)username;
  151. /*!
  152. * @abstract 发送跨应用单聊文本消息
  153. *
  154. * @param text 文本内容
  155. * @param username 单聊对象 username
  156. * @param userAppKey 单聊对象 appkey
  157. *
  158. * @discussion 快捷方法,不需要先创建消息而直接发送。
  159. */
  160. + (void)sendSingleTextMessage:(NSString *)text
  161. toUser:(NSString *)username
  162. appKey:(NSString *)userAppKey;
  163. /*!
  164. * @abstract 发送单聊图片消息
  165. *
  166. * @param imageData 图片数据
  167. * @param username 单聊对象 username
  168. *
  169. * @discussion 快捷方法,不需要先创建消息而直接发送。
  170. */
  171. + (void)sendSingleImageMessage:(NSData *)imageData
  172. toUser:(NSString *)username;
  173. /*!
  174. * @abstract 发送跨应用单聊图片消息
  175. *
  176. * @param imageData 图片数据
  177. * @param username 单聊对象 username
  178. * @param userAppKey 单聊对象 appkey
  179. *
  180. * @discussion 快捷方法,不需要先创建消息而直接发送。
  181. */
  182. + (void)sendSingleImageMessage:(NSData *)imageData
  183. toUser:(NSString *)username
  184. appKey:(NSString *)userAppKey;
  185. /*!
  186. * @abstract 发送单聊语音消息
  187. *
  188. * @param voiceData 语音数据
  189. * @param duration 语音时长
  190. * @param username 单聊对象 username
  191. *
  192. * @discussion 快捷方法,不需要先创建消息而直接发送。
  193. */
  194. + (void)sendSingleVoiceMessage:(NSData *)voiceData
  195. voiceDuration:(NSNumber *)duration
  196. toUser:(NSString *)username;
  197. /*!
  198. * @abstract 发送跨应用单聊语音消息
  199. *
  200. * @param voiceData 语音数据
  201. * @param duration 语音时长
  202. * @param username 单聊对象 username
  203. * @param userAppKey 单聊对象 appkey
  204. *
  205. * @discussion 快捷方法,不需要先创建消息而直接发送。
  206. */
  207. + (void)sendSingleVoiceMessage:(NSData *)voiceData
  208. voiceDuration:(NSNumber *)duration
  209. toUser:(NSString *)username
  210. appKey:(NSString *)userAppKey;
  211. /*!
  212. * @abstract 发送单聊文件消息
  213. *
  214. * @param fileData 文件数据数据
  215. * @param fileName 文件名
  216. * @param username 单聊对象 username
  217. *
  218. * @discussion 快捷方法,不需要先创建消息而直接发送。
  219. */
  220. + (void)sendSingleFileMessage:(NSData *)fileData
  221. fileName:(NSString *)fileName
  222. toUser:(NSString *)username;
  223. /*!
  224. * @abstract 发送跨应用单聊文件消息
  225. *
  226. * @param fileData 文件数据数据
  227. * @param fileName 文件名
  228. * @param username 单聊对象 username
  229. * @param userAppKey 单聊对象 appkey
  230. *
  231. * @discussion 快捷方法,不需要先创建消息而直接发送。
  232. */
  233. + (void)sendSingleFileMessage:(NSData *)fileData
  234. fileName:(NSString *)fileName
  235. toUser:(NSString *)username
  236. appKey:(NSString *)userAppKey;
  237. /*!
  238. * @abstract 发送单聊地理位置消息
  239. * @param latitude 纬度
  240. * @param longitude 经度
  241. * @param scale 缩放比例
  242. * @param address 详细地址
  243. * @param username 单聊对象
  244. * @discussion 快捷方法,不需要先创建消息而直接发送。
  245. */
  246. + (void)sendSingleLocationMessage:(NSNumber *)latitude
  247. longitude:(NSNumber *)longitude
  248. scale:(NSNumber *)scale
  249. address:(NSString *)address
  250. toUser:(NSString *)username;
  251. /*!
  252. * @abstract 发送跨应用单聊地理位置消息
  253. * @param latitude 纬度
  254. * @param longitude 经度
  255. * @param scale 缩放比例
  256. * @param address 详细地址
  257. * @param username 单聊对象
  258. * @param userAppKey 单聊对象的appKey
  259. * @discussion 快捷方法,不需要先创建消息而直接发送。
  260. */
  261. + (void)sendSingleLocationMessage:(NSNumber *)latitude
  262. longitude:(NSNumber *)longitude
  263. scale:(NSNumber *)scale
  264. address:(NSString *)address
  265. toUser:(NSString *)username
  266. appKey:(NSString *)userAppKey;
  267. /*!
  268. * @abstract 发送群聊文本消息
  269. *
  270. * @param text 文本内容
  271. * @param groupId 群聊目标群组ID
  272. *
  273. * @discussion 快捷方法,不需要先创建消息而直接发送。
  274. */
  275. + (void)sendGroupTextMessage:(NSString *)text
  276. toGroup:(NSString *)groupId;
  277. /*!
  278. * @abstract 发送群聊图片消息
  279. *
  280. * @param imageData 图片数据
  281. * @param groupId 群聊目标群组ID
  282. *
  283. * @discussion 快捷方法,不需要先创建消息而直接发送。
  284. */
  285. + (void)sendGroupImageMessage:(NSData *)imageData
  286. toGroup:(NSString *)groupId;
  287. /*!
  288. * @abstract 发送群聊语音消息
  289. *
  290. * @param voiceData 语音数据
  291. * @param duration 语音时长
  292. * @param groupId 群聊目标群组ID
  293. *
  294. * @discussion 快捷方法,不需要先创建消息而直接发送。
  295. */
  296. + (void)sendGroupVoiceMessage:(NSData *)voiceData
  297. voiceDuration:(NSNumber *)duration
  298. toGroup:(NSString *)groupId;
  299. /*!
  300. * @abstract 发送群聊文件消息
  301. *
  302. * @param fileData 文件数据
  303. * @param fileName 文件名
  304. * @param groupId 群聊目标群组ID
  305. *
  306. * @discussion 快捷方法,不需要先创建消息而直接发送。
  307. */
  308. + (void)sendGroupFileMessage:(NSData *)fileData
  309. fileName:(NSString *)fileName
  310. toGroup:(NSString *)groupId;
  311. /*!
  312. * @abstract 发送群聊地理位置消息
  313. * @param latitude 纬度
  314. * @param longitude 经度
  315. * @param scale 缩放比例
  316. * @param address 详细地址
  317. * @param groupId 群聊目标群组ID
  318. */
  319. + (void)sendGroupLocationMessage:(NSNumber *)latitude
  320. longitude:(NSNumber *)longitude
  321. scale:(NSNumber *)scale
  322. address:(NSString *)address
  323. toGroup:(NSString *)groupId;
  324. /*!
  325. * @abstract 消息撤回
  326. *
  327. * @param message 需要撤回的消息
  328. * @param handler 结果回调
  329. *
  330. * - resultObject 撤回后的消息
  331. * - error 错误信息
  332. *
  333. * @discussion 注意:SDK可撤回3分钟内的消息
  334. */
  335. + (void)retractMessage:(JMSGMessage *)message completionHandler:(JMSGCompletionHandler)handler;
  336. /*!
  337. * @abstract 消息转发
  338. *
  339. * @param message 需要转发的消息
  340. * @param target 目标 target,只能为 JMSGUser 或 JMSGGroup
  341. * @param optionalContent 可选功能,具体请查看 JMSGOptionalContent 类
  342. *
  343. * @discussion 注意:只能转发消息状态为 SendSucceed 和 ReceiveSucceed 的消息。
  344. */
  345. + (void)forwardMessage:(JMSGMessage *)message
  346. target:(id)target
  347. optionalContent:(JMSGOptionalContent *JMSG_NULLABLE)optionalContent;
  348. ///----------------------------------------------------
  349. /// @name Message basic fields 消息基本属性
  350. ///----------------------------------------------------
  351. /*!
  352. * 消息ID:这个 ID 是本地生成的ID,不是服务器端下发时的ID。
  353. */
  354. @property(nonatomic, strong, readonly) NSString *msgId;
  355. /*!
  356. * @abstract 服务器端下发的消息ID.
  357. * @discussion 一般用于与服务器端跟踪消息.
  358. */
  359. @property(nonatomic, strong, readonly) NSString * JMSG_NULLABLE serverMessageId;
  360. /*!
  361. * @abstract 消息发送目标
  362. *
  363. * @discussion 与 [fromUser] 属性相对应. 根据消息方向不同:
  364. *
  365. * - 收到的消息,target 就是我自己。
  366. * - 发送的消息,target 是我的聊天对象。
  367. * 单聊是对方用户;
  368. * 群聊是聊天群组, 也与当前会话的目标一致 [JMSGConversation target]
  369. */
  370. @property(nonatomic, strong, readonly) id target;
  371. /*!
  372. * @abstract 消息发送目标应用
  373. *
  374. * @discussion 这是为了支持跨应用聊天, 而新增的字段.
  375. *
  376. * 单聊时目标是 username. 当该用户为默认 appKey 时, 则不填此字段.
  377. * 群聊时目标是 groupId, 不填写此字段.
  378. *
  379. * @since 2.1.0
  380. */
  381. @property(nonatomic, strong, readonly) NSString *targetAppKey;
  382. /*!
  383. * @abstract 消息来源用户 Appkey
  384. *
  385. * @discussion 这是为了支持跨应用聊天, 而新增的字段.
  386. *
  387. * 不管群聊还是单聊, from_id 都是发送消息的 username. 当该用户是默认 appKey 时, 则不填写此字段.
  388. *
  389. * @since 2.1.0
  390. */
  391. @property(nonatomic, strong, readonly) NSString *fromAppKey;
  392. /*!
  393. * @abstract 消息来源用户
  394. *
  395. * @discussion 与 [target] 属性相对应. 根据消息方向不同:
  396. *
  397. * - 收到的消息, fromUser 是发出消息的对方.
  398. * 单聊是聊天对象, 也与当前会话目标用户一致 [JMSGConversation target],
  399. * 群聊是该条消息的发送用户.
  400. * - 发出的消息: fromUser 是我自己.
  401. */
  402. @property(nonatomic, strong, readonly) JMSGUser *fromUser;
  403. /*!
  404. * @abstract 消息来源类型
  405. * @discussion 默认的用户之间互发消息,其值是 "user"。如果是 App 管理员下发的消息,是 "admin"
  406. */
  407. @property(nonatomic, strong, readonly) NSString *fromType;
  408. /*!
  409. * @abstract 消息的内容类型
  410. */
  411. @property(nonatomic, assign, readonly) JMSGContentType contentType;
  412. /*!
  413. * @abstract 消息内容对象
  414. * @discussion 使用时应通过 contentType 先获取到具体的消息类型,然后转型到相应的具体类。
  415. */
  416. @property(nonatomic, strong, readonly) JMSGAbstractContent * JMSG_NULLABLE content;
  417. /*!
  418. * @abstract 消息发出的时间戳
  419. * @discussion 这是服务器端下发消息时的真实时间戳,单位为毫秒
  420. */
  421. @property(nonatomic, strong, readonly) NSNumber *timestamp;
  422. /*!
  423. * @abstract 消息中的fromName
  424. * @discussion 消息的发送方展示名称
  425. */
  426. @property(nonatomic, strong, readonly) NSString *fromName;
  427. ///----------------------------------------------------
  428. /// @name Message addOn fields 消息附加属性
  429. ///----------------------------------------------------
  430. /*!
  431. * @abstract 聊天类型。当前支持的类型:单聊,群聊
  432. */
  433. @property(nonatomic, assign, readonly) JMSGConversationType targetType;
  434. /*!
  435. * @abstract 消息状态
  436. * @discussion 一条发出的消息,或者收到的消息,有多个状态会下。具体定义参考 JMSGMessageStatus 的定义。
  437. */
  438. @property(nonatomic, assign, readonly) JMSGMessageStatus status;
  439. /*!
  440. * @abstract 当前的消息是不是收到的。
  441. *
  442. * @discussion 是收到的,则是别人发给我的。UI 上一般展示在左侧。
  443. * 如果不是收到侧的,则是发送侧的,是我对外发送的。
  444. *
  445. * 主要是在聊天界面展示消息列表时,需要使用此方法,来确认展示消息的方式与位置。
  446. * 展示时需要发送方消息,不管是收到侧还是发送侧,都可以使用 fromUser 对象。
  447. */
  448. @property(nonatomic, assign, readonly) BOOL isReceived;
  449. /*!
  450. * @abstract 消息标志
  451. *
  452. * @discussion 这是一个用于表示消息状态的标识字段, App 可自由使用, SDK 不做变更.
  453. * 默认值为 0, App 有需要时可更新此状态.
  454. *
  455. * 使用场景:
  456. *
  457. * 1. 语音消息有一个未听标志. 默认 0 表示未读, 已读时 App 更新为 1 或者其他.
  458. * 2. 某些 App 需要对一条消息做送达, 已读标志, 可借用这个字段.
  459. */
  460. @property(nonatomic, strong, readonly) NSNumber *flag;
  461. /*!
  462. * @abstract 是否已读(只针对接收的消息)
  463. *
  464. * @discussion 该属性与实例方法 [-(void)setMessageHaveRead:] 是对应的。
  465. *
  466. * 注意:只有发送方调用 [+sendMessage:optionalContent:] 方法设置 message 需要已读回执,此属性才有意义。
  467. */
  468. @property(nonatomic, assign, readonly) BOOL isHaveRead;
  469. ///----------------------------------------------------
  470. /// @name Instance APIs 实例方法
  471. ///----------------------------------------------------
  472. /*!
  473. * @abstract 默认的 init 方法不可用
  474. *
  475. * @discussion 如果已经得到 JMSGConversation 实例, 则可用以下方法来创建对象:
  476. *
  477. * - conversation -> createMessageWithContent:
  478. * - conversation -> createMessageAsyncWithImageContent::
  479. *
  480. * 或者不创建 JMSGMessage 实例也可以直接发送消息. 请参考 JMSGConversation 里相关方法.
  481. *
  482. * 如果你的 App 不依赖 JMSGConversation 实例, 也可以直接调用 JMSGMessage 里的类方法
  483. * 来创建 JMSGMessage 实例:
  484. *
  485. * - JMSGMessage -> createSingleMessageWithContent:
  486. * - JMSGMessage -> createGroupMessageWithContent:
  487. *
  488. * 或者直接也可以调用 JMSGMessage 类方法发消息而不必创建 JMSGMessage 对象.
  489. */
  490. - (instancetype)init NS_UNAVAILABLE;
  491. /*!
  492. * @abstract 是否是@自己的消息(只针对群消息,单聊消息无@功能)
  493. */
  494. - (BOOL)isAtMe;
  495. /*!
  496. * @abstract 是否是@所有人的消息(只针对群消息,单聊消息无@功能)
  497. */
  498. - (BOOL)isAtAll;
  499. /*!
  500. * @abstract 获取消息体中所有@对象(只针对群消息,单聊消息无@功能)
  501. *
  502. * @param handler 结果回调。回调参数:
  503. *
  504. * - resultObject 类型为 NSArray,数组里成员的类型为 JMSGUser
  505. * 注意:如果该消息为@所有人消息时,resultObject 返回nil,可以通过 isAtAll 接口来判断是否是@所有人的消息
  506. * - error 错误信息
  507. *
  508. * 如果 error 为 nil, 表示获取成功
  509. * 如果 error 不为 nil,表示获取失败
  510. *
  511. * @discussion 从服务器获取,返回消息的所有@对象。
  512. */
  513. - (void)getAt_List:(JMSGCompletionHandler)handler;
  514. /*!
  515. * @abstract 设置为已读
  516. *
  517. * @param handler 回调
  518. *
  519. * - resultObject 返回对应的 message,不过成功失败都会返回 message 对象
  520. * - error 不为 nil 表示操作失败
  521. *
  522. * @discussion 注意: 只针对消息接收方有效
  523. *
  524. * 这是一个异步接口;
  525. *
  526. * 1、接收方:设置消息为已读状态后,isHaveRead 属性也会被设置为 YES,
  527. *
  528. * 2、发送方:会收到消息已读状态变更事件,SDK 会更新消息的未读人数。
  529. *
  530. * 注意:只有发送方调用 [+sendMessage:optionalContent:] 方法设置 message 需要已读回执,此方法才有效。
  531. */
  532. - (void)setMessageHaveRead:(JMSGCompletionHandler)handler;
  533. /*!
  534. * @abstract 消息未读人数
  535. *
  536. * @discussion 只针对消息发送方有效
  537. *
  538. * 注意:只有发送方调用 [+sendMessage:optionalContent:] 方法设置 message 需要已读回执,此方法才有意义。
  539. */
  540. - (NSInteger)getMessageUnreadCount;
  541. /*!
  542. * @abstract 已读未读用户列表
  543. *
  544. * @param handler 结果回调。回调参数:
  545. *
  546. * - unreadUsers 未读用户列表
  547. * - readsUsers 读用户列表
  548. * - error 不为nil表示出错
  549. *
  550. * @discussion 只针对消息发送方有效
  551. *
  552. * 注意:只有发送方调用 [+sendMessage:optionalContent:] 方法设置 message 需要已读回执,此方法才有意义。
  553. */
  554. - (void)messageReadDetailHandler:(void(^)(NSArray *JMSG_NULLABLE readUsers, NSArray *JMSG_NULLABLE unreadUsers, NSError *JMSG_NULLABLE error))handler;
  555. /*!
  556. * @abstract 取消正在发送的消息
  557. *
  558. * @discussion 在消息发送结果监听 [JMSGMessageDelegate onSendMessageResponse:error:] 里会返回对应的错误信息和错误码。
  559. *
  560. * @since 3.8.1
  561. */
  562. - (void)cancelSendingMessage;
  563. /*!
  564. * @abstract 设置消息的 fromName(即:通知栏的展示名称)
  565. *
  566. * @param fromName 本条消息在接收方通知栏的展示名称
  567. *
  568. * @discussion fromName填充在发出的消息体里,对方收到该消息通知时,在通知栏显示的消息发送人名称就是该字段的值.
  569. *
  570. */
  571. - (void)setFromName:(NSString * JMSG_NULLABLE)fromName;
  572. /*!
  573. * @abstract 更新 message 中的extra
  574. *
  575. * @param value 待更新的value,不能为null,类型只能为 NSNumber 和 NSString
  576. * @param key 待更新value对应的key,不能为null
  577. *
  578. * @discussion 如果 message 中没有该 key 对应的 extra 值,则会插入该新值
  579. */
  580. - (BOOL)updateMessageExtraValue:(id)value forKey:(NSString *)key;
  581. /*!
  582. * @abstract 更新消息标志
  583. *
  584. * @param flag 为 nil 时表示设置为 0.
  585. *
  586. * @discussion 参考 flag property 的说明.
  587. */
  588. - (void)updateFlag:(NSNumber * JMSG_NULLABLE)flag;
  589. /*!
  590. * @abstract 消息对象转换为 JSON 字符串的表示。
  591. *
  592. * @discussion 遵循 Message JSON 协议的定义。
  593. */
  594. - (NSString *)toJsonString;
  595. /*!
  596. * @abstract JSON 字符串 转换为 消息对象。
  597. *
  598. * @discussion 遵循 Message JSON 协议的定义。失败时返回 nil
  599. *
  600. * #### 注意:尽量不要自己随意拼接 json 字符串去转换,容易导致创建的 message 无法正常发送
  601. */
  602. + (JMSGMessage *JMSG_NULLABLE)fromJson:(NSString *JMSG_NONNULL)json;
  603. /*!
  604. * @abstract 对象比较
  605. *
  606. * @param message 待比较的消息对象
  607. */
  608. - (BOOL)isEqualToMessage:(JMSGMessage * JMSG_NULLABLE)message;
  609. JMSG_ASSUME_NONNULL_END
  610. @end