JMSGMessage.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  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. *
  157. * @discussion 快捷方法,不需要先创建消息而直接发送。
  158. */
  159. + (void)sendSingleTextMessage:(NSString *)text
  160. toUser:(NSString *)username
  161. appKey:(NSString *)userAppKey;
  162. /*!
  163. * @abstract 发送单聊图片消息
  164. *
  165. * @param imageData 图片数据
  166. * @param username 单聊对象 username
  167. *
  168. * @discussion 快捷方法,不需要先创建消息而直接发送。
  169. */
  170. + (void)sendSingleImageMessage:(NSData *)imageData
  171. toUser:(NSString *)username;
  172. /*!
  173. * @abstract 发送跨应用单聊图片消息
  174. *
  175. * @param imageData 图片数据
  176. * @param username 单聊对象 username
  177. *
  178. * @discussion 快捷方法,不需要先创建消息而直接发送。
  179. */
  180. + (void)sendSingleImageMessage:(NSData *)imageData
  181. toUser:(NSString *)username
  182. appKey:(NSString *)userAppKey;
  183. /*!
  184. * @abstract 发送单聊语音消息
  185. *
  186. * @param voiceData 语音数据
  187. * @param duration 语音时长
  188. * @param username 单聊对象 username
  189. *
  190. * @discussion 快捷方法,不需要先创建消息而直接发送。
  191. */
  192. + (void)sendSingleVoiceMessage:(NSData *)voiceData
  193. voiceDuration:(NSNumber *)duration
  194. toUser:(NSString *)username;
  195. /*!
  196. * @abstract 发送跨应用单聊语音消息
  197. *
  198. * @param voiceData 语音数据
  199. * @param duration 语音时长
  200. * @param username 单聊对象 username
  201. *
  202. * @discussion 快捷方法,不需要先创建消息而直接发送。
  203. */
  204. + (void)sendSingleVoiceMessage:(NSData *)voiceData
  205. voiceDuration:(NSNumber *)duration
  206. toUser:(NSString *)username
  207. appKey:(NSString *)userAppKey;
  208. /*!
  209. * @abstract 发送单聊文件消息
  210. *
  211. * @param fileData 文件数据数据
  212. * @param fileName 文件名
  213. * @param username 单聊对象 username
  214. *
  215. * @discussion 快捷方法,不需要先创建消息而直接发送。
  216. */
  217. + (void)sendSingleFileMessage:(NSData *)fileData
  218. fileName:(NSString *)fileName
  219. toUser:(NSString *)username;
  220. /*!
  221. * @abstract 发送跨应用单聊文件消息
  222. *
  223. * @param fileData 文件数据数据
  224. * @param fileName 文件名
  225. * @param username 单聊对象 username
  226. *
  227. * @discussion 快捷方法,不需要先创建消息而直接发送。
  228. */
  229. + (void)sendSingleFileMessage:(NSData *)fileData
  230. fileName:(NSString *)fileName
  231. toUser:(NSString *)username
  232. appKey:(NSString *)userAppKey;
  233. /*!
  234. * @abstract 发送单聊地理位置消息
  235. * @param latitude 纬度
  236. * @param longitude 经度
  237. * @param scale 缩放比例
  238. * @param address 详细地址
  239. * @param username 单聊对象
  240. * @discussion 快捷方法,不需要先创建消息而直接发送。
  241. */
  242. + (void)sendSingleLocationMessage:(NSNumber *)latitude
  243. longitude:(NSNumber *)longitude
  244. scale:(NSNumber *)scale
  245. address:(NSString *)address
  246. toUser:(NSString *)username;
  247. /*!
  248. * @abstract 发送跨应用单聊地理位置消息
  249. * @param latitude 纬度
  250. * @param longitude 经度
  251. * @param scale 缩放比例
  252. * @param address 详细地址
  253. * @param username 单聊对象
  254. * @param userAppKey 单聊对象的appKey
  255. * @discussion 快捷方法,不需要先创建消息而直接发送。
  256. */
  257. + (void)sendSingleLocationMessage:(NSNumber *)latitude
  258. longitude:(NSNumber *)longitude
  259. scale:(NSNumber *)scale
  260. address:(NSString *)address
  261. toUser:(NSString *)username
  262. appKey:(NSString *)userAppKey;
  263. /*!
  264. * @abstract 发送群聊文本消息
  265. *
  266. * @param text 文本内容
  267. * @param groupId 群聊目标群组ID
  268. *
  269. * @discussion 快捷方法,不需要先创建消息而直接发送。
  270. */
  271. + (void)sendGroupTextMessage:(NSString *)text
  272. toGroup:(NSString *)groupId;
  273. /*!
  274. * @abstract 发送群聊图片消息
  275. *
  276. * @param imageData 图片数据
  277. * @param groupId 群聊目标群组ID
  278. *
  279. * @discussion 快捷方法,不需要先创建消息而直接发送。
  280. */
  281. + (void)sendGroupImageMessage:(NSData *)imageData
  282. toGroup:(NSString *)groupId;
  283. /*!
  284. * @abstract 发送群聊语音消息
  285. *
  286. * @param voiceData 语音数据
  287. * @param duration 语音时长
  288. * @param groupId 群聊目标群组ID
  289. *
  290. * @discussion 快捷方法,不需要先创建消息而直接发送。
  291. */
  292. + (void)sendGroupVoiceMessage:(NSData *)voiceData
  293. voiceDuration:(NSNumber *)duration
  294. toGroup:(NSString *)groupId;
  295. /*!
  296. * @abstract 发送群聊文件消息
  297. *
  298. * @param fileData 文件数据
  299. * @param fileName 文件名
  300. * @param groupId 群聊目标群组ID
  301. *
  302. * @discussion 快捷方法,不需要先创建消息而直接发送。
  303. */
  304. + (void)sendGroupFileMessage:(NSData *)fileData
  305. fileName:(NSString *)fileName
  306. toGroup:(NSString *)groupId;
  307. /*!
  308. * @abstract 发送群聊地理位置消息
  309. * @param latitude 纬度
  310. * @param longitude 经度
  311. * @param scale 缩放比例
  312. * @param address 详细地址
  313. * @param groupId 群聊目标群组ID
  314. */
  315. + (void)sendGroupLocationMessage:(NSNumber *)latitude
  316. longitude:(NSNumber *)longitude
  317. scale:(NSNumber *)scale
  318. address:(NSString *)address
  319. toGroup:(NSString *)groupId;
  320. /*!
  321. * @abstract 消息撤回
  322. *
  323. * @param message 需要撤回的消息
  324. * @param handler 结果回调
  325. *
  326. * - resultObject 撤回后的消息
  327. * - error 错误信息
  328. *
  329. * @discussion 注意:SDK可撤回3分钟内的消息
  330. */
  331. + (void)retractMessage:(JMSGMessage *)message completionHandler:(JMSGCompletionHandler)handler;
  332. /*!
  333. * @abstract 消息转发
  334. *
  335. * @param message 需要转发的消息
  336. * @param target 目标 target,只能为 JMSGUser 或 JMSGGroup
  337. * @param optionalContent 可选功能,具体请查看 JMSGOptionalContent 类
  338. *
  339. * @discussion 注意:只能转发消息状态为 SendSucceed 和 ReceiveSucceed 的消息。
  340. */
  341. + (void)forwardMessage:(JMSGMessage *)message
  342. target:(id)target
  343. optionalContent:(JMSGOptionalContent *JMSG_NULLABLE)optionalContent;
  344. ///----------------------------------------------------
  345. /// @name Message basic fields 消息基本属性
  346. ///----------------------------------------------------
  347. /*!
  348. * 消息ID:这个ID是本地存数据库生成的ID,不是服务器端下发时的ID。
  349. */
  350. @property(nonatomic, strong, readonly) NSString *msgId;
  351. /*!
  352. * @abstract 服务器端下发的消息ID.
  353. * @discussion 一般用于与服务器端跟踪消息.
  354. */
  355. @property(nonatomic, strong, readonly) NSString * JMSG_NULLABLE serverMessageId;
  356. /*!
  357. * @abstract 消息发送目标
  358. *
  359. * @discussion 与 [fromUser] 属性相对应. 根据消息方向不同:
  360. *
  361. * - 收到的消息,target 就是我自己。
  362. * - 发送的消息,target 是我的聊天对象。
  363. * 单聊是对方用户;
  364. * 群聊是聊天群组, 也与当前会话的目标一致 [JMSGConversation target]
  365. */
  366. @property(nonatomic, strong, readonly) id target;
  367. /*!
  368. * @abstract 消息发送目标应用
  369. *
  370. * @discussion 这是为了支持跨应用聊天, 而新增的字段.
  371. *
  372. * 单聊时目标是 username. 当该用户为默认 appKey 时, 则不填此字段.
  373. * 群聊时目标是 groupId, 不填写此字段.
  374. *
  375. * @since 2.1.0
  376. */
  377. @property(nonatomic, strong, readonly) NSString *targetAppKey;
  378. /*!
  379. * @abstract 消息来源用户 Appkey
  380. *
  381. * @discussion 这是为了支持跨应用聊天, 而新增的字段.
  382. *
  383. * 不管群聊还是单聊, from_id 都是发送消息的 username. 当该用户是默认 appKey 时, 则不填写此字段.
  384. *
  385. * @since 2.1.0
  386. */
  387. @property(nonatomic, strong, readonly) NSString *fromAppKey;
  388. /*!
  389. * @abstract 消息来源用户
  390. *
  391. * @discussion 与 [target] 属性相对应. 根据消息方向不同:
  392. *
  393. * - 收到的消息, fromUser 是发出消息的对方.
  394. * 单聊是聊天对象, 也与当前会话目标用户一致 [JMSGConversation target],
  395. * 群聊是该条消息的发送用户.
  396. * - 发出的消息: fromUser 是我自己.
  397. */
  398. @property(nonatomic, strong, readonly) JMSGUser *fromUser;
  399. /*!
  400. * @abstract 消息来源类型
  401. * @discussion 默认的用户之间互发消息,其值是 "user"。如果是 App 管理员下发的消息,是 "admin"
  402. */
  403. @property(nonatomic, strong, readonly) NSString *fromType;
  404. /*!
  405. * @abstract 消息的内容类型
  406. */
  407. @property(nonatomic, assign, readonly) JMSGContentType contentType;
  408. /*!
  409. * @abstract 消息内容对象
  410. * @discussion 使用时应通过 contentType 先获取到具体的消息类型,然后转型到相应的具体类。
  411. */
  412. @property(nonatomic, strong, readonly) JMSGAbstractContent * JMSG_NULLABLE content;
  413. /*!
  414. * @abstract 消息发出的时间戳
  415. * @discussion 这是服务器端下发消息时的真实时间戳,单位为毫秒
  416. */
  417. @property(nonatomic, strong, readonly) NSNumber *timestamp;
  418. /*!
  419. * @abstract 消息中的fromName
  420. * @discussion 消息的发送方展示名称
  421. */
  422. @property(nonatomic, strong, readonly) NSString *fromName;
  423. ///----------------------------------------------------
  424. /// @name Message addOn fields 消息附加属性
  425. ///----------------------------------------------------
  426. /*!
  427. * @abstract 聊天类型。当前支持的类型:单聊,群聊
  428. */
  429. @property(nonatomic, assign, readonly) JMSGConversationType targetType;
  430. /*!
  431. * @abstract 消息状态
  432. * @discussion 一条发出的消息,或者收到的消息,有多个状态会下。具体定义参考 JMSGMessageStatus 的定义。
  433. */
  434. @property(nonatomic, assign, readonly) JMSGMessageStatus status;
  435. /*!
  436. * @abstract 当前的消息是不是收到的。
  437. *
  438. * @discussion 是收到的,则是别人发给我的。UI 上一般展示在左侧。
  439. * 如果不是收到侧的,则是发送侧的,是我对外发送的。
  440. *
  441. * 主要是在聊天界面展示消息列表时,需要使用此方法,来确认展示消息的方式与位置。
  442. * 展示时需要发送方消息,不管是收到侧还是发送侧,都可以使用 fromUser 对象。
  443. */
  444. @property(nonatomic, assign, readonly) BOOL isReceived;
  445. /*!
  446. * @abstract 消息标志
  447. *
  448. * @discussion 这是一个用于表示消息状态的标识字段, App 可自由使用, SDK 不做变更.
  449. * 默认值为 0, App 有需要时可更新此状态.
  450. *
  451. * 使用场景:
  452. *
  453. * 1. 语音消息有一个未听标志. 默认 0 表示未读, 已读时 App 更新为 1 或者其他.
  454. * 2. 某些 App 需要对一条消息做送达, 已读标志, 可借用这个字段.
  455. */
  456. @property(nonatomic, strong, readonly) NSNumber *flag;
  457. /*!
  458. * @abstract 是否已读(只针对接收的消息)
  459. *
  460. * @discussion 该属性与实例方法 [-(void)setMessageHaveRead:] 是对应的。
  461. *
  462. * 注意:只有发送方调用 [+sendMessage:optionalContent:] 方法设置 message 需要已读回执,此属性才有意义。
  463. */
  464. @property(nonatomic, assign, readonly) BOOL isHaveRead;
  465. ///----------------------------------------------------
  466. /// @name Instance APIs 实例方法
  467. ///----------------------------------------------------
  468. /*!
  469. * @abstract 默认的 init 方法不可用
  470. *
  471. * @discussion 如果已经得到 JMSGConversation 实例, 则可用以下方法来创建对象:
  472. *
  473. * - conversation -> createMessageWithContent:
  474. * - conversation -> createMessageAsyncWithImageContent::
  475. *
  476. * 或者不创建 JMSGMessage 实例也可以直接发送消息. 请参考 JMSGConversation 里相关方法.
  477. *
  478. * 如果你的 App 不依赖 JMSGConversation 实例, 也可以直接调用 JMSGMessage 里的类方法
  479. * 来创建 JMSGMessage 实例:
  480. *
  481. * - JMSGMessage -> createSingleMessageWithContent:
  482. * - JMSGMessage -> createGroupMessageWithContent:
  483. *
  484. * 或者直接也可以调用 JMSGMessage 类方法发消息而不必创建 JMSGMessage 对象.
  485. */
  486. - (instancetype)init NS_UNAVAILABLE;
  487. /*!
  488. * @abstract 是否是@自己的消息(只针对群消息,单聊消息无@功能)
  489. */
  490. - (BOOL)isAtMe;
  491. /*!
  492. * @abstract 是否是@所有人的消息(只针对群消息,单聊消息无@功能)
  493. */
  494. - (BOOL)isAtAll;
  495. /*!
  496. * @abstract 获取消息体中所有@对象(只针对群消息,单聊消息无@功能)
  497. *
  498. * @param handler 结果回调。回调参数:
  499. *
  500. * - resultObject 类型为 NSArray,数组里成员的类型为 JMSGUser
  501. * 注意:如果该消息为@所有人消息时,resultObject 返回nil,可以通过 isAtAll 接口来判断是否是@所有人的消息
  502. * - error 错误信息
  503. *
  504. * 如果 error 为 nil, 表示获取成功
  505. * 如果 error 不为 nil,表示获取失败
  506. *
  507. * @discussion 从服务器获取,返回消息的所有@对象。
  508. */
  509. - (void)getAt_List:(JMSGCompletionHandler)handler;
  510. /*!
  511. * @abstract 设置为已读
  512. *
  513. * @param handler 回调
  514. *
  515. * - resultObject 返回对应的 message,不过成功失败都会返回 message 对象
  516. * - error 不为 nil 表示操作失败
  517. *
  518. * @discussion 注意: 只针对消息接收方有效
  519. *
  520. * 这是一个异步接口;
  521. *
  522. * 1、接收方:设置消息为已读状态后,isHaveRead 属性也会被设置为 YES,
  523. *
  524. * 2、发送方:会收到消息已读状态变更事件,SDK 会更新消息的未读人数。
  525. *
  526. * 注意:只有发送方调用 [+sendMessage:optionalContent:] 方法设置 message 需要已读回执,此方法才有效。
  527. */
  528. - (void)setMessageHaveRead:(JMSGCompletionHandler)handler;
  529. /*!
  530. * @abstract 消息未读人数
  531. *
  532. * @discussion 只针对消息发送方有效
  533. *
  534. * 注意:只有发送方调用 [+sendMessage:optionalContent:] 方法设置 message 需要已读回执,此方法才有意义。
  535. */
  536. - (NSInteger)getMessageUnreadCount;
  537. /*!
  538. * @abstract 已读未读用户列表
  539. *
  540. * @param handler 结果回调。回调参数:
  541. *
  542. * - unreadUsers 未读用户列表
  543. * - readsUsers 读用户列表
  544. * - error 不为nil表示出错
  545. *
  546. * @discussion 只针对消息发送方有效
  547. *
  548. * 注意:只有发送方调用 [+sendMessage:optionalContent:] 方法设置 message 需要已读回执,此方法才有意义。
  549. */
  550. - (void)messageReadDetailHandler:(void(^)(NSArray *JMSG_NULLABLE readUsers, NSArray *JMSG_NULLABLE unreadUsers, NSError *JMSG_NULLABLE error))handler;
  551. /*!
  552. * @abstract 设置消息的 fromName(即:通知栏的展示名称)
  553. *
  554. * @param fromName 本条消息在接收方通知栏的展示名称
  555. *
  556. * @discussion fromName填充在发出的消息体里,对方收到该消息通知时,在通知栏显示的消息发送人名称就是该字段的值.
  557. *
  558. */
  559. - (void)setFromName:(NSString * JMSG_NULLABLE)fromName;
  560. /*!
  561. * @abstract 更新 message 中的extra
  562. *
  563. * @param value 待更新的value,不能为null,类型只能为 NSNumber 和 NSString
  564. * @param key 待更新value对应的key,不能为null
  565. *
  566. * @discussion 如果 message 中没有该 key 对应的 extra 值,则会插入该新值
  567. */
  568. - (BOOL)updateMessageExtraValue:(id)value forKey:(NSString *)key;
  569. /*!
  570. * @abstract 更新消息标志
  571. *
  572. * @param flag 为 nil 时表示设置为 0.
  573. *
  574. * @discussion 参考 flag property 的说明.
  575. */
  576. - (void)updateFlag:(NSNumber * JMSG_NULLABLE)flag;
  577. /*!
  578. * @abstract 消息对象转换为 JSON 字符串的表示。
  579. *
  580. * @discussion 遵循 Message JSON 协议的定义。
  581. */
  582. - (NSString *)toJsonString;
  583. /*!
  584. * @abstract 对象比较
  585. *
  586. * @param message 待比较的消息对象
  587. */
  588. - (BOOL)isEqualToMessage:(JMSGMessage * JMSG_NULLABLE)message;
  589. JMSG_ASSUME_NONNULL_END
  590. @end