V2TIMManager+Message.h 95 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850
  1. /////////////////////////////////////////////////////////////////////
  2. //
  3. // 腾讯云通信服务 IMSDK
  4. //
  5. // 模块名称:V2TIMManager+Message
  6. //
  7. // 消息高级接口,里面包含了所有高级消息的创建、收发逻辑
  8. //
  9. /////////////////////////////////////////////////////////////////////
  10. #import "V2TIMManager.h"
  11. @class V2TIMMessage;
  12. @class V2TIMTextElem;
  13. @class V2TIMCustomElem;
  14. @class V2TIMImageElem;
  15. @class V2TIMVideoElem;
  16. @class V2TIMSoundElem;
  17. @class V2TIMFileElem;
  18. @class V2TIMFaceElem;
  19. @class V2TIMLocationElem;
  20. @class V2TIMMergerElem;
  21. @class V2TIMGroupTipsElem;
  22. @class V2TIMMessageListGetOption;
  23. @class V2TIMMessageSearchParam;
  24. @class V2TIMImage;
  25. @class V2TIMMessageReceipt;
  26. @class V2TIMOfflinePushInfo;
  27. @class V2TIMGroupChangeInfo;
  28. @class V2TIMGroupMemberChangeInfo;
  29. @class V2TIMMessageSearchResult;
  30. @class V2TIMReceiveMessageOptInfo;
  31. @class V2TIMMessageExtension;
  32. @class V2TIMMessageExtensionResult;
  33. @class V2TIMMessageReaction;
  34. @class V2TIMMessageReactionResult;
  35. @class V2TIMMessageReactionChangeInfo;
  36. V2TIM_EXPORT @protocol V2TIMAdvancedMsgListener;
  37. V2TIM_EXPORT @interface V2TIMManager (Message)
  38. /////////////////////////////////////////////////////////////////////////////////
  39. //
  40. // 异步接口的回调 BLOCK
  41. //
  42. /////////////////////////////////////////////////////////////////////////////////
  43. /// 查询历史消息的结果回调(查询接口会批量地返回从某个时间点之前的历史消息)
  44. typedef void (^V2TIMMessageListSucc)(NSArray<V2TIMMessage *> * msgs);
  45. /// 搜索历史消息的结果回调(查询接口支持模糊匹配)
  46. typedef void (^V2TIMSearchMessageListSucc)(V2TIMMessageSearchResult *searchResult);
  47. /// 文件上传进度回调,取值 0 -100
  48. typedef void (^V2TIMProgress)(uint32_t progress);
  49. /// 文件下载进度回调
  50. typedef void (^V2TIMDownLoadProgress)(NSInteger curSize, NSInteger totalSize);
  51. /// 获取消息接收选项的结果回调
  52. typedef void (^V2TIMReceiveMessageOptListSucc)(NSArray<V2TIMReceiveMessageOptInfo *> *optList);
  53. /// 获取全局消息接收选项的结果回调
  54. typedef void (^V2TIMReceiveMessageOptSucc)(V2TIMReceiveMessageOptInfo *optInfo);
  55. /// 获取群消息已读回执的结果回调
  56. typedef void (^V2TIMMessageReadReceiptsSucc)(NSArray<V2TIMMessageReceipt*> *receiptList);
  57. /// 获取群消息已读或未读群成员列表
  58. typedef void (^V2TIMGroupMessageReadMemberListSucc)(NSMutableArray<V2TIMGroupMemberInfo*>* members, uint64_t nextSeq, BOOL isFinished);
  59. /// 消息修改完成回调
  60. typedef void (^V2TIMMessageModifyCompletion)(int code, NSString * desc, V2TIMMessage *msg);
  61. /// 设置消息扩展成功回调
  62. typedef void (^V2TIMMessageExtensionsSetSucc)(NSArray<V2TIMMessageExtensionResult*> *extensionResultList);
  63. /// 获取消息扩展成功回调
  64. typedef void (^V2TIMMessageExtensionsGetSucc)(NSArray<V2TIMMessageExtension*> *extensionList);
  65. /// 删除消息扩展成功回调
  66. typedef void (^V2TIMMessageExtensionsDeleteSucc)(NSArray<V2TIMMessageExtensionResult*> *extensionResultList);
  67. /// 批量拉取消息回应列表成功回调
  68. typedef void (^V2TIMGetMessageReactionsSucc)(NSArray<V2TIMMessageReactionResult *> *resultList);
  69. /// 分页拉取指定消息回应用户列表成功回调(userList:用户列表,只包含昵称、头像信息 nextSeq:下一次分页拉取的游标 isFinished:用户列表是否已经拉取完毕)
  70. typedef void (^V2TIMGetMessageReactionUserListSucc)(NSArray<V2TIMUserInfo *> *userList, uint32_t nextSeq, BOOL isFinished);
  71. /// 获取置顶消息列表成功的回调
  72. typedef void (^V2TIMPinnedMessageListSucc)(NSArray<V2TIMMessage *> * messageList);
  73. /// 在接口 createTextAtMessage 中填入 kMesssageAtALL 表示当前消息需要 @ 群里所有人
  74. V2TIM_EXTERN NSString * const kImSDK_MesssageAtALL;
  75. /// 消息状态
  76. typedef NS_ENUM(NSInteger, V2TIMMessageStatus){
  77. V2TIM_MSG_STATUS_SENDING = 1, ///< 消息发送中
  78. V2TIM_MSG_STATUS_SEND_SUCC = 2, ///< 消息发送成功
  79. V2TIM_MSG_STATUS_SEND_FAIL = 3, ///< 消息发送失败
  80. V2TIM_MSG_STATUS_HAS_DELETED = 4, ///< 消息被删除
  81. V2TIM_MSG_STATUS_LOCAL_IMPORTED = 5, ///< 导入到本地的消息
  82. V2TIM_MSG_STATUS_LOCAL_REVOKED = 6, ///< 被撤销的消息
  83. };
  84. /// 消息类型
  85. typedef NS_ENUM(NSInteger, V2TIMElemType){
  86. V2TIM_ELEM_TYPE_NONE = 0, ///< 未知消息
  87. V2TIM_ELEM_TYPE_TEXT = 1, ///< 文本消息
  88. V2TIM_ELEM_TYPE_CUSTOM = 2, ///< 自定义消息
  89. V2TIM_ELEM_TYPE_IMAGE = 3, ///< 图片消息
  90. V2TIM_ELEM_TYPE_SOUND = 4, ///< 语音消息
  91. V2TIM_ELEM_TYPE_VIDEO = 5, ///< 视频消息
  92. V2TIM_ELEM_TYPE_FILE = 6, ///< 文件消息
  93. V2TIM_ELEM_TYPE_LOCATION = 7, ///< 地理位置消息
  94. V2TIM_ELEM_TYPE_FACE = 8, ///< 表情消息
  95. V2TIM_ELEM_TYPE_GROUP_TIPS = 9, ///< 群 Tips 消息
  96. V2TIM_ELEM_TYPE_MERGER = 10, ///< 合并消息
  97. };
  98. /// 推送规则
  99. typedef NS_ENUM(NSInteger, V2TIMOfflinePushFlag) {
  100. V2TIM_OFFLINE_PUSH_DEFAULT = 0, ///< 按照默认规则进行推送
  101. V2TIM_OFFLINE_PUSH_NO_PUSH = 1, ///< 不进行推送
  102. };
  103. /// 图片类型
  104. typedef NS_ENUM(NSInteger, V2TIMImageType){
  105. V2TIM_IMAGE_TYPE_ORIGIN = 0x01, ///< 原图
  106. V2TIM_IMAGE_TYPE_THUMB = 0x02, ///< 缩略图
  107. V2TIM_IMAGE_TYPE_LARGE = 0x04, ///< 大图
  108. };
  109. /// 群 Tips 类型
  110. typedef NS_ENUM(NSInteger, V2TIMGroupTipsType){
  111. V2TIM_GROUP_TIPS_TYPE_JOIN = 0x01, ///< 主动入群(memberList 加入群组,非 Work 群有效)
  112. V2TIM_GROUP_TIPS_TYPE_INVITE = 0x02, ///< 被邀请入群(opMember 邀请 memberList 入群,从 8.0 版本开始支持除 AVChatRoom 之外的所有群类型)
  113. V2TIM_GROUP_TIPS_TYPE_QUIT = 0x03, ///< 退出群 (opMember 退出群组)
  114. V2TIM_GROUP_TIPS_TYPE_KICKED = 0x04, ///< 踢出群 (opMember 把 memberList 踢出群组)
  115. V2TIM_GROUP_TIPS_TYPE_SET_ADMIN = 0x05, ///< 设置管理员 (opMember 把 memberList 设置为管理员)
  116. V2TIM_GROUP_TIPS_TYPE_CANCEL_ADMIN = 0x06, ///< 取消管理员 (opMember 取消 memberList 管理员身份)
  117. V2TIM_GROUP_TIPS_TYPE_GROUP_INFO_CHANGE = 0x07, ///< 群资料变更 (opMember 修改群资料: groupName & introduction & notification & faceUrl & owner & allMute & custom)
  118. V2TIM_GROUP_TIPS_TYPE_MEMBER_INFO_CHANGE = 0x08, ///< 群成员资料变更 (opMember 修改群成员资料:muteTime)
  119. V2TIM_GROUP_TIPS_TYPE_TOPIC_INFO_CHANGE = 0x09, ///< 话题资料变更 (opMember 修改话题资料:topicName & introduction & notification & faceUrl & allMute & topicCustomData)
  120. V2TIM_GROUP_TIPS_TYPE_PINNED_MESSAGE_ADDED = 0x0A, ///< 置顶群消息
  121. V2TIM_GROUP_TIPS_TYPE_PINNED_MESSAGE_DELETED = 0x0B,///< 取消置顶群消息
  122. };
  123. /// 群变更信息 Tips 类型
  124. typedef NS_ENUM(NSInteger, V2TIMGroupInfoChangeType){
  125. V2TIM_GROUP_INFO_CHANGE_TYPE_NAME = 0x01, ///< 群名修改
  126. V2TIM_GROUP_INFO_CHANGE_TYPE_INTRODUCTION = 0x02, ///< 群简介修改
  127. V2TIM_GROUP_INFO_CHANGE_TYPE_NOTIFICATION = 0x03, ///< 群公告修改
  128. V2TIM_GROUP_INFO_CHANGE_TYPE_FACE = 0x04, ///< 群头像修改
  129. V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER = 0x05, ///< 群主变更
  130. V2TIM_GROUP_INFO_CHANGE_TYPE_CUSTOM = 0x06, ///< 群自定义字段变更
  131. V2TIM_GROUP_INFO_CHANGE_TYPE_SHUT_UP_ALL = 0x08, ///< 全员禁言字段变更
  132. V2TIM_GROUP_INFO_CHANGE_TYPE_TOPIC_CUSTOM_DATA = 0x09, ///< 话题自定义字段变更
  133. V2TIM_GROUP_INFO_CHANGE_TYPE_RECEIVE_MESSAGE_OPT = 0x0A, ///< 消息接收选项变更
  134. V2TIM_GROUP_INFO_CHANGE_TYPE_GROUP_ADD_OPT = 0x0B, ///< 申请加群方式下管理员审批选项变更
  135. V2TIM_GROUP_INFO_CHANGE_TYPE_GROUP_APPROVE_OPT = 0x0C, ///< 邀请进群方式下管理员审批选项变更
  136. V2TIM_GROUP_INFO_CHANGE_TYPE_ENABLE_PERMISSION_GROUP = 0x0D, ///< 是否开启权限组功能变更
  137. V2TIM_GROUP_INFO_CHANGE_TYPE_DEFAULT_PERMISSIONS = 0x0E, ///< 群默认权限变更
  138. V2TIM_GROUP_INFO_CHANGE_TYPE_TOPIC_ADD_OPT = 0x0F, ///< 申请加入私密话题时管理员的审批选项变更
  139. V2TIM_GROUP_INFO_CHANGE_TYPE_TOPIC_APPROVE_OPT = 0x10, ///< 邀请进入私密话题时管理员的审批选项变更
  140. V2TIM_GROUP_INFO_CHANGE_TYPE_TOPIC_MEMBER_MAX_COUNT = 0x11, ///< 私密话题最大成员数量
  141. };
  142. /// 消息拉取方式
  143. typedef NS_ENUM(NSInteger, V2TIMMessageGetType){
  144. V2TIM_GET_CLOUD_OLDER_MSG = 1, ///< 获取云端更老的消息
  145. V2TIM_GET_CLOUD_NEWER_MSG = 2, ///< 获取云端更新的消息
  146. V2TIM_GET_LOCAL_OLDER_MSG = 3, ///< 获取本地更老的消息
  147. V2TIM_GET_LOCAL_NEWER_MSG = 4, ///< 获取本地更新的消息
  148. };
  149. /// 消息接收选项
  150. typedef NS_ENUM(NSInteger, V2TIMReceiveMessageOpt) {
  151. V2TIM_RECEIVE_MESSAGE = 0, ///< 在线正常接收消息,离线时会进行 APNs 推送
  152. V2TIM_NOT_RECEIVE_MESSAGE = 1, ///< 在线不会接收到消息,离线不会有推送通知
  153. V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE = 2, ///< 在线正常接收消息,离线不会有推送通知
  154. V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE_EXCEPT_AT = 3, ///< 在线接收消息,离线只接收 @ 消息的推送
  155. V2TIM_NOT_RECEIVE_MESSAGE_EXCEPT_AT = 4, ///< 在线和离线都只接收 @ 消息
  156. };
  157. /// 群消息已读成员列表过滤类型
  158. typedef NS_ENUM(NSInteger, V2TIMGroupMessageReadMembersFilter) {
  159. V2TIM_GROUP_MESSAGE_READ_MEMBERS_FILTER_READ = 0, ///< 群消息已读成员列表
  160. V2TIM_GROUP_MESSAGE_READ_MEMBERS_FILTER_UNREAD = 1, ///< 群消息未读成员列表
  161. };
  162. /// iOS 离线推送的类型
  163. typedef NS_ENUM(NSInteger, V2TIMIOSOfflinePushType) {
  164. V2TIM_IOS_OFFLINE_PUSH_TYPE_APNS = 0, ///< 普通的 APNs 推送
  165. V2TIM_IOS_OFFLINE_PUSH_TYPE_VOIP = 1, ///< VoIP 推送
  166. };
  167. /////////////////////////////////////////////////////////////////////////////////
  168. //
  169. // 监听 - 高级(图片、语音、视频等)消息
  170. //
  171. /////////////////////////////////////////////////////////////////////////////////
  172. /**
  173. * 1.1 添加高级消息的事件监听器
  174. */
  175. - (void)addAdvancedMsgListener:(id<V2TIMAdvancedMsgListener>)listener NS_SWIFT_NAME(addAdvancedMsgListener(listener:));
  176. /**
  177. * 1.2 移除高级消息的事件监听器
  178. */
  179. - (void)removeAdvancedMsgListener:(id<V2TIMAdvancedMsgListener>)listener NS_SWIFT_NAME(removeAdvancedMsgListener(listener:));
  180. /////////////////////////////////////////////////////////////////////////////////
  181. //
  182. // 创建 - 高级(图片、语音、视频等)消息
  183. //
  184. /////////////////////////////////////////////////////////////////////////////////
  185. /**
  186. * 2.1 创建文本消息(最大支持 12KB)
  187. */
  188. - (V2TIMMessage *)createTextMessage:(NSString *)text;
  189. /**
  190. * 2.2 创建文本消息,并且可以附带 @ 提醒功能(最大支持 12KB)
  191. *
  192. * 提醒消息仅适用于在群组中发送的消息
  193. *
  194. * @param atUserList 需要 @ 的用户列表,如果需要 @ALL,请传入 kImSDK_MesssageAtALL 常量字符串。
  195. * 举个例子,假设该条文本消息希望@提醒 denny 和 lucy 两个用户,同时又希望@所有人,atUserList 传 @[@"denny",@"lucy",kImSDK_MesssageAtALL]
  196. *
  197. * @note atUserList 使用注意事项
  198. * - 默认情况下,最多支持 @ 30个用户,超过限制后,消息会发送失败。
  199. * - atUserList 的总数不能超过默认最大数,包括 @ALL。
  200. * - 直播群(AVChatRoom)不支持发送 @ 消息。
  201. */
  202. - (V2TIMMessage *)createTextAtMessage:(NSString *)text atUserList:(NSMutableArray<NSString *> *)atUserList __attribute__((deprecated("use createAtSignedGroupMessage:atUserList: instead")));
  203. /**
  204. * 2.3 创建自定义消息(最大支持 12KB)
  205. */
  206. - (V2TIMMessage *)createCustomMessage:(NSData *)data;
  207. /**
  208. * 2.4 创建自定义消息(最大支持 12KB)
  209. *
  210. * @param desc 自定义消息描述信息,做离线Push时文本展示。
  211. * @param extension 离线Push时扩展字段信息。
  212. */
  213. - (V2TIMMessage *)createCustomMessage:(NSData *)data desc:(NSString *)desc extension:(NSString *)extension NS_SWIFT_NAME(createCustomMessage(data:desc:ext:));
  214. /**
  215. * 2.5 创建图片消息(图片文件最大支持 28 MB)
  216. *
  217. * @note 如果是系统相册拿的图片,需要先把图片导入 APP 的目录下,具体请参考 Demo TUIChatController -> imagePickerController 代码示例
  218. */
  219. - (V2TIMMessage *)createImageMessage:(NSString *)imagePath;
  220. /**
  221. * 2.6 创建语音消息(语音文件最大支持 28 MB)
  222. *
  223. * @param duration 音频时长,单位 s
  224. */
  225. - (V2TIMMessage *)createSoundMessage:(NSString *)audioFilePath duration:(int)duration;
  226. /**
  227. * 2.7 创建视频消息(视频文件最大支持 100 MB)
  228. *
  229. * @param type 视频类型,如 mp4 mov 等
  230. * @param duration 视频时长,单位 s
  231. * @param snapshotPath 视频封面文件路径
  232. *
  233. * @note 如果是系统相册拿的视频,需要先把视频导入 APP 的目录下,具体请参考 Demo TUIChatController -> imagePickerController 代码示例
  234. */
  235. - (V2TIMMessage *)createVideoMessage:(NSString *)videoFilePath
  236. type:(NSString *)type
  237. duration:(int)duration
  238. snapshotPath:(NSString *)snapshotPath;
  239. /**
  240. * 2.8 创建文件消息(文件最大支持 100 MB)
  241. */
  242. - (V2TIMMessage *)createFileMessage:(NSString *)filePath fileName:(NSString *)fileName;
  243. /**
  244. * 2.9 创建地理位置消息
  245. */
  246. - (V2TIMMessage *)createLocationMessage:(NSString *)desc longitude:(double)longitude latitude:(double)latitude;
  247. /**
  248. * 2.10 创建表情消息
  249. *
  250. * SDK 并不提供表情包,如果开发者有表情包,可使用 index 存储表情在表情包中的索引,或者使用 data 存储表情映射的字符串 key,这些都由用户自定义,SDK 内部只做透传。
  251. *
  252. * @param index 表情索引
  253. * @param data 自定义数据
  254. */
  255. - (V2TIMMessage *)createFaceMessage:(int)index data:(NSData *)data;
  256. /**
  257. * 2.11 创建合并消息(5.2.210 及以上版本支持)
  258. *
  259. * <p> 我们在收到一条合并消息的时候,通常会在聊天界面这样显示:
  260. * <p> |vinson 和 lynx 的聊天记录 | -- title (标题)
  261. * <p> |vinson:新版本 SDK 计划什么时候上线呢? | -- abstract1 (摘要信息1)
  262. * <p> |lynx:计划下周一,具体时间要看下这两天的系统测试情况.. | -- abstract2 (摘要信息2)
  263. * <p> |vinson:好的. | -- abstract3 (摘要信息3)
  264. * <p> 聊天界面通常只会展示合并消息的标题和摘要信息,完整的转发消息列表,需要用户主动点击转发消息 UI 后再获取。
  265. *
  266. * <p> 多条被转发的消息可以被创建成一条合并消息 V2TIMMessage,然后调用 sendMessage 接口发送,实现步骤如下:
  267. * <p> 1. 调用 createMergerMessage 创建一条合并消息 V2TIMMessage。
  268. * <p> 2. 调用 sendMessage 发送转发消息 V2TIMMessage。
  269. *
  270. * <p> 收到合并消息解析步骤:
  271. * <p> 1. 通过 V2TIMMessage 获取 mergerElem。
  272. * <p> 2. 通过 mergerElem 获取 title 和 abstractList UI 展示。
  273. * <p> 3. 当用户点击摘要信息 UI 的时候,调用 downloadMessageList 接口获取转发消息列表。
  274. *
  275. * @param messageList 消息列表(最大支持 300 条,消息对象必须是 V2TIM_MSG_STATUS_SEND_SUCC 状态,消息类型不能为 V2TIMGroupTipsElem)
  276. * @param title 合并消息的来源,比如 "vinson 和 lynx 的聊天记录"、"xxx 群聊的聊天记录"。
  277. * @param abstractList 合并消息的摘要列表(最大支持 5 条摘要,每条摘要的最大长度不超过 100 个字符),不同的消息类型可以设置不同的摘要信息,比如:
  278. * 文本消息可以设置为:sender:text,图片消息可以设置为:sender:[图片],文件消息可以设置为:sender:[文件]。
  279. * @param compatibleText 合并消息兼容文本,低版本 SDK 如果不支持合并消息,默认会收到一条文本消息,文本消息的内容为 compatibleText,
  280. * 该参数不能为 nil。
  281. *
  282. */
  283. - (V2TIMMessage *)createMergerMessage:(NSArray<V2TIMMessage *> *)messageList
  284. title:(NSString *)title
  285. abstractList:(NSArray<NSString *> *)abstractList
  286. compatibleText:(NSString *)compatibleText;
  287. /**
  288. * 2.12 创建转发消息(5.2.210 及以上版本支持)
  289. *
  290. * 如果需要转发一条消息,不能直接调用 sendMessage 接口发送原消息,需要先 createForwardMessage 创建一条转发消息再发送。
  291. *
  292. * @param message 待转发的消息对象,消息状态必须为 V2TIM_MSG_STATUS_SEND_SUCC,消息类型不能为 V2TIMGroupTipsElem。
  293. * @return 转发消息对象,elem 内容和原消息完全一致。
  294. */
  295. - (V2TIMMessage *)createForwardMessage:(V2TIMMessage *)message;
  296. /**
  297. * 2.13 创建定向群消息(6.0 及以上版本支持)
  298. *
  299. * 如果您需要在群内给指定群成员列表发消息,可以创建一条定向群消息,定向群消息只有指定群成员才能收到。
  300. *
  301. * @param message 原始消息对象
  302. * @param receiverList 消息接收者列表
  303. * @return 定向群消息对象
  304. *
  305. * @note
  306. * - 原始消息对象不支持群 @ 消息。
  307. * - 消息接收者列表最大支持 50 个。
  308. * - 社群(Community)和直播群(AVChatRoom)不支持发送定向群消息。
  309. * - 定向群消息默认不计入群会话的未读计数。
  310. */
  311. - (V2TIMMessage *)createTargetedGroupMessage:(V2TIMMessage *)message receiverList:(NSMutableArray<NSString *> *)receiverList;
  312. /**
  313. * 2.14 创建带 @ 标记的群消息(7.0 及以上版本支持)
  314. *
  315. * 如果您需要发送的群消息附带 @ 提醒功能,可以创建一条带 @ 标记的群消息。
  316. *
  317. * @param message 原始消息对象
  318. * @param atUserList 需要 @ 的用户列表,如果需要 @ALL,请传入 kImSDK_MesssageAtALL 常量字符串。
  319. * 举个例子,假设该条消息希望@提醒 denny 和 lucy 两个用户,同时又希望@所有人,atUserList 传 @[@"denny",@"lucy",kImSDK_MesssageAtALL]
  320. * @return 群 @ 消息对象
  321. *
  322. * @note atUserList 使用注意事项
  323. * - 默认情况下,最多支持 @ 30个用户,超过限制后,消息会发送失败。
  324. * - atUserList 的总数不能超过默认最大数,包括 @ALL。
  325. * - 直播群(AVChatRoom)不支持发送 @ 消息。
  326. */
  327. - (V2TIMMessage *)createAtSignedGroupMessage:(V2TIMMessage *)message atUserList:(NSMutableArray<NSString *> *)atUserList;
  328. /////////////////////////////////////////////////////////////////////////////////
  329. //
  330. // 发送 - 高级(图片、语音、视频等)消息
  331. //
  332. /////////////////////////////////////////////////////////////////////////////////
  333. /**
  334. * 3.1 发送高级消息(高级版本:可以指定优先级,推送信息等特性)
  335. *
  336. * @param message 待发送的消息对象,需要通过对应的 createXXXMessage 接口进行创建。
  337. * @param receiver 消息接收者的 userID, 如果是发送 C2C 单聊消息,只需要指定 receiver 即可。
  338. * @param groupID 目标群组 ID,如果是发送群聊消息,只需要指定 groupID 即可。
  339. * @param priority 消息优先级,仅针对群聊消息有效。请把重要消息设置为高优先级(比如红包、礼物消息),高频且不重要的消息设置为低优先级(比如点赞消息)。
  340. * @param onlineUserOnly 是否只有在线用户才能收到,如果设置为 YES ,接收方历史消息拉取不到,常被用于实现”对方正在输入”或群组里的非重要提示等弱提示功能,该字段不支持 AVChatRoom。
  341. * @param offlinePushInfo 苹果 APNS 离线推送时携带的标题和声音。
  342. * @param progress 文件上传进度(当发送消息中包含图片、语音、视频、文件等富媒体消息时才有效)。
  343. * @return msgID 消息唯一标识
  344. *
  345. * @note
  346. * - 6.0 及以上版本支持定向群消息,如果 groupID 和 receiver 同时设置,表示给 receiver 发送定向群消息,如果要给多个 receiver 发送定向群消息,需要先调用 createTargetedGroupMessage 接口创建定向群消息后再发送。
  347. * - 如果需要消息离线推送,请先在 V2TIMManager+APNS.h 开启推送,推送开启后,除了自定义消息,其他消息默认都会推送。
  348. * - 如果自定义消息也需要推送,请设置 offlinePushInfo 的 desc 字段,设置成功后,推送的时候会默认展示 desc 信息。
  349. * - AVChatRoom 群聊不支持 onlineUserOnly 字段,如果是 AVChatRoom 请将该字段设置为 NO。
  350. * - 如果设置 onlineUserOnly 为 YES 时,该消息为在线消息且不会被计入未读计数。
  351. */
  352. - (NSString *)sendMessage:(V2TIMMessage *)message
  353. receiver:(NSString *)receiver
  354. groupID:(NSString *)groupID
  355. priority:(V2TIMMessagePriority)priority
  356. onlineUserOnly:(BOOL)onlineUserOnly
  357. offlinePushInfo:(V2TIMOfflinePushInfo *)offlinePushInfo
  358. progress:(V2TIMProgress)progress
  359. succ:(V2TIMSucc)succ
  360. fail:(V2TIMFail)fail;
  361. /////////////////////////////////////////////////////////////////////////////////
  362. //
  363. // 接收 - 设置消息的接口选项(接收|接收但不提醒|不接收)
  364. //
  365. /////////////////////////////////////////////////////////////////////////////////
  366. /**
  367. * 4.1 设置针对某个用户的 C2C 消息接收选项(支持批量设置)
  368. * <p>5.3.425 及以上版本支持
  369. *
  370. * @note
  371. * - 该接口支持批量设置,您可以通过参数 userIDList 设置一批用户,但一次最大允许设置 30 个用户。
  372. * - 该接口调用频率被限制为1秒内最多调用5次。
  373. */
  374. - (void)setC2CReceiveMessageOpt:(NSArray<NSString *> *)userIDList
  375. opt:(V2TIMReceiveMessageOpt)opt
  376. succ:(V2TIMSucc)succ
  377. fail:(V2TIMFail)fail;
  378. /**
  379. * 4.2 查询针对某个用户的 C2C 消息接收选项
  380. * <p>5.3.425 及以上版本支持
  381. */
  382. - (void)getC2CReceiveMessageOpt:(NSArray<NSString *> *)userIDList
  383. succ:(V2TIMReceiveMessageOptListSucc)succ
  384. fail:(V2TIMFail)fail;
  385. /**
  386. * 4.3 设置群消息的接收选项
  387. */
  388. - (void)setGroupReceiveMessageOpt:(NSString*)groupID
  389. opt:(V2TIMReceiveMessageOpt)opt
  390. succ:(V2TIMSucc)succ
  391. fail:(V2TIMFail)fail;
  392. /**
  393. * 4.4 设置全局消息接收选项,从 7.4 版本开始支持。
  394. *
  395. * @param opt 全局消息接收选项,支持两种取值:
  396. * V2TIMReceiveMessageOpt.V2TIM_RECEIVE_MESSAGE:在线正常接收消息,离线时会有厂商的离线推送通知,默认为该选项
  397. * V2TIMReceiveMessageOpt.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE:在线正常接收消息,离线不会有推送通知,可用于实现消息免打扰功能
  398. * @param startHour 免打扰开始时间:小时,取值范围[0 - 23]
  399. * @param startMinute 免打扰开始时间:分钟,取值范围[0 - 59]
  400. * @param startSecond 免打扰开始时间:秒,取值范围[0 - 59]
  401. * @param duration 免打扰持续时长:单位:秒,取值范围 [0 - 24*60*60].
  402. *
  403. * @note
  404. * - 当 duration 的取值小于 24*60*60 时,可用于实现重复免打扰,即消息免打扰从每天的 startHour:startMinute:startSecond 表示的时间点开始,持续时长为 druation 秒
  405. * - 当 duration 取值不小于 24*60*60 时,可用于实现永久免打扰,即从调用该 API 当天 startHour:startMinute:startSecond 表示的时间点开始永久消息免打扰
  406. */
  407. - (void)setAllReceiveMessageOpt:(V2TIMReceiveMessageOpt) opt
  408. startHour:(int32_t)startHour
  409. startMinute:(int32_t) startMinute
  410. startSecond:(int32_t) startSecond
  411. duration:(uint32_t) duration
  412. succ:(V2TIMSucc)succ
  413. fail:(V2TIMFail)fail;
  414. /**
  415. * 4.5 设置全局消息接收选项,从 7.4 版本开始支持。
  416. *
  417. * @param opt 全局消息接收选项,支持两种取值:
  418. * V2TIMReceiveMessageOpt.V2TIM_RECEIVE_MESSAGE:在线正常接收消息,离线时会有厂商的离线推送通知,默认为该选项
  419. * V2TIMReceiveMessageOpt.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE:在线正常接收消息,离线不会有推送通知,可用于实现消息免打扰功能
  420. * @param startTimeStamp 免打扰开始时间,UTC 时间戳,单位:秒
  421. * @param duration 免打扰持续时长,单位:秒
  422. *
  423. */
  424. - (void)setAllReceiveMessageOpt:(V2TIMReceiveMessageOpt) opt
  425. startTimeStamp:(uint32_t) startTimeStamp
  426. duration:(uint32_t) duration
  427. succ:(V2TIMSucc)succ
  428. fail:(V2TIMFail)fail;
  429. /**
  430. * 4.6 获取登录用户全局消息接收选项,从 7.3 版本开始支持
  431. *
  432. */
  433. - (void)getAllReceiveMessageOpt:(V2TIMReceiveMessageOptSucc)succ fail:(V2TIMFail)fail;
  434. /////////////////////////////////////////////////////////////////////////////////
  435. //
  436. // 获取历史消息、撤回、删除、标记已读等高级接口
  437. //
  438. /////////////////////////////////////////////////////////////////////////////////
  439. /**
  440. * 5.1 获取单聊历史消息
  441. *
  442. * @param count 拉取消息的个数,不宜太多,会影响消息拉取的速度,这里建议一次拉取 20 个
  443. * @param lastMsg 获取消息的起始消息,如果传 nil,起始消息为会话的最新消息
  444. *
  445. * @note
  446. * - 如果没有触发登录,调用该接口不会返回历史消息
  447. * - 如果登录失败,调用该接口会返回本地历史消息
  448. * - 如果 SDK 检测到没有网络,调用该接口会返回本地历史消息
  449. * - 如果登录成功且网络正常,调用该接口会先请求云端历史消息,然后再和本地历史消息合并后返回
  450. */
  451. - (void)getC2CHistoryMessageList:(NSString *)userID count:(int)count lastMsg:(V2TIMMessage *)lastMsg succ:(V2TIMMessageListSucc)succ fail:(V2TIMFail)fail;
  452. /**
  453. * 5.2 获取群组历史消息
  454. *
  455. * @param count 拉取消息的个数,不宜太多,会影响消息拉取的速度,这里建议一次拉取 20 个
  456. * @param lastMsg 获取消息的起始消息,如果传 nil,起始消息为会话的最新消息
  457. *
  458. * @note
  459. * - 如果没有触发登录,调用该接口不会返回历史消息
  460. * - 如果登录失败,调用该接口会返回本地历史消息
  461. * - 如果 SDK 检测到没有网络,调用该接口会返回本地历史消息
  462. * - 如果登录成功且网络正常,调用该接口会先请求云端历史消息,然后再和本地历史消息合并后返回
  463. * - 只有会议群(Meeting)才能拉取到进群前的历史消息,直播群(AVChatRoom)消息不存漫游和本地数据库,调用这个接口无效
  464. */
  465. - (void)getGroupHistoryMessageList:(NSString *)groupID count:(int)count lastMsg:(V2TIMMessage *)lastMsg succ:(V2TIMMessageListSucc)succ fail:(V2TIMFail)fail;
  466. /**
  467. * 5.3 获取历史消息高级接口
  468. *
  469. * @param option 拉取消息选项设置,可以设置从云端、本地拉取更老或更新的消息
  470. *
  471. * @note
  472. * - 如果没有触发登录,调用该接口不会返回历史消息
  473. * - 如果登录失败,调用该接口会返回本地历史消息
  474. * - 如果 SDK 检测到没有网络,调用该接口会返回本地历史消息
  475. * - 如果登录成功且网络正常,当 option 设置为拉取云端历史消息,调用该接口会先请求云端历史消息,然后再和本地历史消息合并后返回
  476. * - 只有会议群(Meeting)才能拉取到进群前的历史消息,直播群(AVChatRoom)消息不存漫游和本地数据库,调用这个接口无效
  477. */
  478. - (void)getHistoryMessageList:(V2TIMMessageListGetOption *)option succ:(V2TIMMessageListSucc)succ
  479. fail:(V2TIMFail)fail;
  480. /**
  481. * 5.4 撤回消息
  482. *
  483. * @note
  484. - 撤回消息的时间限制默认 2 minutes,超过 2 minutes 的消息不能撤回,您也可以在 [控制台](https://console.cloud.tencent.com/im)(功能配置 -> 登录与消息 -> 消息撤回设置)自定义撤回时间限制。
  485. * - 仅支持单聊和群组中发送的普通消息,无法撤销 onlineUserOnly 为 true 即仅在线用户才能收到的消息。
  486. * - 如果发送方撤回消息,已经收到消息的一方会收到 V2TIMAdvancedMsgListener -> onRecvMessageRevoked 回调。
  487. * - 从 IMSDK 7.4 版本开始,支持撤回包括直播群(AVChatRoom)、社群在内的所有群类型的消息。
  488. * - 在单聊场景中,仅能撤回自己的消息;在群聊场景中,除了可以撤回自己的消息外,管理员或者群主也可以撤回其他群成员的消息。
  489. */
  490. - (void)revokeMessage:(V2TIMMessage *)msg succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  491. /**
  492. * 5.5 消息变更
  493. *
  494. * @note
  495. * - 如果消息修改成功,自己和对端用户(C2C)或群组成员(Group)都会收到 onRecvMessageModified 回调。
  496. * - 如果在修改消息过程中,消息已经被其他人修改,completion 会返回 ERR_SDK_MSG_MODIFY_CONFLICT 错误。
  497. * - 消息无论修改成功或则失败,completion 都会返回最新的消息对象。
  498. */
  499. - (void)modifyMessage:(V2TIMMessage *)msg completion:(V2TIMMessageModifyCompletion)completion;
  500. /**
  501. * 5.6 删除本地消息
  502. *
  503. * @note 该接口只能删除本地历史,消息删除后,SDK 会在本地把这条消息标记为已删除状态,getHistoryMessage 不能再拉取到,如果程序卸载重装,本地会失去对这条消息的删除标记,getHistoryMessage 还能再拉取到该条消息。
  504. */
  505. - (void)deleteMessageFromLocalStorage:(V2TIMMessage *)msg succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  506. /**
  507. * 5.7 删除本地及云端的消息
  508. *
  509. * @note 该接口会在 deleteMessageFromLocalStorage 的基础上,同步删除云端存储的消息,且无法恢复。需要注意的是:
  510. * - 一次最多只能删除 50 条消息
  511. * - 要删除的消息必须属于同一会话
  512. * - 一秒钟最多只能调用一次该接口
  513. * - 如果该账号在其他设备上拉取过这些消息,那么调用该接口删除后,这些消息仍然会保存在那些设备上,即删除消息不支持多端同步。
  514. */
  515. - (void)deleteMessages:(NSArray<V2TIMMessage *>*)msgList succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  516. /**
  517. * 5.8 清空单聊本地及云端的消息(不删除会话)
  518. * <p>5.4.666 及以上版本支持
  519. *
  520. * @note
  521. * - 会话内的消息在本地删除的同时,在服务器也会同步删除。
  522. */
  523. - (void)clearC2CHistoryMessage:(NSString *)userID succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  524. /**
  525. * 5.9 清空群聊本地及云端的消息(不删除会话)
  526. * <p>5.4.666 及以上版本支持
  527. *
  528. * @note
  529. * - 会话内的消息在本地删除的同时,在服务器也会同步删除。
  530. */
  531. - (void)clearGroupHistoryMessage:(NSString *)groupID succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  532. /**
  533. * 5.10 向群组消息列表中添加一条消息
  534. *
  535. * 该接口主要用于满足向群组聊天会话中插入一些提示性消息的需求,比如“您已经退出该群”,这类消息有展示
  536. * 在聊天消息区的需求,但并没有发送给其他人的必要。
  537. * 所以 insertGroupMessageToLocalStorage() 相当于一个被禁用了网络发送能力的 sendMessage() 接口。
  538. *
  539. * @return msgID 消息唯一标识
  540. * @note 通过该接口 save 的消息只存本地,程序卸载后会丢失。
  541. */
  542. - (NSString *)insertGroupMessageToLocalStorage:(V2TIMMessage *)msg to:(NSString *)groupID sender:(NSString *)sender succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  543. /**
  544. * 5.11 向C2C消息列表中添加一条消息
  545. *
  546. * 该接口主要用于满足向C2C聊天会话中插入一些提示性消息的需求,比如“您已成功发送消息”,这类消息有展示
  547. * 在聊天消息区的需求,但并没有发送给对方的必要。
  548. * 所以 insertC2CMessageToLocalStorage()相当于一个被禁用了网络发送能力的 sendMessage() 接口。
  549. *
  550. * @return msgID 消息唯一标识
  551. * @note 通过该接口 save 的消息只存本地,程序卸载后会丢失。
  552. */
  553. - (NSString *)insertC2CMessageToLocalStorage:(V2TIMMessage *)msg to:(NSString *)userID sender:(NSString *)sender succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  554. /**
  555. * 5.12 根据 messageID 查询指定会话中的本地消息,包括状态 status 为 V2TIM_MSG_STATUS_LOCAL_REVOKED(已撤回)和 V2TIM_MSG_STATUS_HAS_DELETED(已删除)的消息
  556. * @param messageIDList 消息 ID 列表
  557. * @note 通过 V2TIMMessage 的 status 来区分消息的状态
  558. */
  559. - (void)findMessages:(NSArray<NSString *>*)messageIDList succ:(V2TIMMessageListSucc)succ fail:(V2TIMFail)fail;
  560. /**
  561. * 5.13 搜索本地消息(5.4.666 及以上版本支持,需要您购买旗舰版套餐)
  562. * @param param 消息搜索参数,详见 V2TIMMessageSearchParam 的定义
  563. * @note 返回的列表不包含消息状态 status 为 V2TIM_MSG_STATUS_LOCAL_REVOKED(已撤回)和 V2TIM_MSG_STATUS_HAS_DELETED(已删除)的消息
  564. */
  565. - (void)searchLocalMessages:(V2TIMMessageSearchParam *)param succ:(V2TIMSearchMessageListSucc)succ fail:(V2TIMFail)fail;
  566. /**
  567. * 5.14 搜索云端消息(7.3 及以上版本支持)
  568. * @param param 消息搜索参数,详见 V2TIMMessageSearchParam 的定义
  569. * @note
  570. * - 该功能为 IM 增值功能,详见[价格说明](https://cloud.tencent.com/document/product/269/11673?from=17176#.E5.9F.BA.E7.A1.80.E6.9C.8D.E5.8A.A1.E8.AF.A6.E6.83.85)
  571. * - 如果您没有开通该服务,调用接口会返回 60020 错误码
  572. * -返回的列表不包含消息状态 status 为 V2TIM_MSG_STATUS_LOCAL_REVOKED(已撤回)和 V2TIM_MSG_STATUS_HAS_DELETED(已删除)的消息
  573. */
  574. - (void)searchCloudMessages:(V2TIMMessageSearchParam *)param succ:(V2TIMSearchMessageListSucc)succ fail:(V2TIMFail)fail;
  575. /**
  576. * 5.15 发送消息已读回执 (6.1 及其以上版本支持)
  577. *
  578. * @note
  579. * - 该功能为旗舰版功能,[购买旗舰版套餐包](https://buy.cloud.tencent.com/avc?from=17485)后可使用,详见[价格说明](https://cloud.tencent.com/document/product/269/11673?from=17221#.E5.9F.BA.E7.A1.80.E6.9C.8D.E5.8A.A1.E8.AF.A6.E6.83.85)。
  580. * - 向群消息发送已读回执,需要您先到控制台打开对应的开关,详情参考文档 [群消息已读回执](https://cloud.tencent.com/document/product/269/75343#.E8.AE.BE.E7.BD.AE.E6.94.AF.E6.8C.81.E5.B7.B2.E8.AF.BB.E5.9B.9E.E6.89.A7.E7.9A.84.E7.BE.A4.E7.B1.BB.E5.9E.8B) 。
  581. * - messageList 里的消息必须在同一个会话中。
  582. * - 该接口调用成功后,会话未读数不会变化,消息发送者会收到 onRecvMessageReadReceipts 回调,回调里面会携带消息的最新已读信息。
  583. */
  584. - (void)sendMessageReadReceipts:(NSArray<V2TIMMessage *>*)messageList succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  585. /**
  586. * 5.16 获取消息已读回执(6.1 及其以上版本支持)
  587. * @param messageList 消息列表
  588. *
  589. * @note :
  590. * - 该功能为旗舰版功能,[购买旗舰版套餐包](https://buy.cloud.tencent.com/avc?from=17485)后可使用,详见[价格说明](https://cloud.tencent.com/document/product/269/11673?from=17221#.E5.9F.BA.E7.A1.80.E6.9C.8D.E5.8A.A1.E8.AF.A6.E6.83.85)。
  591. * - 获取群消息已读回执,需要您先到控制台打开对应的开关,详情参考文档 [群消息已读回执](https://cloud.tencent.com/document/product/269/75343#.E8.AE.BE.E7.BD.AE.E6.94.AF.E6.8C.81.E5.B7.B2.E8.AF.BB.E5.9B.9E.E6.89.A7.E7.9A.84.E7.BE.A4.E7.B1.BB.E5.9E.8B) 。
  592. * - messageList 里的消息必须在同一个会话中。
  593. */
  594. - (void)getMessageReadReceipts:(NSArray<V2TIMMessage *>*)messageList succ:(V2TIMMessageReadReceiptsSucc)succ fail:(V2TIMFail)fail;
  595. /**
  596. * 5.17 获取群消息已读群成员列表(6.1 及其以上版本支持)
  597. * @param message 群消息
  598. * @param filter 指定拉取已读或未读群成员列表。
  599. * @param nextSeq 分页拉取的游标,第一次默认取传 0,后续分页拉传上一次分页拉取成功回调里的 nextSeq。
  600. * @param count 分页拉取的个数,最大支持 100 个。
  601. *
  602. * @note
  603. * - 该功能为旗舰版功能,[购买旗舰版套餐包](https://buy.cloud.tencent.com/avc?from=17485)后可使用,详见[价格说明](https://cloud.tencent.com/document/product/269/11673?from=17221#.E5.9F.BA.E7.A1.80.E6.9C.8D.E5.8A.A1.E8.AF.A6.E6.83.85)。
  604. * - 使用该功能之前,请您先到控制台打开对应的开关,详情参考文档 [群消息已读回执](https://cloud.tencent.com/document/product/269/75343#.E8.AE.BE.E7.BD.AE.E6.94.AF.E6.8C.81.E5.B7.B2.E8.AF.BB.E5.9B.9E.E6.89.A7.E7.9A.84.E7.BE.A4.E7.B1.BB.E5.9E.8B) 。
  605. */
  606. - (void)getGroupMessageReadMemberList:(V2TIMMessage*)message filter:(V2TIMGroupMessageReadMembersFilter)filter nextSeq:(uint64_t)nextSeq count:(uint32_t)count succ:(V2TIMGroupMessageReadMemberListSucc)succ fail:(V2TIMFail)fail;
  607. /**
  608. * 5.18 设置消息扩展(6.7 及其以上版本支持,需要您购买旗舰版套餐)
  609. * @param message 消息对象,消息需满足三个条件:1、消息发送前需设置 supportMessageExtension 为 YES,2、消息必须是发送成功的状态,3、消息不能是直播群(AVChatRoom)消息。
  610. * @param extensions 扩展信息,如果扩展 key 已经存在,则修改扩展的 value 信息,如果扩展 key 不存在,则新增扩展。
  611. *
  612. * @note
  613. * - 扩展 key 最大支持 100 字节,扩展 value 最大支持 1KB,单次最多支持设置 20 个扩展,单条消息最多可设置 300 个扩展。
  614. * - 当多个用户同时设置或删除同一个扩展 key 时,只有第一个用户可以执行成功,其它用户会收到 23001 错误码和最新的扩展信息,在收到错误码和扩展信息后,请按需重新发起设置操作。
  615. * - 我们强烈建议不同的用户设置不同的扩展 key,这样大部分场景都不会冲突,比如投票、接龙、问卷调查,都可以把自己的 userID 作为扩展 key。
  616. */
  617. - (void)setMessageExtensions:(V2TIMMessage*)message extensions:(NSArray<V2TIMMessageExtension *> *)extensions succ:(V2TIMMessageExtensionsSetSucc)succ fail:(V2TIMFail)fail;
  618. /**
  619. * 5.19 获取消息扩展(6.7 及其以上版本支持,需要您购买旗舰版套餐)
  620. */
  621. - (void)getMessageExtensions:(V2TIMMessage*)message succ:(V2TIMMessageExtensionsGetSucc)succ fail:(V2TIMFail)fail;
  622. /**
  623. * 5.20 删除消息扩展(6.7 及其以上版本支持,需要您购买旗舰版套餐)
  624. * @param keys 消息扩展 key 列表, 单次最大支持删除 20 个消息扩展,如果设置为 nil ,表示删除所有消息扩展
  625. *
  626. * @note
  627. * - 当多个用户同时设置或删除同一个扩展 key 时,只有第一个用户可以执行成功,其它用户会收到 23001 错误码和最新的扩展信息,在收到错误码和扩展信息后,请按需重新发起删除操作。
  628. */
  629. - (void)deleteMessageExtensions:(V2TIMMessage*)message keys:(NSArray<NSString *> *)keys succ:(V2TIMMessageExtensionsDeleteSucc)succ fail:(V2TIMFail)fail;
  630. /**
  631. * 5.21 添加消息回应(可以用于实现表情回应)(7.4 及其以上版本支持,需要您购买旗舰版套餐)
  632. *
  633. * <p> 表情回应功能是指对某条消息通过表情符号进行互动回应,我们可以看到每种表情的回应人数和回应人列表。
  634. * <p> 目前常见的消息回应展示方式会有如下两种风格:
  635. * <p> 风格一:
  636. * <p> ----------------------------
  637. * <p> | lucy, happy birthday! |
  638. * <p> ----------------------------
  639. * <p> | 😄 1 💐 2 👍🏻 10 |
  640. * <p> ----------------------------
  641. * <p> 风格二:
  642. * <p> ------------------------------------------------
  643. * <p> | lucy, happy birthday! |
  644. * <p> ------------------------------------------------
  645. * <p> | 😁 bob 💐olivia 🎂david |
  646. * <p> | 👍🏻 denny、james、lucy、linda、thomas 等10人 |
  647. * <p> ------------------------------------------------
  648. * <p>
  649. * <p> 当用户点击某个表情后,会跳转到表情回应详情界面:
  650. * <p> | 😄 | 💐 | 👍🏻 |
  651. * <p> | bob | olivia | lucy |
  652. * <p> | ... | ... | denny |
  653. * <p> | ... | ... | ... |
  654. * <p> 用户可以根据某个表情分页拉取使用该表情的用户信息。
  655. * <p>
  656. * <p> 您可以基于 SDK API 实现表情回应能力:
  657. * <p> 1、调用 addMessageReaction 接口为一条消息添加一个 emoji,添加成功后,emoji 下就会存储当前操作用户。
  658. * <p> 2、调用 removeMessageReaction 接口删除已经添加的 emoji,删除成功后,emoji 下就不再存储当前操作用户。
  659. * <p> 3、调用 getMessageReactions 接口批量拉取多条消息的 emoji 列表,其中每个 emoji 都包含了当前使用者总人数以及前 N(默认 10)个使用者用户资料。
  660. * <p> 4、调用 getAllUserListOfMessageReaction 接口分页拉取消息 emoji 的全量使用者用户资料。
  661. * <p> 5、监听 onRecvMessageReactionsChanged 回调,感知 emoji 的使用者信息变更,该回调会携带 emoji 最新的使用者信息(包含使用者总人数以及前 N 个使用者用户资料)。
  662. * <p>
  663. *
  664. * @param reactionID 消息回应 ID,在表情回应场景,reactionID 为表情 ID,单条消息最大支持 10 个 Reaction,单个 Reaction 最大支持 100 个用户。
  665. *
  666. * @note
  667. * - 该功能为旗舰版功能,需要您购买旗舰版套餐。
  668. * - 如果单条消息 Reaction 数量超过最大限制,调用接口会报 ERR_SVR_MSG_REACTION_COUNT_LIMIT 错误。
  669. * - 如果单个 Reaction 用户数量超过最大限制,调用接口会报 ERR_SVR_MSG_REACTION_USER_COUNT_LIMIT 错误。
  670. * - 如果 Reaction 已经包含当前用户,调用接口会报 ERR_SVR_MSG_REACTION_ALREADY_CONTAIN_USER 错误。
  671. */
  672. - (void)addMessageReaction:(V2TIMMessage *)message reactionID:(NSString *)reactionID succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  673. /**
  674. * 5.22 删除消息回应(7.4 及其以上版本支持,需要您购买旗舰版套餐)
  675. *
  676. * @note
  677. * - 如果 Reaction 不存在,调用接口会报 ERR_SVR_MSG_REACTION_NOT_EXISTS 错误。
  678. * - 如果 Reaction 不包含当前用户,调用接口会报 ERR_SVR_MSG_REACTION_NOT_CONTAIN_USER 错误。
  679. *
  680. */
  681. - (void)removeMessageReaction:(V2TIMMessage *)message reactionID:(NSString *)reactionID succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  682. /**
  683. * 5.23 批量拉取多条消息回应信息(7.4 及其以上版本支持,需要您购买旗舰版套餐)
  684. *
  685. * @param messageList 消息列表,一次最大支持 20 条消息,消息必须属于同一个会话。
  686. * @param maxUserCountPerReaction 取值范围 【0,10】,每个 Reaction 最多只返回前 10 个用户信息,如需更多用户信息,可以按需调用 getAllUserListOfMessageReaction 接口分页拉取。
  687. *
  688. */
  689. - (void)getMessageReactions:(NSArray<V2TIMMessage *> *)messageList maxUserCountPerReaction:(uint32_t)maxUserCountPerReaction succ:(V2TIMGetMessageReactionsSucc)succ fail:(V2TIMFail)fail;
  690. /**
  691. * 5.24 分页拉取使用指定消息回应用户信息(7.4 及其以上版本支持,需要您购买旗舰版套餐)
  692. *
  693. * @param message 消息对象
  694. * @param reactionID 消息回应 ID
  695. * @param nextSeq 分页拉取的游标,第一次传 0,后续分页传 succ 返回的 nextSeq。
  696. * @param count 一次分页最大拉取个数,最大支持 100 个。
  697. *
  698. */
  699. - (void)getAllUserListOfMessageReaction:(V2TIMMessage *)message reactionID:(NSString *)reactionID nextSeq:(uint32_t)nextSeq count:(uint32_t)count succ:(V2TIMGetMessageReactionUserListSucc)succ fail:(V2TIMFail)fail;
  700. /**
  701. * 5.25 翻译文本消息
  702. *
  703. * @param sourceTextList 待翻译文本数组。
  704. * @param source 源语言。可以设置为特定语言或 ”auto“。“auto“ 表示自动识别源语言。传空默认为 ”auto“。
  705. * @param target 目标语言。支持的目标语言有多种,例如:英语-“en“,简体中文-”zh“,法语-”fr“,德语-”de“等。详情请参考文档:[文本翻译语言支持](https://cloud.tencent.com/document/product/269/85380#.E6.96.87.E6.9C.AC.E7.BF.BB.E8.AF.91.E8.AF.AD.E8.A8.80.E6.94.AF.E6.8C.81)。
  706. * @param callback 翻译结果回调。其中 result 的 key 为待翻译文本, value 为翻译后文本。
  707. */
  708. - (void)translateText:(NSArray<NSString *> *)sourceTextList
  709. sourceLanguage:(NSString *)source
  710. targetLanguage:(NSString *)target
  711. completion:(void (^)(int code, NSString *desc, NSDictionary<NSString *, NSString *> *result))callback;
  712. /**
  713. * 5.26 设置群消息置顶(7.9 及以上版本支持,需要您购买旗舰版套餐)
  714. * @param groupID 群 ID
  715. * @param isPinned 是否置顶
  716. *
  717. * @note
  718. * - 最多支持置顶10条消息。
  719. * - 此接口用于置顶和取消置顶对应的群消息,如果置顶消息数量超出限制sdk会返回错误码10070。
  720. */
  721. - (void)pinGroupMessage:(NSString *)groupID message:(V2TIMMessage *)message isPinned:(BOOL)isPinned succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  722. /**
  723. * 5.27 获取已置顶的群消息列表(7.9 及以上版本支持,需要您购买旗舰版套餐)
  724. * @param groupID 群 ID
  725. *
  726. * @note
  727. * - 此接口用于获取置顶消息列表,如果置顶消息已过期不会返回
  728. */
  729. - (void)getPinnedGroupMessageList:(NSString *)groupID succ:(V2TIMPinnedMessageListSucc)succ fail:(V2TIMFail)fail;
  730. /**
  731. * 5.28 标记单聊会话已读(待废弃接口,请使用 cleanConversationUnreadMessageCount 接口)
  732. *
  733. * @note
  734. * - 该接口调用成功后,自己的未读数会清 0,对端用户会收到 onRecvC2CReadReceipt 回调,回调里面会携带标记会话已读的时间。
  735. * - 从 5.8 版本开始,当 userID 为 nil 时,标记所有单聊会话为已读状态。
  736. */
  737. - (void)markC2CMessageAsRead:(NSString *)userID succ:(V2TIMSucc)succ fail:(V2TIMFail)fail __attribute__((deprecated("use cleanConversationUnreadMessageCount: instead")));
  738. /**
  739. * 5.29 标记群组会话已读(待废弃接口,请使用 cleanConversationUnreadMessageCount 接口)
  740. *
  741. * @note
  742. * - 该接口调用成功后,自己的未读数会清 0。
  743. * - 从 5.8 版本开始,当 groupID 为 nil 时,标记所有群组会话为已读状态。
  744. */
  745. - (void)markGroupMessageAsRead:(NSString *)groupID succ:(V2TIMSucc)succ fail:(V2TIMFail)fail __attribute__((deprecated("use cleanConversationUnreadMessageCount: instead")));
  746. /**
  747. * 5.30 标记所有会话为已读(待废弃接口,请使用 cleanConversationUnreadMessageCount 接口)
  748. */
  749. - (void)markAllMessageAsRead:(V2TIMSucc)succ fail:(V2TIMFail)fail __attribute__((deprecated("use cleanConversationUnreadMessageCount: instead")));
  750. @end
  751. /////////////////////////////////////////////////////////////////////////////////
  752. //
  753. // 高级消息监听器
  754. //
  755. /////////////////////////////////////////////////////////////////////////////////
  756. /// 高级消息监听器
  757. V2TIM_EXPORT @protocol V2TIMAdvancedMsgListener <NSObject>
  758. @optional
  759. /// 收到新消息
  760. - (void)onRecvNewMessage:(V2TIMMessage *)msg;
  761. /// 消息已读回执通知(如果自己发的消息支持已读回执,消息接收端调用了 sendMessageReadReceipts 接口,自己会收到该回调)
  762. - (void)onRecvMessageReadReceipts:(NSArray<V2TIMMessageReceipt *> *)receiptList;
  763. /// 如果对端用户调用 cleanConversationUnreadMessageCount 接口清理 C2C 未读消息数,自己会收到该回调,回调只会携带对端 userID 和对端清理 C2C 未读数的时间
  764. - (void)onRecvC2CReadReceipt:(NSArray<V2TIMMessageReceipt *> *)receiptList;
  765. /// 收到消息撤回(从 IMSDK 7.4 版本开始支持)
  766. - (void)onRecvMessageRevoked:(NSString *)msgID operateUser:(V2TIMUserFullInfo *)operateUser reason:(NSString *)reason;
  767. /// 消息内容被修改
  768. - (void)onRecvMessageModified:(V2TIMMessage *)msg;
  769. /// 消息扩展信息更新
  770. - (void)onRecvMessageExtensionsChanged:(NSString *)msgID extensions:(NSArray<V2TIMMessageExtension *> *)extensions;
  771. /// 消息扩展信息被删除
  772. - (void)onRecvMessageExtensionsDeleted:(NSString *)msgID extensionKeys:(NSArray<NSString *> *)extensionKeys;
  773. /// 消息回应信息更新
  774. /// 该回调是消息 Reaction 的增量回调,只会携带变更的 Reaction 信息。
  775. /// 当变更的 Reaction 信息里的 totalUserCount 字段值为 0 时,表明该 Reaction 已经没有用户在使用,您可以在 UI 上移除该 Reaction 的展示。
  776. - (void)onRecvMessageReactionsChanged:(NSArray<V2TIMMessageReactionChangeInfo *> *)changeList;
  777. /// 置顶群消息列表变更通知
  778. /// 如果变更类型为取消置顶,message 参数中只有消息的 key,不包含完整的消息体。
  779. - (void)onGroupMessagePinned:(NSString *)groupID message:(V2TIMMessage *)message isPinned:(BOOL)isPinned opUser:(V2TIMGroupMemberInfo *)opUser;
  780. /// 收到消息撤回(待废弃接口,请使用 onRecvMessageRevoked:operateUser:reason: 接口)
  781. - (void)onRecvMessageRevoked:(NSString *)msgID __attribute__((deprecated("use onRecvMessageRevoked:operateUser:reason: instead")));
  782. @end
  783. /////////////////////////////////////////////////////////////////////////////////
  784. // 消息内容详解
  785. /////////////////////////////////////////////////////////////////////////////////
  786. /// 高级消息
  787. V2TIM_EXPORT @interface V2TIMMessage : NSObject
  788. /// 消息 ID(消息创建的时候为 nil,消息发送的时候会生成)
  789. @property(nonatomic,strong,readonly) NSString *msgID;
  790. /// 消息的 UTC 时间戳
  791. @property(nonatomic,strong,readonly) NSDate *timestamp;
  792. /// 消息发送者
  793. @property(nonatomic,strong,readonly) NSString *sender;
  794. /// 消息发送者昵称
  795. @property(nonatomic,strong,readonly) NSString *nickName;
  796. /// 消息发送者好友备注
  797. @property(nonatomic,strong,readonly) NSString *friendRemark;
  798. /// 如果是群组消息,nameCard 为发送者的群名片
  799. @property(nonatomic,strong,readonly) NSString *nameCard;
  800. /// 消息发送者头像
  801. @property(nonatomic,strong,readonly) NSString *faceURL;
  802. /// 如果是群组消息,groupID 为会话群组 ID,否则为 nil
  803. @property(nonatomic,strong,readonly) NSString *groupID;
  804. /// 如果是单聊消息,userID 为会话用户 ID,否则为 nil,
  805. /// 假设自己和 userA 聊天,无论是自己发给 userA 的消息还是 userA 发给自己的消息,这里的 userID 均为 userA
  806. @property(nonatomic,strong,readonly) NSString *userID;
  807. /// 群聊中的消息序列号云端生成,在群里是严格递增且唯一的,
  808. /// 单聊中的序列号是本地生成,不能保证严格递增且唯一。
  809. @property(nonatomic,assign,readonly) uint64_t seq;
  810. /// 消息随机码
  811. @property(nonatomic,assign,readonly) uint64_t random;
  812. /// 消息发送状态
  813. @property(nonatomic,assign,readonly) V2TIMMessageStatus status;
  814. /// 消息发送者是否是自己
  815. @property(nonatomic,assign,readonly) BOOL isSelf;
  816. /// 消息自己是否已读
  817. @property(nonatomic,assign,readonly) BOOL isRead;
  818. /// 消息对方是否已读(只有 C2C 消息有效)
  819. /// 该字段为 YES 的条件是消息 timestamp <= 对端标记会话已读的时间
  820. @property(nonatomic,assign,readonly) BOOL isPeerRead;
  821. /// 消息是否需要已读回执
  822. /// @note
  823. /// <p> 群聊消息 6.1 及以上版本支持该特性,需要您先到 IM 控制台配置支持已读回执的群类型。
  824. /// <p> 单聊消息 6.2 及以上版本支持该特性。
  825. /// <p> 群聊消息和单聊消息都需要购买旗舰版套餐包。
  826. @property(nonatomic,assign) BOOL needReadReceipt;
  827. /// 是否支持消息扩展(6.7 及其以上版本支持,需要您购买旗舰版套餐)
  828. /// 直播群(AVChatRoom)消息不支持该功能。
  829. /// 您需要先到 IM 控制台配置该功能。
  830. @property(nonatomic,assign) BOOL supportMessageExtension;
  831. /// 是否是广播消息,仅直播群支持(6.5 及以上版本支持,需要您购买旗舰版套餐)
  832. @property(nonatomic,assign,readonly) BOOL isBroadcastMessage;
  833. /// 消息优先级(只有 onRecvNewMessage 收到的 V2TIMMessage 获取有效)
  834. @property(nonatomic,assign,readonly) V2TIMMessagePriority priority;
  835. /// 群消息中被 @ 的用户 UserID 列表(即该消息都 @ 了哪些人)
  836. @property(nonatomic,strong,readonly) NSMutableArray<NSString *> *groupAtUserList;
  837. /// 消息类型
  838. @property(nonatomic,assign,readonly) V2TIMElemType elemType;
  839. /// 消息类型 为 V2TIM_ELEM_TYPE_TEXT,textElem 会存储文本消息内容
  840. @property(nonatomic,strong,readonly) V2TIMTextElem *textElem;
  841. /// 消息类型 为 V2TIM_ELEM_TYPE_CUSTOM,customElem 会存储自定义消息内容
  842. @property(nonatomic,strong,readonly) V2TIMCustomElem *customElem;
  843. /// 消息类型 为 V2TIM_ELEM_TYPE_IMAGE,imageElem 会存储图片消息内容
  844. @property(nonatomic,strong,readonly) V2TIMImageElem *imageElem;
  845. /// 消息类型 为 V2TIM_ELEM_TYPE_SOUND,soundElem 会存储语音消息内容
  846. @property(nonatomic,strong,readonly) V2TIMSoundElem *soundElem;
  847. /// 消息类型 为 V2TIM_ELEM_TYPE_VIDEO,videoElem 会存储视频消息内容
  848. @property(nonatomic,strong,readonly) V2TIMVideoElem *videoElem;
  849. /// 消息类型 为 V2TIM_ELEM_TYPE_FILE,fileElem 会存储文件消息内容
  850. @property(nonatomic,strong,readonly) V2TIMFileElem *fileElem;
  851. /// 消息类型 为 V2TIM_ELEM_TYPE_LOCATION,locationElem 会存储地理位置消息内容
  852. @property(nonatomic,strong,readonly) V2TIMLocationElem *locationElem;
  853. /// 消息类型 为 V2TIM_ELEM_TYPE_FACE,faceElem 会存储表情消息内容
  854. @property(nonatomic,strong,readonly) V2TIMFaceElem *faceElem;
  855. /// 消息类型 为 V2TIM_ELEM_TYPE_MERGER,mergerElem 会存储转发消息内容
  856. @property(nonatomic,strong,readonly) V2TIMMergerElem *mergerElem;
  857. /// 消息类型 为 V2TIM_ELEM_TYPE_GROUP_TIPS,groupTipsElem 会存储群 tips 消息内容
  858. @property(nonatomic,strong,readonly) V2TIMGroupTipsElem *groupTipsElem;
  859. /// 消息自定义数据(本地保存,不会发送到对端,程序卸载重装后失效)
  860. @property(nonatomic,strong) NSData* localCustomData;
  861. /// 消息自定义数据,可以用来标记语音、视频消息是否已经播放(本地保存,不会发送到对端,程序卸载重装后失效)
  862. @property(nonatomic,assign) int localCustomInt;
  863. /// 消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到)
  864. @property(nonatomic,strong) NSData* cloudCustomData;
  865. /// 消息是否不计入会话未读数:默认为 NO,表明需要计入会话未读数,设置为 YES,表明不需要计入会话未读数
  866. /// <p> 5.3.425 及以上版本支持, 会议群(Meeting)默认不支持该字段
  867. @property(nonatomic,assign) BOOL isExcludedFromUnreadCount;
  868. /// 消息是否不计入会话 lastMsg:默认为 NO,表明需要计入会话 lastMsg,设置为 YES,表明不需要计入会话 lastMsg(5.4.666 及以上版本支持)
  869. @property(nonatomic,assign) BOOL isExcludedFromLastMessage;
  870. /// 消息是否不过内容审核(【云端审核】)(7.1 及以上版本支持)
  871. /// 只有在开通【云端审核】功能后,isExcludedFromContentModeration 设置才有效,设置为 YES,表明不过内容审核,设置为 NO:表明过内容审核。
  872. ///【云端审核】开通流程请参考 [云端审核功能](https://cloud.tencent.com/document/product/269/83795#.E4.BA.91.E7.AB.AF.E5.AE.A1.E6.A0.B8.E5.8A.9F.E8.83.BD)
  873. @property(nonatomic,assign) BOOL isExcludedFromContentModeration;
  874. /// 消息自定义审核配置 ID(从 7.8 版本开始支持)
  875. /// 在开通【云端审核】功能后,您可以请前往 [控制台](https://console.cloud.tencent.com/im) (云端审核 -> 审核配置 -> 自定义配置 -> 添加自定义配置) 获取配置 ID。
  876. ///【自定义审核】配置流程请参考 [云端审核功能](https://cloud.tencent.com/document/product/269/78633#a5efc9e8-a7ec-40e3-9b18-8ed1910f589c)
  877. /// @note 该字段需要发消息前设置,仅用于控制发消息时的消息审核策略,其值不会存储在漫游和本地。
  878. @property(nonatomic,strong) NSString *customModerationConfigurationID;
  879. /// 是否被标记为有安全风险的消息(从 7.4 版本开始支持)
  880. /// 暂时只支持语音和视频消息。
  881. /// 只有在开通【云端审核】功能后才生效,【云端审核】开通流程请参考 [云端审核功能](https://cloud.tencent.com/document/product/269/83795#.E4.BA.91.E7.AB.AF.E5.AE.A1.E6.A0.B8.E5.8A.9F.E8.83.BD)。
  882. /// 如果您发送的语音或视频消息内容不合规,云端异步审核后会触发 SDK 的 onRecvMessageModified 回调,回调里的 message 对象该字段值为 YES。
  883. @property(nonatomic,assign,readonly) BOOL hasRiskContent;
  884. /// 是否禁用消息发送前云端回调(从 8.1 版本开始支持)
  885. @property(nonatomic,assign) BOOL disableCloudMessagePreHook;
  886. /// 是否禁用消息发送后云端回调(从 8.1 版本开始支持)
  887. @property(nonatomic,assign) BOOL disableCloudMessagePostHook;
  888. /// 消息的离线推送信息
  889. @property(nonatomic,strong,readonly) V2TIMOfflinePushInfo *offlinePushInfo;
  890. /// 消息撤回者(从 7.4 版本开始支持)
  891. /// 仅当消息为撤回状态时有效
  892. @property(nonatomic,strong,readonly) V2TIMUserFullInfo *revokerInfo;
  893. /// 消息撤回原因 (从 7.4 版本开始支持)
  894. /// 仅当消息为撤回状态时有效
  895. @property(nonatomic,strong,readonly) NSString *revokeReason;
  896. /// 消息置顶者 (从 8.0 版本开始支持)
  897. /// 只有通过 GetPinnedGroupMessageList 获取到的置顶消息才包含该字段
  898. @property(nonatomic,strong,readonly) V2TIMGroupMemberFullInfo *pinnerInfo;
  899. @end
  900. /////////////////////////////////////////////////////////////////////////////////
  901. //
  902. // 消息元素基类
  903. //
  904. /////////////////////////////////////////////////////////////////////////////////
  905. /// 消息元素基类
  906. V2TIM_EXPORT @interface V2TIMElem : NSObject
  907. /// 获取下一个 Elem,如果您的消息有多个 Elem,可以通过当前 Elem 获取下一个 Elem 对象,如果返回值为 nil,表示 Elem 获取结束。
  908. /// 详细使用方法请参考文档 [消息收发](https://cloud.tencent.com/document/product/269/44490#4.-.E5.A6.82.E4.BD.95.E8.A7.A3.E6.9E.90.E5.A4.9A.E4.B8.AA-elem-.E7.9A.84.E6.B6.88.E6.81.AF.EF.BC.9F)
  909. - (V2TIMElem *)nextElem;
  910. /**
  911. * 添加下一个 elem 元素
  912. * <br>
  913. * 如果您的消息需要多个 elem,可以在创建 Message 对象后,通过 Message 的 Elem 对象添加下一个 elem 对象。
  914. * 以 V2TIMTextElem 和 V2TIMCustomElem 多 elem 为例,示例代码如下:
  915. * <pre>
  916. * V2TIMMessage *msg = [[V2TIMManager sharedInstance] createTextMessage:@"text"];
  917. * V2TIMCustomElem *customElem = [[V2TIMCustomElem alloc] init];
  918. * customElem.data = [@"自定义消息" dataUsingEncoding:NSUTF8StringEncoding];
  919. * [msg.textElem appendElem:customElem];
  920. * </pre>
  921. *
  922. * @note
  923. * 1.该接口只能由 createMessage 创建的 Message 对象里的 elem 元素调用。
  924. * 2.该接口仅支持添加 V2TIMTextElem、V2TIMCustomElem、V2TIMFaceElem 和 V2TIMLocationElem 四类元素。
  925. */
  926. - (void)appendElem:(V2TIMElem *)elem;
  927. @end
  928. /////////////////////////////////////////////////////////////////////////////////
  929. // 文本消息 Elem
  930. /////////////////////////////////////////////////////////////////////////////////
  931. /// 文本消息 Elem
  932. V2TIM_EXPORT @interface V2TIMTextElem : V2TIMElem
  933. /// 消息文本
  934. @property(nonatomic,strong) NSString * text;
  935. @end
  936. /////////////////////////////////////////////////////////////////////////////////
  937. // 自定义消息 Elem
  938. /////////////////////////////////////////////////////////////////////////////////
  939. /// 自定义消息 Elem
  940. V2TIM_EXPORT @interface V2TIMCustomElem : V2TIMElem
  941. /// 自定义消息二进制数据
  942. @property(nonatomic,strong) NSData * data;
  943. /// 自定义消息描述信息
  944. @property(nonatomic,strong) NSString * desc;
  945. /// 自定义消息扩展字段
  946. @property(nonatomic,strong) NSString * extension NS_SWIFT_NAME(ext);
  947. @end
  948. /////////////////////////////////////////////////////////////////////////////////
  949. // 图片消息 Elem
  950. /////////////////////////////////////////////////////////////////////////////////
  951. /// 图片消息Elem
  952. V2TIM_EXPORT @interface V2TIMImageElem : V2TIMElem
  953. /// 图片路径(只有发送方可以获取到)
  954. @property(nonatomic,strong,readonly) NSString * path;
  955. /// 接收图片消息的时候这个字段会保存图片的所有规格,目前最多包含三种规格:原图、大图、缩略图,每种规格保存在一个 TIMImage 对象中
  956. @property(nonatomic,strong,readonly) NSArray<V2TIMImage *> *imageList;
  957. @end
  958. /////////////////////////////////////////////////////////////////////////////////
  959. // 图片消息 Elem
  960. /////////////////////////////////////////////////////////////////////////////////
  961. /// 图片元素
  962. V2TIM_EXPORT @interface V2TIMImage : NSObject
  963. /// 图片 ID,内部标识,可用于外部缓存 key
  964. @property(nonatomic,strong,readonly) NSString * uuid;
  965. /// 图片类型
  966. @property(nonatomic,assign,readonly) V2TIMImageType type;
  967. /// 图片大小(type == V2TIM_IMAGE_TYPE_ORIGIN 有效)
  968. @property(nonatomic,assign,readonly) int size;
  969. /// 图片宽度
  970. @property(nonatomic,assign,readonly) int width;
  971. /// 图片高度
  972. @property(nonatomic,assign,readonly) int height;
  973. /// 图片 url
  974. @property(nonatomic,strong,readonly) NSString * url;
  975. /**
  976. * 下载图片
  977. *
  978. * 下载的数据需要由开发者缓存,IM SDK 每次调用 downloadImage 都会从服务端重新下载数据。建议通过图片的 uuid 作为 key 进行图片文件的存储。
  979. *
  980. * @param path 图片保存路径,需要外部指定
  981. */
  982. - (void)downloadImage:(NSString *)path progress:(V2TIMDownLoadProgress)progress succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  983. @end
  984. /////////////////////////////////////////////////////////////////////////////////
  985. // 语音消息 Elem
  986. /////////////////////////////////////////////////////////////////////////////////
  987. /// 语音消息 Elem
  988. V2TIM_EXPORT @interface V2TIMSoundElem : V2TIMElem
  989. /// 语音文件路径(只有发送方才能获取到)
  990. @property(nonatomic,strong,readonly) NSString * path;
  991. /// 语音消息内部 ID
  992. @property(nonatomic,strong,readonly) NSString * uuid;
  993. /// 语音数据大小
  994. @property(nonatomic,assign,readonly) int dataSize;
  995. /// 语音长度(秒)
  996. @property(nonatomic,assign,readonly) int duration;
  997. /// 获取语音的 URL 下载地址
  998. -(void)getUrl:(void (^)(NSString * url))urlCallBack;
  999. /**
  1000. * 下载语音
  1001. *
  1002. * downloadSound 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。
  1003. *
  1004. * @param path 语音保存路径,需要外部指定
  1005. */
  1006. - (void)downloadSound:(NSString*)path progress:(V2TIMDownLoadProgress)progress succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  1007. /**
  1008. * 将语音转成文字(7.4 及以上版本支持)
  1009. *
  1010. * @param language 识别的语言。
  1011. *
  1012. * @note
  1013. * - 语音转文字是增值付费功能,处于内测阶段,您可通过 [即时通信 IM 语音转文字插件交流群](https://zhiliao.qq.com/s/c5GY7HIM62CK/cPSYGIIM62CH) 联系我们为您开通体验完整功能。
  1014. */
  1015. - (void)convertVoiceToText:(NSString *)language completion:(void (^)(int code, NSString *desc, NSString *result))callback;
  1016. @end
  1017. /////////////////////////////////////////////////////////////////////////////////
  1018. // 视频消息 Elem
  1019. /////////////////////////////////////////////////////////////////////////////////
  1020. /// 视频消息 Elem
  1021. V2TIM_EXPORT @interface V2TIMVideoElem : V2TIMElem
  1022. /// 视频文件路径(只有发送方才能获取到)
  1023. @property(nonatomic,strong,readonly) NSString * videoPath;
  1024. /// 截图文件路径(只有发送方才能获取到)
  1025. @property(nonatomic,strong,readonly) NSString * snapshotPath;
  1026. /// 视频 ID,内部标识,可用于外部缓存 key
  1027. @property(nonatomic,strong,readonly) NSString * videoUUID;
  1028. /// 视频大小
  1029. @property(nonatomic,assign,readonly) int videoSize;
  1030. /// 视频类型
  1031. @property(nonatomic,strong,readonly) NSString *videoType;
  1032. /// 视频时长
  1033. @property(nonatomic,assign,readonly) int duration;
  1034. /// 截图 ID,内部标识,可用于外部缓存 key
  1035. @property(nonatomic,strong,readonly) NSString * snapshotUUID;
  1036. /// 截图 size
  1037. @property(nonatomic,assign,readonly) int snapshotSize;
  1038. /// 截图宽
  1039. @property(nonatomic,assign,readonly) int snapshotWidth;
  1040. /// 截图高
  1041. @property(nonatomic,assign,readonly) int snapshotHeight;
  1042. /// 获取视频的 URL 下载地址
  1043. -(void)getVideoUrl:(void (^)(NSString * url))urlCallBack;
  1044. /// 获取截图的 URL 下载地址
  1045. -(void)getSnapshotUrl:(void (^)(NSString * url))urlCallBack;
  1046. /**
  1047. * 下载视频
  1048. *
  1049. * downloadVideo 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。
  1050. *
  1051. * @param path 视频保存路径,需要外部指定
  1052. */
  1053. - (void)downloadVideo:(NSString*)path progress:(V2TIMDownLoadProgress)progress succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  1054. /**
  1055. * 下载视频截图
  1056. *
  1057. * downloadSnapshot 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。
  1058. *
  1059. * @param path 截图保存路径,需要外部指定
  1060. */
  1061. - (void)downloadSnapshot:(NSString*)path progress:(V2TIMDownLoadProgress)progress succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  1062. @end
  1063. /////////////////////////////////////////////////////////////////////////////////
  1064. // 文件消息 Elem
  1065. /////////////////////////////////////////////////////////////////////////////////
  1066. /// 文件消息 Elem
  1067. V2TIM_EXPORT @interface V2TIMFileElem : V2TIMElem
  1068. /// 文件路径(只有发送方才能获取到)
  1069. @property(nonatomic,strong,readonly) NSString * path;
  1070. /// 文件 ID,内部标识,可用于外部缓存 key
  1071. @property(nonatomic,strong,readonly) NSString * uuid;
  1072. /// 文件显示名称
  1073. @property(nonatomic,strong,readonly) NSString * filename;
  1074. /// 文件大小
  1075. @property(nonatomic,assign,readonly) int fileSize;
  1076. /// 获取文件的 URL 下载地址
  1077. -(void)getUrl:(void (^)(NSString * url))urlCallBack;
  1078. /**
  1079. * 下载文件
  1080. *
  1081. * downloadFile 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。
  1082. *
  1083. * @param path 文件保存路径,需要外部指定
  1084. */
  1085. - (void)downloadFile:(NSString*)path progress:(V2TIMDownLoadProgress)progress succ:(V2TIMSucc)succ fail:(V2TIMFail)fail;
  1086. @end
  1087. /////////////////////////////////////////////////////////////////////////////////
  1088. // 地理位置 Elem
  1089. /////////////////////////////////////////////////////////////////////////////////
  1090. /// 地理位置 Elem
  1091. V2TIM_EXPORT @interface V2TIMLocationElem : V2TIMElem
  1092. /// 地理位置描述信息
  1093. @property(nonatomic,strong) NSString * desc;
  1094. /// 经度,发送消息时设置
  1095. @property(nonatomic,assign) double longitude;
  1096. /// 纬度,发送消息时设置
  1097. @property(nonatomic,assign) double latitude;
  1098. @end
  1099. /////////////////////////////////////////////////////////////////////////////////
  1100. // 表情消息 Elem
  1101. /////////////////////////////////////////////////////////////////////////////////
  1102. /// 表情消息 Elem
  1103. V2TIM_EXPORT @interface V2TIMFaceElem : V2TIMElem
  1104. /**
  1105. * 表情索引,用户自定义
  1106. * 1. 表情消息由 TIMFaceElem 定义,SDK 并不提供表情包,如果开发者有表情包,可使用 index 存储表情在表情包中的索引,由用户自定义,或者直接使用 data 存储表情二进制信息以及字符串 key,都由用户自定义,SDK 内部只做透传。
  1107. * 2. index 和 data 只需要传入一个即可,ImSDK 只是透传这两个数据。
  1108. */
  1109. @property(nonatomic,assign) int index;
  1110. /// 额外数据,用户自定义
  1111. @property(nonatomic,strong) NSData * data;
  1112. @end
  1113. /////////////////////////////////////////////////////////////////////////////////
  1114. // 合并消息 Elem
  1115. /////////////////////////////////////////////////////////////////////////////////
  1116. /// 合并消息 Elem
  1117. V2TIM_EXPORT @interface V2TIMMergerElem : V2TIMElem
  1118. /// 合并消息里面又包含合并消息我们称之为合并嵌套,合并嵌套层数不能超过 100 层,如果超过限制,layersOverLimit 会返回 YES,title 和 abstractList 会返回 nil,downloadMergerMessage 会返回 ERR_MERGER_MSG_LAYERS_OVER_LIMIT 错误码。
  1119. @property(nonatomic,assign,readonly) BOOL layersOverLimit;
  1120. /// 合并消息 title
  1121. @property(nonatomic,strong,readonly) NSString *title;
  1122. /// 合并消息摘要列表
  1123. @property(nonatomic,strong,readonly) NSArray<NSString *> *abstractList;
  1124. /// 下载被合并的消息列表
  1125. - (void)downloadMergerMessage:(V2TIMMessageListSucc)succ fail:(V2TIMFail)fail;
  1126. @end
  1127. /////////////////////////////////////////////////////////////////////////////////
  1128. // 群 Tips 消息 Elem
  1129. /////////////////////////////////////////////////////////////////////////////////
  1130. /// 群 tips 消息会存消息列表,群里所有的人都会展示,比如 xxx 进群,xxx 退群,xxx 群资料被修改了等
  1131. V2TIM_EXPORT @interface V2TIMGroupTipsElem : V2TIMElem
  1132. /// 群组 ID
  1133. @property(nonatomic,strong,readonly) NSString * groupID;
  1134. /// 群Tips类型
  1135. @property(nonatomic,assign,readonly) V2TIMGroupTipsType type;
  1136. /// 操作者群成员资料
  1137. @property(nonatomic,strong,readonly) V2TIMGroupMemberInfo * opMember;
  1138. /// 被操作人列表
  1139. @property(nonatomic,strong,readonly) NSArray<V2TIMGroupMemberInfo *> * memberList;
  1140. /// 群信息变更(type = V2TIM_GROUP_TIPS_TYPE_INFO_CHANGE 时有效)
  1141. @property(nonatomic,strong,readonly) NSArray<V2TIMGroupChangeInfo *> * groupChangeInfoList;
  1142. /// 成员变更(type = V2TIM_GROUP_TIPS_TYPE_MEMBER_INFO_CHANGE 时有效)
  1143. @property(nonatomic,strong,readonly) NSArray<V2TIMGroupMemberChangeInfo *> * memberChangeInfoList;
  1144. /// 当前群人数(type = V2TIM_GROUP_TIPS_TYPE_INVITE、TIM_GROUP_TIPS_TYPE_QUIT_GRP、TIM_GROUP_TIPS_TYPE_KICKED 时有效)
  1145. @property(nonatomic,assign,readonly) uint32_t memberCount;
  1146. @end
  1147. /// 群 tips,群变更信息
  1148. V2TIM_EXPORT @interface V2TIMGroupChangeInfo : NSObject
  1149. /// 变更类型
  1150. @property(nonatomic,assign,readonly) V2TIMGroupInfoChangeType type;
  1151. /// 根据变更类型表示不同的值,例如 type = V2TIM_GROUP_INFO_CHANGE_TYPE_NAME,value 表示群新的 groupName
  1152. @property(nonatomic,strong,readonly) NSString * value;
  1153. /// 变更自定义字段的 key 值(type = V2TIM_GROUP_INFO_CHANGE_TYPE_CUSTOM 生效)
  1154. /// 因为历史遗留原因,如果只修改了群自定义字段,当前消息不会存漫游和 DB
  1155. @property(nonatomic,strong,readonly) NSString * key;
  1156. /// 根据变更类型表示不同的值,当 type = V2TIM_GROUP_INFO_CHANGE_TYPE_SHUT_UP_ALL 或者 V2TIM_GROUP_INFO_CHANGE_TYPE_ENABLE_PERMISSION_GROUP 时有效
  1157. @property(nonatomic,assign,readonly) BOOL boolValue;
  1158. /// 根据变更类型表示不同的值
  1159. /// @note 仅针对以下类型有效:
  1160. /// - 从 6.5 版本开始,当 type 为 V2TIM_GROUP_INFO_CHANGE_TYPE_RECEIVE_MESSAGE_OPT 时,该字段标识了群消息接收选项发生了变化,其取值详见 @V2TIMReceiveMessageOpt;
  1161. /// - 从 6.5 版本开始,当 type 为 V2TIM_GROUP_INFO_CHANGE_TYPE_GROUP_ADD_OPT 时,该字段标识了申请加群审批选项发生了变化,其取值详见 @V2TIMGroupAddOpt;
  1162. /// - 从 7.1 版本开始,当 type 为 V2TIM_GROUP_INFO_CHANGE_TYPE_GROUP_APPROVE_OPT 时,该字段标识了邀请进群审批选项发生了变化,取值类型详见 @V2TIMGroupAddOpt。
  1163. @property(nonatomic,assign,readonly) uint32_t intValue;
  1164. /// 根据变更类型表示不同的值,当前只有 type = V2TIM_GROUP_INFO_CHANGE_TYPE_GROUP_PERMISSION 时有效
  1165. @property(nonatomic,assign,readonly) uint64_t uint64Value;
  1166. @end
  1167. ///群tips,成员变更信息
  1168. V2TIM_EXPORT @interface V2TIMGroupMemberChangeInfo : NSObject
  1169. /// 变更用户
  1170. @property(nonatomic,strong,readonly) NSString * userID;
  1171. /// 禁言时间(秒,表示还剩多少秒可以发言)
  1172. @property(nonatomic,assign,readonly) uint32_t muteTime;
  1173. @end
  1174. /////////////////////////////////////////////////////////////////////////////////
  1175. // 消息已读回执
  1176. /////////////////////////////////////////////////////////////////////////////////
  1177. //
  1178. /// 消息已读回执
  1179. V2TIM_EXPORT @interface V2TIMMessageReceipt : NSObject
  1180. /// 消息 ID
  1181. @property(nonatomic,strong,readonly) NSString * msgID;
  1182. /// C2C 消息接收对象
  1183. @property(nonatomic,strong,readonly) NSString * userID;
  1184. /// C2C 对端消息是否已读
  1185. @property(nonatomic,assign,readonly) BOOL isPeerRead;
  1186. /// C2C 对端已读的时间
  1187. /// 如果 msgID 为空,该字段表示对端用户标记会话已读的时间
  1188. /// 如果 msgID 不为空,该字段表示对端用户发送消息已读回执的时间(8.1 及以上版本支持)
  1189. @property(nonatomic,assign,readonly) time_t timestamp;
  1190. /// 群 ID
  1191. @property(nonatomic,strong,readonly) NSString * groupID;
  1192. /// 群消息已读人数
  1193. @property(nonatomic,assign,readonly) int readCount;
  1194. /// 群消息未读人数
  1195. @property(nonatomic,assign,readonly) int unreadCount;
  1196. @end
  1197. /////////////////////////////////////////////////////////////////////////////////
  1198. // 消息扩展
  1199. /////////////////////////////////////////////////////////////////////////////////
  1200. //
  1201. /// 消息扩展信息
  1202. V2TIM_EXPORT @interface V2TIMMessageExtension : NSObject
  1203. /// 消息扩展信息 key
  1204. @property(nonatomic, strong) NSString *extensionKey;
  1205. /// 消息扩展信息 value
  1206. @property(nonatomic, strong) NSString *extensionValue;
  1207. @end
  1208. /// 消息扩展操作结果
  1209. V2TIM_EXPORT @interface V2TIMMessageExtensionResult : NSObject
  1210. /// 返回码
  1211. @property(nonatomic,assign,readonly) int32_t resultCode;
  1212. /// 返回信息
  1213. @property(nonatomic,strong,readonly) NSString *resultInfo;
  1214. /// 扩展信息
  1215. @property(nonatomic,strong,readonly) V2TIMMessageExtension *extension NS_SWIFT_NAME(ext);
  1216. @end
  1217. /////////////////////////////////////////////////////////////////////////////////
  1218. // 消息回应
  1219. /////////////////////////////////////////////////////////////////////////////////
  1220. /// 消息回应信息
  1221. V2TIM_EXPORT @interface V2TIMMessageReaction : NSObject
  1222. /// 消息回应 ID
  1223. @property(nonatomic,strong,readonly) NSString *reactionID;
  1224. /// 使用同一个 reactionID 回应消息的总的用户个数
  1225. @property(nonatomic,assign,readonly) uint32_t totalUserCount;
  1226. /// 使用同一个 reactionID 回应消息的部分用户列表(用户列表数量取决于调用 getMessageReactions 接口时设置的 maxUserCountPerReaction 值)
  1227. @property(nonatomic,strong,readonly) NSArray<V2TIMUserInfo *> * partialUserList;
  1228. /// 自己是否使用了该 reaction
  1229. @property(nonatomic,assign,readonly) BOOL reactedByMyself;
  1230. @end
  1231. /// 批量拉取消息回应结果
  1232. V2TIM_EXPORT @interface V2TIMMessageReactionResult : NSObject
  1233. /// 返回码
  1234. @property(nonatomic,assign,readonly) int32_t resultCode;
  1235. /// 返回信息
  1236. @property(nonatomic,strong,readonly) NSString *resultInfo;
  1237. /// 消息 ID
  1238. @property(nonatomic,strong,readonly) NSString *msgID;
  1239. /// 消息回应列表
  1240. @property(nonatomic,strong,readonly) NSArray<V2TIMMessageReaction *> *reactionList;
  1241. @end
  1242. /// 消息回应变更信息
  1243. V2TIM_EXPORT @interface V2TIMMessageReactionChangeInfo : NSObject
  1244. /// 消息 ID
  1245. @property(nonatomic,strong,readonly) NSString *msgID;
  1246. /// 消息回应变更列表
  1247. @property(nonatomic,strong,readonly) NSArray<V2TIMMessageReaction *> *reactionList;
  1248. @end
  1249. /////////////////////////////////////////////////////////////////////////////////
  1250. // 苹果 APNS 离线推送
  1251. /////////////////////////////////////////////////////////////////////////////////
  1252. //
  1253. /// 接收到离线推送时不会播放声音
  1254. V2TIM_EXTERN NSString * const kIOSOfflinePushNoSound;
  1255. /// 接收到离线推送时播放系统声音
  1256. V2TIM_EXTERN NSString * const kIOSOfflinePushDefaultSound;
  1257. /// 自定义消息 push。
  1258. V2TIM_EXPORT @interface V2TIMOfflinePushInfo : NSObject
  1259. /// 离线推送展示的标题。
  1260. @property(nonatomic,strong) NSString * title;
  1261. /// 离线推送展示的内容。
  1262. /// 自定义消息进行离线推送,必须设置此字段内容。
  1263. @property(nonatomic,strong) NSString * desc;
  1264. /// 离线推送扩展字段,
  1265. /// iOS: 收到离线推送的一方可以在 UIApplicationDelegate -> didReceiveRemoteNotification -> userInfo 拿到这个字段,用这个字段可以做 UI 跳转逻辑
  1266. @property(nonatomic,strong) NSString * ext;
  1267. /// 是否关闭推送(默认开启推送)。
  1268. @property(nonatomic,assign) BOOL disablePush;
  1269. /// iOS 离线推送的类型(仅对 iOS 生效)
  1270. /// 默认值是 V2TIM_IOS_OFFLINE_PUSH_TYPE_APNS
  1271. @property(nonatomic,assign) V2TIMIOSOfflinePushType iOSPushType;
  1272. /// 离线推送忽略 badge 计数(仅对 iOS 生效),
  1273. /// 如果设置为 YES,在 iOS 接收端,这条消息不会使 APP 的应用图标未读计数增加。
  1274. @property(nonatomic,assign) BOOL ignoreIOSBadge;
  1275. /// 离线推送声音设置(仅对 iOS 生效),
  1276. /// 当 iOSSound = kIOSOfflinePushNoSound,表示接收时不会播放声音。
  1277. /// 当 iOSSound = kIOSOfflinePushDefaultSound,表示接收时播放系统声音。
  1278. /// 如果要自定义 iOSSound,需要先把语音文件链接进 Xcode 工程,然后把语音文件名(带后缀)设置给 iOSSound。
  1279. @property(nonatomic,strong) NSString * iOSSound;
  1280. /// iOS 离线推送的通知级别 (iOS 15 及以上支持)
  1281. /// "passive",不会发出声音、振动或横幅提示,只会静默地出现在通知中心。适用于不紧急的信息,例如应用内的社交活动更新或推荐内容。
  1282. /// "active", 会发出声音或振动,并显示横幅提示。适用于一般的重要通知,例如消息提醒、日历事件等。(默认类型)
  1283. /// "time-sensitive",会发出声音或振动,并显示横幅提示,这种级别的通知会打扰用户,即使用户启用了“专注模式”(Focus Mode)。适用于需要用户立即关注的紧急通知,例如安全警报、重要的时间提醒等。打开需要在苹果开发者平台和 xcode 项目中增加相应的配置。
  1284. /// "critical", 会发出声音或振动,并显示横幅提示。这种级别的通知会打扰用户,即使设备处于静音模式。适用于极其重要的紧急通知,例如公共安全警报、严重的健康警告等。打开需要向 Apple 特殊申请。
  1285. @property(nonatomic,strong) NSString * iOSInterruptionLevel;
  1286. /// 设置 iOS 后台透传消息
  1287. /// 设置打开后,离线接收会唤起应用并透传消息内容 ext
  1288. @property(nonatomic,assign) BOOL enableIOSBackgroundNotification;
  1289. /// 离线推送声音设置(仅对 Android 生效, 仅 imsdk 6.1 及以上版本支持)
  1290. /// 只有华为和谷歌手机支持设置铃音提示,小米铃音设置请您参照:https://dev.mi.com/console/doc/detail?pId=1278%23_3_0
  1291. /// 另外,谷歌手机 FCM 推送在 Android 8.0 及以上系统设置声音提示,需要在 channel 通道配置,请参照接口 AndroidFCMChannelID
  1292. /// AndroidSound: Android 工程里 raw 目录中的铃声文件名,不需要后缀名。
  1293. @property(nonatomic,strong) NSString * AndroidSound;
  1294. /// 离线推送设置 OPPO 手机推送的 ChannelID, 仅支持 8.0 系统及以上。(应用配置接入 OPPO 推送的必须要设置)
  1295. @property(nonatomic,strong) NSString * AndroidOPPOChannelID;
  1296. /// 离线推送设置 Google FCM 手机推送的 ChannelID, 仅支持 8.0 系统及以上。
  1297. @property(nonatomic,strong) NSString * AndroidFCMChannelID;
  1298. /// 离线推送设置小米手机推送的 ChannelID, 仅支持 8.0 系统及以上。
  1299. @property(nonatomic,strong) NSString *AndroidXiaoMiChannelID;
  1300. /// 离线推送设置 VIVO 推送消息分类 (待废弃接口,VIVO 推送服务于 2023 年 4 月 3 日优化消息分类规则,推荐使用 AndroidVIVOCategory 设置消息类别)
  1301. /// VIVO 手机离线推送消息分类,0:运营消息,1:系统消息。默认取值为 1 。
  1302. @property(nonatomic,assign) NSInteger AndroidVIVOClassification;
  1303. /// 离线推送设置 VIVO 推送消息类别,详见:https://dev.vivo.com.cn/documentCenter/doc/359。(VIVO 推送服务于 2023 年 4 月 3 日优化消息分类规则,推荐使用 AndroidVIVOCategory 设置消息类别,不需要再关注和设置 AndroidVIVOClassification)
  1304. @property(nonatomic,strong) NSString *AndroidVIVOCategory;
  1305. /// 离线推送设置华为推送消息分类,详见:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/message-classification-0000001149358835
  1306. @property(nonatomic,strong) NSString *AndroidHuaWeiCategory;
  1307. /// 离线推送设置 OPPO 推送消息分类,详见:https://open.oppomobile.com/new/developmentDoc/info?id=13189
  1308. /// 通讯与服务类型有:"IM","ACCOUNT"等;内容与营销类型有:"NEWS","CONTENT"等
  1309. @property(nonatomic,strong) NSString *AndroidOPPOCategory;
  1310. /// 离线推送设置 OPPO 推送通知栏消息提醒等级,详见:https://open.oppomobile.com/new/developmentDoc/info?id=13189
  1311. /// 使用生效前,需要先设置 AndroidOPPOCategory 指定 category 为 IM 类消息。消息提醒等级有:1,通知栏;2,通知栏 + 锁屏 (默认);16,通知栏 + 锁屏 + 横幅 + 震动 + 铃声;
  1312. @property(nonatomic,assign) NSInteger AndroidOPPONotifyLevel;
  1313. /// 离线推送设置 Honor 推送消息分类,详见:https://developer.honor.com/cn/docs/11002/guides/notification-class
  1314. /// Honor 推送消息分类: "NORMAL", 表示消息为服务通讯类; "LOW", 表示消息为资讯营销类
  1315. @property(nonatomic,strong) NSString *AndroidHonorImportance;
  1316. /// 设置华为设备离线推送的通知图片, url 使用的协议必须是 HTTPS 协议,取值样例:https://example.com/image.png
  1317. /// 图片文件须小于 512KB,规格建议为 40dp x 40dp,弧角大小为 8dp。超出建议规格的图片会存在图片压缩或图片显示不全的情况。图片格式建议使用 JPG/JPEG/PNG。
  1318. @property(nonatomic,strong) NSString *AndroidHuaWeiImage;
  1319. /// 设置荣耀设备离线推送的通知图片, url 使用的协议必须是 HTTPS 协议,取值样例:https://example.com/image.png
  1320. /// 图标文件大小须小于 100KB,图标建议规格大小:160px x 160px,弧角大小为 32px,超出规格大小的图标会存在图片压缩或显示不全的情况。
  1321. @property(nonatomic,strong) NSString *AndroidHonorImage;
  1322. /// 设置 Google FCM 设备离线推送的通知图片,未展开消息时显示为大图标,展开消息后展示为大图片. url 使用的协议必须是 HTTPS 协议,取值样例:https://example.com/image.png
  1323. /// 图标文件大小须小于 1 MB,超出规格大小的图标会存在图片压缩或显示不全的情况。
  1324. @property(nonatomic,strong) NSString *AndroidFCMImage;
  1325. /// 设置 APNs 离线推送的通知图片, 借助 iOS 10 Service Extension 特性,可以下载并展示在弹窗上.iOSImage 使用的协议必须是 HTTPS 协议,取值样例:https://example.com/image.png
  1326. /// 限制说明:
  1327. /// - 图片:支持 JPEG、GIF、PNG,大小不超过 10 MB
  1328. /// 使用说明:
  1329. /// - 需要在 IM 控制台打开 mutable-content 属性,支持 iOS 10 Service Extension 特性
  1330. /// - 获取 iOSImage 资源的 key 值是 "image"
  1331. @property(nonatomic,strong) NSString *iOSImage;
  1332. /// 设置鸿蒙设备离线推送的通知图片,URL使用的协议必须是HTTPS协议,取值样例:https://example.com/image.png。
  1333. /// 支持图片格式为png、jpg、jpeg、heif、gif、bmp,图片长*宽 < 25000像素。
  1334. @property(nonatomic,strong) NSString *HarmonyImage;
  1335. /// 设置鸿蒙设备离线推送通知消息类别,详见:https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/message-classification-0000001149358835
  1336. @property(nonatomic,strong) NSString *HarmonyCategory;
  1337. /// 离线推送忽略 badge 计数(仅对 Harmony 生效),
  1338. /// 如果设置为 YES,在 Harmony 接收端,这条消息不会使 APP 的应用图标未读计数增加。
  1339. @property(nonatomic,assign) BOOL ignoreHarmonyBadge;
  1340. @end
  1341. /////////////////////////////////////////////////////////////////////////////////
  1342. //
  1343. // 用户消息接收选项
  1344. //
  1345. /////////////////////////////////////////////////////////////////////////////////
  1346. V2TIM_EXPORT @interface V2TIMReceiveMessageOptInfo : NSObject
  1347. /// 用户 ID
  1348. @property(nonatomic,strong) NSString *userID;
  1349. /// 获取消息免打扰开始时间:小时
  1350. @property(nonatomic,assign) NSInteger startHour;
  1351. /// 获取消息免打扰开始时间:分钟
  1352. @property(nonatomic,assign) NSInteger startMinute;
  1353. /// 获取消息免打扰开始时间:秒
  1354. @property(nonatomic,assign) NSInteger startSecond;
  1355. /**
  1356. * 获取消息免打扰开始的 UTC 时间戳
  1357. * @note
  1358. * - 如果返回的 startTimeStamp 大于 0,您可以直接使用
  1359. * - 如果返回的 startTimeStamp 等于 0,您需要调用 getStartHour()、getStartMinute()、getStartSecond() 来获取免打扰的相对开始时间
  1360. */
  1361. @property(nonatomic,assign) NSInteger startTimeStamp;
  1362. /// 获取免打扰持续时长,单位:秒
  1363. @property(nonatomic,assign) NSInteger duration;
  1364. /// 消息接收选项
  1365. @property(nonatomic,assign) V2TIMReceiveMessageOpt receiveOpt;
  1366. @end
  1367. /////////////////////////////////////////////////////////////////////////////////
  1368. // 消息搜索
  1369. /////////////////////////////////////////////////////////////////////////////////
  1370. /// 消息搜索参数
  1371. V2TIM_EXPORT @interface V2TIMMessageSearchParam : NSObject
  1372. /**
  1373. * 关键字列表,最多支持5个。当消息发送者以及消息类型均未指定时,关键字列表必须非空;否则,关键字列表可以为空。
  1374. */
  1375. @property(nonatomic,strong) NSArray<NSString *> * keywordList;
  1376. /**
  1377. * 指定关键字列表匹配类型,可设置为“或”关系搜索或者“与”关系搜索.
  1378. * 取值分别为 V2TIM_KEYWORD_LIST_MATCH_TYPE_OR 和 V2TIM_KEYWORD_LIST_MATCH_TYPE_AND,默认为“或”关系搜索。
  1379. */
  1380. @property(nonatomic,assign) V2TIMKeywordListMatchType keywordListMatchType;
  1381. /**
  1382. * 指定 userID 发送的消息,最多支持5个。
  1383. */
  1384. @property(nonatomic,strong) NSArray<NSString *> *senderUserIDList;
  1385. /// 指定搜索的消息类型集合,传 nil 表示搜索支持的全部类型消息(V2TIMFaceElem 和 V2TIMGroupTipsElem 不支持)取值详见 @V2TIMElemType。
  1386. @property(nonatomic,strong) NSArray<NSNumber *> * messageTypeList;
  1387. /**
  1388. * 搜索“全部会话”还是搜索“指定的会话”:
  1389. * <p> 如果设置 conversationID == nil,代表搜索全部会话。
  1390. * <p> 如果设置 conversationID != nil,代表搜索指定会话。会话唯一 ID, C2C 单聊组成方式:[NSString stringWithFormat:@"c2c_%@",userID];群聊组成方式为 [NSString stringWithFormat:@"group_%@",groupID]
  1391. */
  1392. @property(nonatomic,strong) NSString *conversationID;
  1393. /// 搜索的起始时间点。默认为0即代表从现在开始搜索。UTC 时间戳,单位:秒
  1394. @property(nonatomic,assign) NSUInteger searchTimePosition;
  1395. /// 从起始时间点开始的过去时间范围,单位秒。默认为0即代表不限制时间范围,传24x60x60代表过去一天。
  1396. @property(nonatomic,assign) NSUInteger searchTimePeriod;
  1397. /**
  1398. * 分页的页号:用于分页展示查找结果,从零开始起步。
  1399. * 比如:您希望每页展示 10 条结果,请按照如下规则调用:
  1400. * - 首次调用:通过参数 pageSize = 10, pageIndex = 0 调用 searchLocalMessage,从结果回调中的 totalCount 可以获知总共有多少条结果。
  1401. * - 计算页数:可以获知总页数:totalPage = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize + 1) 。
  1402. * - 再次调用:可以通过指定参数 pageIndex (pageIndex < totalPage)返回后续页号的结果。
  1403. *
  1404. * @note 仅对接口 searchLocalMessages 生效
  1405. */
  1406. @property(nonatomic,assign) NSUInteger pageIndex;
  1407. /**
  1408. * 每页结果数量:用于分页展示查找结果,如不希望分页可将其设置成 0,但如果结果太多,可能会带来性能问题。
  1409. * @note 仅对接口 searchLocalMessages 生效
  1410. */
  1411. @property(nonatomic,assign) NSUInteger pageSize;
  1412. /**
  1413. * 每次云端搜索返回结果的条数。
  1414. * @note 仅对接口 searchCloudMessages 生效
  1415. */
  1416. @property(nonatomic,assign) NSUInteger searchCount;
  1417. /**
  1418. * 每次云端搜索的起始位置。第一次填空字符串,续拉时填写 V2TIMMessageSearchResult 中的返回值。
  1419. * @note 仅对接口 searchCloudMessages 生效
  1420. */
  1421. @property(nonatomic,strong) NSString *searchCursor;
  1422. @end
  1423. V2TIM_EXPORT @interface V2TIMMessageSearchResultItem : NSObject
  1424. /// 会话ID
  1425. @property(nonatomic,copy) NSString *conversationID;
  1426. /// 当前会话一共搜索到了多少条符合要求的消息
  1427. @property(nonatomic,assign) NSUInteger messageCount;
  1428. /**
  1429. * 满足搜索条件的消息列表
  1430. * <p>如果您本次搜索【指定会话】,那么 messageList 中装载的是本会话中所有满足搜索条件的消息列表。
  1431. * <p>如果您本次搜索【全部会话】,那么 messageList 中装载的消息条数会有如下两种可能:
  1432. * - 如果某个会话中匹配到的消息条数 > 1,则 messageList 为空,您可以在 UI 上显示“ messageCount 条相关记录”。
  1433. * - 如果某个会话中匹配到的消息条数 = 1,则 messageList 为匹配到的那条消息,您可以在 UI 上显示之,并高亮匹配关键词。
  1434. */
  1435. @property(nonatomic,strong) NSArray<V2TIMMessage *> *messageList;
  1436. @end
  1437. V2TIM_EXPORT @interface V2TIMMessageSearchResult : NSObject
  1438. /**
  1439. * 如果您本次搜索【指定会话】,那么返回满足搜索条件的消息总数量;
  1440. * 如果您本次搜索【全部会话】,那么返回满足搜索条件的消息所在的所有会话总数量。
  1441. */
  1442. @property(nonatomic,assign) NSUInteger totalCount;
  1443. /**
  1444. * 如果您本次搜索【指定会话】,那么返回结果列表只包含该会话结果;
  1445. * 如果您本次搜索【全部会话】,那么对满足搜索条件的消息根据会话 ID 分组,分页返回分组结果;
  1446. */
  1447. @property(nonatomic,strong) NSArray<V2TIMMessageSearchResultItem *> *messageSearchResultItems;
  1448. /**
  1449. * 下一次云端搜索的起始位置。
  1450. */
  1451. @property(nonatomic,strong) NSString *searchCursor;
  1452. @end
  1453. /////////////////////////////////////////////////////////////////////////////////
  1454. // 消息拉取
  1455. /////////////////////////////////////////////////////////////////////////////////
  1456. V2TIM_EXPORT @interface V2TIMMessageListGetOption : NSObject
  1457. /**
  1458. * 拉取消息类型,可以设置拉取本地、云端更老或者更新的消息
  1459. *
  1460. * @note
  1461. * <p>当设置从云端拉取时,会将本地存储消息列表与云端存储消息列表合并后返回。如果无网络,则直接返回本地消息列表。
  1462. * <p>关于 getType、拉取消息的起始消息、拉取消息的时间范围 的使用说明:
  1463. * - getType 可以用来表示拉取的方向:往消息时间更老的方向 或者 往消息时间更新的方向;
  1464. * - lastMsg/lastMsgSeq 用来表示拉取时的起点,第一次拉取时可以不填或者填 0;
  1465. * - getTimeBegin/getTimePeriod 用来表示拉取消息的时间范围,时间范围的起止时间点与拉取方向(getType)有关;
  1466. * - 当起始消息和时间范围都存在时,结果集可理解成:「单独按起始消息拉取的结果」与「单独按时间范围拉取的结果」 取交集;
  1467. * - 当起始消息和时间范围都不存在时,结果集可理解成:从当前会话最新的一条消息开始,按照 getType 所指定的方向和拉取方式拉取。
  1468. */
  1469. @property(nonatomic,assign) V2TIMMessageGetType getType;
  1470. /// 拉取单聊历史消息
  1471. @property(nonatomic,strong) NSString *userID;
  1472. /// 拉取群组历史消息
  1473. @property(nonatomic,strong) NSString *groupID;
  1474. /// 拉取消息数量
  1475. @property(nonatomic,assign) NSUInteger count;
  1476. /// 拉取的消息类型集合,getType 为 V2TIM_GET_LOCAL_OLDER_MSG 和 V2TIM_GET_LOCAL_NEWER_MSG 有效,传 nil 表示拉取全部类型消息,取值详见 @V2TIMElemType。
  1477. @property(nonatomic,strong) NSArray<NSNumber *> * messageTypeList;
  1478. /**
  1479. * 拉取消息的起始消息
  1480. *
  1481. * @note
  1482. * <p>拉取 C2C 消息,只能使用 lastMsg 作为消息的拉取起点;如果没有指定 lastMsg,默认使用会话的最新消息作为拉取起点。
  1483. * <p>拉取 Group 消息时,除了可以使用 lastMsg 作为消息的拉取起点外,也可以使用 lastMsgSeq 来指定消息的拉取起点,二者的区别在于:
  1484. * - 使用 lastMsg 作为消息的拉取起点时,返回的消息列表里不包含当前设置的 lastMsg;
  1485. * - 使用 lastMsgSeq 作为消息拉取起点时,返回的消息列表里包含当前设置的 lastMsgSeq 所表示的消息。
  1486. *
  1487. * @note 在拉取 Group 消息时,
  1488. * <p>如果同时指定了 lastMsg 和 lastMsgSeq,SDK 优先使用 lastMsg 作为消息的拉取起点。
  1489. * <p>如果 lastMsg 和 lastMsgSeq 都未指定,消息的拉取起点分为如下两种情况:
  1490. * - 如果设置了拉取的时间范围,SDK 会根据 @getTimeBegin 所描述的时间点作为拉取起点;
  1491. * - 如果未设置拉取的时间范围,SDK 默认使用会话的最新消息作为拉取起点。
  1492. */
  1493. @property(nonatomic,strong) V2TIMMessage *lastMsg;
  1494. @property(nonatomic,assign) NSUInteger lastMsgSeq;
  1495. /**
  1496. * 拉取消息的时间范围
  1497. * @getTimeBegin 表示时间范围的起点;默认为 0,表示从现在开始拉取;UTC 时间戳,单位:秒
  1498. * @getTimePeriod 表示时间范围的长度;默认为 0,表示不限制时间范围;单位:秒
  1499. *
  1500. * @note
  1501. * <p> 时间范围的方向由参数 getType 决定
  1502. * <p> 如果 getType 取 V2TIM_GET_CLOUD_OLDER_MSG/V2TIM_GET_LOCAL_OLDER_MSG,表示从 getTimeBegin 开始,过去的一段时间,时间长度由 getTimePeriod 决定
  1503. * <p> 如果 getType 取 V2TIM_GET_CLOUD_NEWER_MSG/V2TIM_GET_LOCAL_NEWER_MSG,表示从 getTimeBegin 开始,未来的一段时间,时间长度由 getTimePeriod 决定
  1504. * <p> 取值范围区间为闭区间,包含起止时间,二者关系如下:
  1505. * - 如果 getType 指定了朝消息时间更老的方向拉取,则时间范围表示为 [getTimeBegin-getTimePeriod, getTimeBegin]
  1506. * - 如果 getType 指定了朝消息时间更新的方向拉取,则时间范围表示为 [getTimeBegin, getTimeBegin+getTimePeriod]
  1507. */
  1508. @property(nonatomic,assign) NSUInteger getTimeBegin;
  1509. @property(nonatomic,assign) NSUInteger getTimePeriod;
  1510. /**
  1511. * 拉取群组历史消息时,支持按照消息序列号 seq 拉取(从 7.1 版本开始有效)
  1512. *
  1513. * @note
  1514. * - 仅拉取群组历史消息时有效;
  1515. * - 消息序列号 seq 可以通过 V2TIMMessage 对象的 seq 字段获取;
  1516. * - 当 getType 设置为从云端拉取时,会将本地存储消息列表与云端存储消息列表合并后返回;如果无网络,则直接返回本地消息列表;
  1517. * - 当 getType 设置为从本地拉取时,直接返回本地的消息列表;
  1518. * - 当 getType 设置为拉取更旧的消息时,消息列表按照时间逆序,也即消息按照时间戳从大往小的顺序排序;
  1519. * - 当 getType 设置为拉取更新的消息时,消息列表按照时间顺序,也即消息按照时间戳从小往大的顺序排序。
  1520. */
  1521. @property(nonatomic,strong) NSArray<NSNumber *> *messageSeqList;
  1522. @end