YBImManager.m 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620
  1. //
  2. // YBImManager.m
  3. // YBHiMo
  4. //
  5. // Created by YB007 on 2021/9/15.
  6. // Copyright © 2021 YB007. All rights reserved.
  7. //
  8. #import "YBImManager.h"
  9. #import <UserNotifications/UserNotifications.h>
  10. #import "TUIKit.h"
  11. //#import "TChatGroupController.h"
  12. //#import "YBGroupInfoVC.h"
  13. //#import "YBGroupMembersList.h"
  14. #import "GDYLimitAlert.h"
  15. #import <TPNS-iOS/XGPush.h>
  16. #import <TPNS-iOS/XGPushPrivate.h>
  17. #import "TTextMessageCell.h"
  18. #import "TSystemMessageCell.h"
  19. #import "TVoiceMessageCell.h"
  20. #import "TImageMessageCell.h"
  21. #import "TFaceMessageCell.h"
  22. #import "TVideoMessageCell.h"
  23. #import "TFileMessageCell.h"
  24. #import "TGoodsCell.h"
  25. #import "TUIKit.h"
  26. #import "THeader.h"
  27. #import "TUIKitConfig.h"
  28. #import "TFaceView.h"
  29. #import "TLocationCell.h"
  30. @interface YBImManager()<V2TIMAdvancedMsgListener>
  31. @property(nonatomic,assign)int imUnread;
  32. @property(nonatomic,strong)AVPlayer *ringPlayer;
  33. @end
  34. @implementation YBImManager
  35. static YBImManager *_imManager = nil;
  36. +(instancetype)shareInstance;{
  37. static dispatch_once_t onceToken;
  38. dispatch_once(&onceToken, ^{
  39. _imManager = [[super allocWithZone:NULL]init];
  40. });
  41. return _imManager;
  42. }
  43. + (instancetype)allocWithZone:(struct _NSZone *)zone {
  44. return [self shareInstance];
  45. }
  46. #pragma mark - 登录、登出
  47. -(void)imLogin; {
  48. YBWeakSelf;
  49. [[V2TIMManager sharedInstance] login:[Config getOwnID] userSig:[Config lgetUserSign] succ:^{
  50. NSLog(@"IM登录success");
  51. _isLogin = YES;
  52. //高级消息监听器
  53. [[V2TIMManager sharedInstance] addAdvancedMsgListener:self];
  54. [[XGPushTokenManager defaultTokenManager] upsertAccountsByDict:@{@(0):[Config getOwnID]}];
  55. } fail:^(int code, NSString *desc) {
  56. // 如果返回以下错误码,表示使用 UserSig 已过期,请您使用新签发的 UserSig 进行再次登录。
  57. // 1. ERR_USER_SIG_EXPIRED(6206)
  58. // 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001)
  59. // 注意:其他的错误码,请不要在这里调用登录接口,避免 IM SDK 登录进入死循环。
  60. NSLog(@"IM登录失败");
  61. _isLogin = NO;
  62. [MBProgressHUD showError:YZMsg(@"IM登录失败,请重新登录")];
  63. [PublicObj resetUserToVisitor];
  64. }];
  65. }
  66. -(void)imLogout; {
  67. [[V2TIMManager sharedInstance] logout:^{
  68. NSLog(@"success");
  69. NSLog(@"退出登录成功");
  70. _isLogin = NO;
  71. [[V2TIMManager sharedInstance] removeAdvancedMsgListener:self];
  72. } fail:^(int code, NSString *desc) {
  73. NSLog(@"failure, code:%d, desc:%@", code, desc);
  74. NSLog(@"退出登录失败");
  75. _isLogin = NO;
  76. }];
  77. }
  78. //-(void)changeAppActive:(BOOL)isActive {
  79. // if (!isActive) {
  80. // TIMBackgroundParam *param = [[TIMBackgroundParam alloc] init];
  81. // param.c2cUnread = self.imUnread;
  82. // [[TIMManager sharedInstance] doBackground:param succ:^() {
  83. // // to do
  84. // NSLog(@"rk_im_back_suc");
  85. // } fail:^(int code, NSString * err) {
  86. // // to do
  87. // NSLog(@"rk_im_back_fail:%d==:%@",code,err);
  88. // }];
  89. // [[UIApplication sharedApplication] setApplicationIconBadgeNumber:self.imUnread];
  90. // }else{
  91. // [[TIMManager sharedInstance] doForeground:^{
  92. // NSLog(@"rk_im_foreground_suc");
  93. // } fail:^(int code, NSString *msg) {
  94. // NSLog(@"rk_im_foreground_fail:%d==:%@",code,msg);
  95. // }];
  96. // }
  97. //}
  98. #pragma mark - 自定义消息公共方法
  99. #pragma mark - V2TIM 发送消息
  100. -(void)sendV2ImMsg:(TMessageCellData *)msg andReceiver:(NSString *)receiverID complete:(ImSendV2MsgBlock)sendFinish{
  101. V2TIMMessage *timMsg = [self transIMMsgFromUIMsg:msg];
  102. [[V2TIMManager sharedInstance]sendMessage:timMsg receiver:receiverID groupID:nil priority:V2TIM_PRIORITY_NORMAL onlineUserOnly:NO offlinePushInfo:nil progress:^(uint32_t progress) {
  103. } succ:^{
  104. if(sendFinish){
  105. sendFinish(YES,timMsg, @"发送成功");
  106. NSLog(@"imManagerSendTime---:%@ \n id:%@",timMsg.timestamp,timMsg.msgID);
  107. }
  108. } fail:^(int code, NSString *desc) {
  109. if(sendFinish){
  110. sendFinish(NO,timMsg, desc);
  111. }
  112. }];
  113. }
  114. #pragma mark - V2TIM 发送自定义消息
  115. -(void)sendV2CustomMsg:(V2TIMCustomElem *)customMsg andReceiver:(NSString *)receiverID complete:(ImSendV2MsgBlock)sendFinish{
  116. V2TIMMessage *message = [[V2TIMManager sharedInstance] createCustomMessage:customMsg.data];
  117. [[V2TIMManager sharedInstance]sendMessage:message receiver:receiverID groupID:nil priority:V2TIM_PRIORITY_NORMAL onlineUserOnly:NO offlinePushInfo:nil progress:^(uint32_t progress) {
  118. } succ:^{
  119. if(sendFinish){
  120. sendFinish(YES,message, @"发送成功");
  121. NSLog(@"imManagerSendTime---:%@ \n id:%@",message.timestamp,message.msgID);
  122. }
  123. } fail:^(int code, NSString *desc) {
  124. if(sendFinish){
  125. sendFinish(NO,message, desc);
  126. }
  127. }];
  128. }
  129. #pragma mark - 消息转换
  130. - (V2TIMMessage *)transIMMsgFromUIMsg:(TMessageCellData *)data
  131. {
  132. V2TIMMessage *msg = [[V2TIMMessage alloc] init];
  133. data.userHeader = [Config getUserAvatar];
  134. if([data isKindOfClass:[TTextMessageCellData class]]){
  135. TTextMessageCellData *text = (TTextMessageCellData *)data;
  136. V2TIMMessage *message = [[V2TIMManager sharedInstance] createTextMessage:text.content];
  137. msg = message;
  138. }
  139. else if([data isKindOfClass:[TFaceMessageCellData class]]){
  140. TFaceMessageCellData *image = (TFaceMessageCellData *)data;
  141. V2TIMMessage *message = [[V2TIMManager sharedInstance] createFaceMessage:(int)image.groupIndex data:[image.faceName dataUsingEncoding:NSUTF8StringEncoding]];
  142. msg = message;
  143. }
  144. else if([data isKindOfClass:[TImageMessageCellData class]]){
  145. TImageMessageCellData *uiImage = (TImageMessageCellData *)data;
  146. // 创建图片消息
  147. V2TIMMessage *message = [[V2TIMManager sharedInstance] createImageMessage:uiImage.path];
  148. msg = message;
  149. }
  150. else if([data isKindOfClass:[TVideoMessageCellData class]]){
  151. TVideoMessageCellData *uiVideo = (TVideoMessageCellData *)data;
  152. // 创建视频消息
  153. V2TIMMessage *message = [[V2TIMManager sharedInstance] createVideoMessage:uiVideo.videoPath
  154. type:uiVideo.videoItem.type
  155. duration:(int)uiVideo.videoItem.duration
  156. snapshotPath:uiVideo.snapshotPath];
  157. msg = message;
  158. }
  159. else if([data isKindOfClass:[TVoiceMessageCellData class]]){
  160. TVoiceMessageCellData *uiSound = (TVoiceMessageCellData *)data;
  161. // 创建语音消息
  162. V2TIMMessage *message = [[V2TIMManager sharedInstance] createSoundMessage:uiSound.path duration:uiSound.duration];
  163. msg = message;
  164. }
  165. else if([data isKindOfClass:[TFileMessageCellData class]]){
  166. TFileMessageCellData *uiFile = (TFileMessageCellData *)data;
  167. // 创建文件消息
  168. V2TIMMessage *message = [[V2TIMManager sharedInstance] createFileMessage:uiFile.path fileName:uiFile.fileName];
  169. msg = message;
  170. }
  171. // else if([data isKindOfClass:[TGiftMessageCellData class]]){
  172. // TIMCustomElem *imFile = [[TIMCustomElem alloc] init];
  173. // TGiftMessageCellData *gift = (TGiftMessageCellData *)data;
  174. // imFile.data = gift.data;
  175. //
  176. // [msg addElem:imFile];
  177. // }
  178. else if([data isKindOfClass:[TGoodsCellData class]]){
  179. TGoodsCellData *imGoods = (TGoodsCellData *)data;
  180. V2TIMMessage *message = [[V2TIMManager sharedInstance] createCustomMessage:imGoods.data];
  181. msg = message;
  182. }
  183. else if ([data isKindOfClass:[TLocationCellData class]]){
  184. TLocationCellData *uiLocation = (TLocationCellData *)data;
  185. // 创建定位消息
  186. V2TIMMessage *message = [[V2TIMManager sharedInstance] createLocationMessage:uiLocation.locDes longitude:uiLocation.lng latitude:uiLocation.lat];
  187. msg = message;
  188. }
  189. return msg;
  190. }
  191. #pragma mark - V2TIM 收到新消息//高级消息监听
  192. -(void)onRecvNewMessage:(V2TIMMessage *)msg complete:(ImRecevNewMsgBlock)newMsg{
  193. NSLog(@"------wwwwww---%@",msg);
  194. TMessageCellData *data = nil;
  195. // 解析出 groupID 和 userID
  196. NSString *groupID = msg.groupID;
  197. NSString *userID = msg.userID;
  198. // 判断当前是单聊还是群聊:
  199. // 如果 groupID 不为空,表示此消息为群聊;如果 userID 不为空,表示此消息为单聊
  200. if (msg.status == V2TIM_MSG_STATUS_LOCAL_REVOKED) {
  201. if(msg.isSelf){
  202. TSystemMessageCellData *revoke = [[TSystemMessageCellData alloc] init];
  203. revoke.content = YZMsg(@"你撤回了一条消息");
  204. revoke.custom = msg;
  205. revoke.timestamp = msg.timestamp;
  206. data = revoke;
  207. }
  208. else{
  209. TSystemMessageCellData *revoke = [[TSystemMessageCellData alloc] init];
  210. revoke.content = YZMsg(@"对方撤回了一条消息");
  211. revoke.custom = msg;
  212. revoke.timestamp = msg.timestamp;
  213. // [rk_uiMsgs addObject:revoke];
  214. data = revoke;
  215. }
  216. }else if (msg.elemType == V2TIM_ELEM_TYPE_TEXT) {
  217. // 解析出 msg 中的文本消息
  218. V2TIMTextElem *textElem = msg.textElem;
  219. NSString *text = textElem.text;
  220. TTextMessageCellData *textData = [[TTextMessageCellData alloc] init];
  221. textData.content = text;
  222. data = textData;
  223. NSLog(@"onRecvNewMessage, text: %@", text);
  224. }else if (msg.elemType == V2TIM_ELEM_TYPE_CUSTOM) {
  225. // 解析出 msg 中的自定义消息
  226. V2TIMCustomElem *customElem = msg.customElem;
  227. NSData *customData = customElem.data;
  228. NSLog(@"onRecvNewMessage, customData: %@", customData);
  229. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:customData options:NSJSONReadingMutableContainers error:nil];
  230. if ([dic valueForKey:@"method"]) {
  231. if ([minstr([dic valueForKey:@"method"]) isEqual:@"GoodsMsg"]) {
  232. TGoodsCellData *goodsData = [[TGoodsCellData alloc]init];
  233. goodsData.goodsId = minstr([dic valueForKey:@"goodsid"]);
  234. data = goodsData;
  235. }
  236. }
  237. }else if (msg.elemType == V2TIM_ELEM_TYPE_IMAGE) {
  238. V2TIMImageElem *image = msg.imageElem;
  239. TImageMessageCellData *imageData = [[TImageMessageCellData alloc] init];
  240. imageData.path = image.path;
  241. imageData.items = [NSMutableArray array];
  242. for (V2TIMImage *item in image.imageList) {
  243. TImageItem *itemData = [[TImageItem alloc] init];
  244. itemData.uuid = item.uuid;
  245. itemData.size = CGSizeMake(item.width, item.height);
  246. itemData.url = item.url;
  247. if(item.type == V2TIM_IMAGE_TYPE_THUMB){
  248. itemData.type = TImage_Type_Thumb;
  249. }
  250. else if(item.type == V2TIM_IMAGE_TYPE_LARGE){
  251. itemData.type = TImage_Type_Large;
  252. }
  253. else if(item.type == V2TIM_IMAGE_TYPE_ORIGIN){
  254. itemData.type = TImage_Type_Origin;
  255. }
  256. [imageData.items addObject:itemData];
  257. }
  258. data = imageData;
  259. }else if (msg.elemType == V2TIM_ELEM_TYPE_VIDEO) {
  260. //视频消息
  261. V2TIMVideoElem *videoElem = msg.videoElem;
  262. // 视频截图 ID,内部标识,可用于外部缓存 key
  263. NSString *snapshotUUID = videoElem.snapshotUUID;
  264. // 视频截图文件大小
  265. int snapshotSize = videoElem.snapshotSize;
  266. // 视频截图宽
  267. int snapshotWidth = videoElem.snapshotWidth;
  268. // 视频截图高
  269. int snapshotHeight = videoElem.snapshotHeight;
  270. // 视频 ID,内部标识,可用于外部缓存 key
  271. NSString *videoUUID = videoElem.videoUUID;
  272. // 视频文件大小
  273. int videoSize = videoElem.videoSize;
  274. // 视频时长
  275. int duration = videoElem.duration;
  276. // 设置视频截图文件路径,这里可以用 uuid 作为标识,避免重复下载
  277. NSString *snapshotPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat: @"testVideoSnapshot%@",snapshotUUID]];
  278. if (![[NSFileManager defaultManager] fileExistsAtPath:snapshotPath]) {
  279. // 下载视频截图
  280. [videoElem downloadSnapshot:snapshotPath progress:^(NSInteger curSize, NSInteger totalSize) {
  281. // 下载进度
  282. NSLog(@"%@", [NSString stringWithFormat:@"下载视频截图进度:curSize:%lu,totalSize:%lu",curSize,totalSize]);
  283. } succ:^{
  284. // 下载成功
  285. NSLog(@"下载视频截图完成");
  286. } fail:^(int code, NSString *msg) {
  287. // 下载失败
  288. NSLog(@"%@", [NSString stringWithFormat:@"下载视频截图失败:code:%d,msg:%@",code,msg]);
  289. }];
  290. } else {
  291. // 视频截图已存在
  292. }
  293. NSLog(@"视频截图信息:snapshotUUID:%@, snapshotSize:%d, snapshotWidth:%d, snapshotWidth:%d, snapshotPath:%@", snapshotUUID, snapshotSize, snapshotWidth, snapshotHeight, snapshotPath);
  294. // 设置视频文件路径,这里可以用 uuid 作为标识,避免重复下载
  295. NSString *videoPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat: @"testVideo%@",videoUUID]];
  296. if (![[NSFileManager defaultManager] fileExistsAtPath:videoPath]) {
  297. // 下载视频
  298. [videoElem downloadVideo:videoPath progress:^(NSInteger curSize, NSInteger totalSize) {
  299. // 下载进度
  300. NSLog(@"%@", [NSString stringWithFormat:@"下载视频进度:curSize:%lu,totalSize:%lu",curSize,totalSize]);
  301. } succ:^{
  302. // 下载成功
  303. NSLog(@"下载视频完成");
  304. } fail:^(int code, NSString *msg) {
  305. // 下载失败
  306. NSLog(@"%@", [NSString stringWithFormat:@"下载视频失败:code:%d,msg:%@",code,msg]);
  307. }];
  308. } else {
  309. // 视频已存在
  310. }
  311. NSLog(@"视频信息:videoUUID:%@, videoSize:%d, duration:%d, videoPath:%@", videoUUID, videoSize, duration, videoPath);
  312. TVideoMessageCellData *videoData = [[TVideoMessageCellData alloc] init];
  313. videoData.videoPath = videoElem.videoPath;
  314. videoData.snapshotPath = videoElem.snapshotPath;
  315. videoData.videoItem = [[TVideoItem alloc] init];
  316. videoData.videoItem.uuid = videoElem.videoUUID;
  317. videoData.videoItem.type = videoElem.videoType;
  318. videoData.videoItem.length = videoElem.videoSize;
  319. videoData.videoItem.duration = videoElem.duration;
  320. videoData.snapshotItem = [[TSnapshotItem alloc] init];
  321. videoData.snapshotItem.uuid = videoElem.snapshotUUID;
  322. // videoData.snapshotItem.type = videoElem.snapshot;
  323. videoData.snapshotItem.length = videoElem.snapshotSize;
  324. videoData.snapshotItem.size = CGSizeMake(videoElem.snapshotWidth, videoElem.snapshotHeight);
  325. data = videoData;
  326. }else if (msg.elemType == V2TIM_ELEM_TYPE_SOUND) {
  327. V2TIMSoundElem *soundElem = msg.soundElem;
  328. // 语音 ID,内部标识,可用于外部缓存 key
  329. NSString *uuid = soundElem.uuid;
  330. // 语音文件大小
  331. int dataSize = soundElem.dataSize;
  332. // 语音时长
  333. int duration = soundElem.duration;
  334. // 设置语音文件路径 soundPath,这里可以用 uuid 作为标识,避免重复下载
  335. NSString *soundPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat: @"testSound%@",uuid]];
  336. // 判断 soundPath 下有没有已经下载过的语音文件
  337. if (![[NSFileManager defaultManager] fileExistsAtPath:soundPath]) {
  338. // 下载语音
  339. [soundElem downloadSound:soundPath progress:^(NSInteger curSize, NSInteger totalSize) {
  340. // 下载进度
  341. NSLog(@"下载语音进度:curSize:%lu,totalSize:%lu",curSize,totalSize);
  342. } succ:^{
  343. // 下载成功
  344. NSLog(@"下载语音完成");
  345. } fail:^(int code, NSString *msg) {
  346. // 下载失败
  347. NSLog(@"下载语音失败:code:%d,msg:%@",code,msg);
  348. }];
  349. } else {
  350. // 语音已存在
  351. }
  352. NSLog(@"语音信息:uuid:%@, dataSize:%d, duration:%d, soundPath:%@", uuid, dataSize, duration, soundPath);
  353. TVoiceMessageCellData *soundData = [[TVoiceMessageCellData alloc] init];
  354. soundData.duration = soundElem.duration;
  355. soundData.length = soundElem.dataSize;
  356. soundData.uuid = soundElem.uuid;
  357. data = soundData;
  358. }
  359. else if (msg.elemType == V2TIM_ELEM_TYPE_LOCATION) {
  360. V2TIMLocationElem *locationElem = msg.locationElem;
  361. // 地理位置信息描述
  362. NSString *desc = locationElem.desc;
  363. // 经度
  364. double longitude = locationElem.longitude;
  365. // 纬度
  366. double latitude = locationElem.latitude;
  367. NSLog(@"地理位置信息:desc:%@, longitude:%f, latitude:%f", desc, longitude, latitude);
  368. TLocationCellData *locatioData =[[TLocationCellData alloc]init];
  369. locatioData.lat = locationElem.latitude; //[NSString stringWithFormat:@"%f",locationElem.latitude] ;
  370. locatioData.lng = locationElem.longitude;//[NSString stringWithFormat:@"%f",locationElem.longitude];
  371. locatioData.locDes = locationElem.desc;
  372. data = locatioData;
  373. }
  374. else if (msg.elemType == V2TIM_ELEM_TYPE_FACE) {
  375. V2TIMFaceElem *faceElem = msg.faceElem;
  376. // 表情所在的位置
  377. int index = faceElem.index;
  378. // 表情自定义数据
  379. NSData *facedata = faceElem.data;
  380. NSLog(@"表情信息:index: %d, data: %@", index, facedata);
  381. TFaceMessageCellData *faceData = [[TFaceMessageCellData alloc] init];
  382. faceData.groupIndex = faceElem.index;
  383. faceData.faceName = [[NSString alloc] initWithData:faceElem.data encoding:NSUTF8StringEncoding];
  384. for (TFaceGroup *group in [[TUIKit sharedInstance] getConfig].faceGroups) {
  385. if(group.groupIndex == faceData.groupIndex){
  386. NSString *path = [group.groupPath stringByAppendingPathComponent:faceData.faceName];
  387. faceData.path = path;
  388. break;
  389. }
  390. }
  391. data = faceData;
  392. }
  393. if(newMsg){
  394. [[YBImManager shareInstance] tryPlayMsgAlertWithSenderid:msg.sender];
  395. data.custom = msg;
  396. newMsg(data);
  397. }
  398. }
  399. #pragma mark - 消息已读回执通知(如果自己发的消息支持已读回执,消息接收端调用了 sendMessageReadReceipts 接口,自己会收到该回调)
  400. -(void)onRecvMessageReadReceipts:(NSArray<V2TIMMessageReceipt *> *)receiptList{
  401. }
  402. #pragma mark - C2C 对端用户会话已读通知(如果对端用户调用 markC2CMessageAsRead 接口,自己会收到该通知)
  403. -(void)onRecvC2CReadReceipt:(NSArray<V2TIMMessageReceipt *> *)receiptList{
  404. }
  405. #pragma mark - 收到消息撤回
  406. -(void)onRecvMessageRevoked:(NSString *)msgID{
  407. }
  408. #pragma mark - 消息内容被修改
  409. - (void)onRecvMessageModified:(V2TIMMessage *)msg{
  410. }
  411. #pragma mark -获取所有会话列表
  412. -(void)getAllConversationList:(ImGetConversationListBlock)covBlock{
  413. [[V2TIMManager sharedInstance] getConversationList:0
  414. count:INT_MAX
  415. succ:^(NSArray<V2TIMConversation *> *list, uint64_t lastTS, BOOL isFinished) {
  416. // 获取成功,list 为会话列表
  417. NSMutableArray *userArr = [NSMutableArray array];
  418. if (isFinished) {
  419. for (V2TIMConversation *conv in list) {
  420. if(conv.type == V2TIM_UNKNOWN){
  421. continue;
  422. }
  423. //最后一条消息
  424. V2TIMMessage *lastMessage = [conv lastMessage];
  425. TConversationCellData *data = [[TConversationCellData alloc] init];
  426. data.unRead = [conv unreadCount];;
  427. data.subTitle = [self getLastDisplayString:lastMessage];
  428. if(conv.type == V2TIM_C2C){
  429. data.head = TUIKitResource(@"default_head");
  430. }
  431. else if(conv.type == V2TIM_GROUP){
  432. data.head = TUIKitResource(@"default_group");
  433. }
  434. data.convId = conv.userID;
  435. NSString *timest = [NSString stringWithFormat:@"%ld", (long)[lastMessage.timestamp timeIntervalSince1970]];
  436. data.timestamp = timest;
  437. NSLog(@"获取时间错==%@",timest);
  438. data.convType =conv.type;
  439. data.title = conv.showName;
  440. if ([data.convId isEqual:@"admin"]) {
  441. data.time = [PublicObj getDateDisplayString:lastMessage.timestamp];
  442. [userArr insertObject:data atIndex:0];
  443. }else{
  444. data.time = [PublicObj getUserDateString:lastMessage.timestamp];
  445. [userArr addObject:data];
  446. }
  447. }
  448. if(covBlock){
  449. covBlock(userArr, isFinished);
  450. }
  451. }
  452. } fail:^(int code, NSString *msg) {
  453. // 获取失败
  454. if(covBlock){
  455. covBlock(@[], code);
  456. }
  457. }];
  458. }
  459. #pragma mark -获取不包含粉丝、赞、艾特、评论的会话列表
  460. -(void)getConversationList:(ImGetConversationListBlock)covBlock{
  461. [[V2TIMManager sharedInstance] getConversationList:0
  462. count:INT_MAX
  463. succ:^(NSArray<V2TIMConversation *> *list, uint64_t lastTS, BOOL isFinished) {
  464. // 获取成功,list 为会话列表
  465. NSMutableArray *userArr = [NSMutableArray array];
  466. if (isFinished) {
  467. for (V2TIMConversation *conv in list) {
  468. if(conv.type == V2TIM_UNKNOWN){
  469. continue;
  470. }
  471. //最后一条消息
  472. V2TIMMessage *lastMessage = [conv lastMessage];
  473. TConversationCellData *data = [[TConversationCellData alloc] init];
  474. data.unRead = [conv unreadCount];;
  475. data.subTitle = [self getLastDisplayString:lastMessage];
  476. if(conv.type == V2TIM_C2C){
  477. data.head = TUIKitResource(@"default_head");
  478. }
  479. else if(conv.type == V2TIM_GROUP){
  480. data.head = TUIKitResource(@"default_group");
  481. }
  482. data.convId = conv.userID;
  483. NSString *timest = [NSString stringWithFormat:@"%ld", (long)[lastMessage.timestamp timeIntervalSince1970]];
  484. data.timestamp = timest;
  485. NSLog(@"获取时间错==%@",timest);
  486. data.convType =conv.type;
  487. data.title = conv.showName;
  488. // if(data.convType == TConv_Type_C2C){
  489. // data.title = data.convId;
  490. // }else if(data.convType == TConv_Type_Group){
  491. // data.title = conv.showName;
  492. // continue;
  493. // }
  494. //rk_顶部红点
  495. if ([data.convId isEqual:@"dsp_fans"]) {
  496. //粉丝
  497. continue;
  498. }else if ([data.convId isEqual:@"dsp_like"]){
  499. //赞
  500. continue;
  501. }else if ([data.convId isEqual:@"dsp_at"]){
  502. //@
  503. continue;
  504. }else if ([data.convId isEqual:@"dsp_comment"]){
  505. //评论
  506. continue;
  507. }else if ([data.convId isEqual:@"admin"]) {
  508. data.time = [PublicObj getDateDisplayString:lastMessage.timestamp];
  509. [userArr insertObject:data atIndex:0];
  510. }else{
  511. data.time = [PublicObj getUserDateString:lastMessage.timestamp];
  512. [userArr addObject:data];
  513. }
  514. }
  515. if(covBlock){
  516. covBlock(userArr, isFinished);
  517. }
  518. }
  519. } fail:^(int code, NSString *msg) {
  520. // 获取失败
  521. if(covBlock){
  522. covBlock(@[], code);
  523. }
  524. }];
  525. }
  526. #pragma mark -获取指消息未读数 除去userlist用户 userlist为空则是返回所有消息未读数
  527. -(void)getAllUnredNumExceptUser:(NSArray *)userList complete:(ImGetUnreadBlock)finish{
  528. if(userList && userList.count > 0){
  529. //这个方法要主动调用
  530. [[V2TIMManager sharedInstance] getTotalUnreadMessageCount:^(UInt64 totalUnreadCount) {
  531. NSLog(@"getTotalUnreadMessageCount");
  532. } fail:^(int code, NSString *desc) {
  533. }];
  534. __block int unRead = 0;
  535. [[V2TIMManager sharedInstance]getConversationList:0 count:INT_MAX succ:^(NSArray<V2TIMConversation *> *list, uint64_t nextSeq, BOOL isFinished) {
  536. if(isFinished){
  537. // 获取成功,list 为会话列表
  538. NSMutableArray *userArr = [NSMutableArray arrayWithArray:list];
  539. for (V2TIMConversation *conv in list) {
  540. if(conv.type == V2TIM_UNKNOWN){
  541. continue;
  542. }
  543. for(NSString *userID in userList){
  544. if ([conv.userID isEqual:userID]) {
  545. [userArr removeObject:conv];
  546. }
  547. }
  548. }
  549. NSLog(@"immanager----userArr:%@",userArr);
  550. for (int i = 0; i < userArr.count; i ++) {
  551. V2TIMConversation *conv = userArr[i];
  552. int jjj = conv.unreadCount;
  553. unRead += jjj;
  554. }
  555. if(finish){
  556. finish(unRead);
  557. }
  558. }
  559. } fail:^(int code, NSString *desc) {
  560. }];
  561. }else{
  562. [[V2TIMManager sharedInstance] getTotalUnreadMessageCount:^(UInt64 totalCount) {
  563. // 获取成功,totalCount 为所有会话的未读消息总数
  564. // 更新 UI 上的未读数
  565. if(finish){
  566. finish((int)totalCount);
  567. }
  568. } fail:^(int code, NSString *desc) {
  569. // 获取失败
  570. }];
  571. }
  572. }
  573. #pragma mark -清空指定单聊会话的未读消息数
  574. -(void)clearUnreadConvId:(NSString *)convid sendNot:(BOOL)send{
  575. [[V2TIMManager sharedInstance] markC2CMessageAsRead:convid // 待清空的单聊会话 ID
  576. succ:^{
  577. // 清空成功
  578. } fail:^(int code, NSString *msg) {
  579. // 清空失败
  580. }];
  581. }
  582. #pragma mark -清空所有会话的未读消息数。
  583. -(void)clearAllUnreadConv{
  584. [[V2TIMManager sharedInstance] markAllMessageAsRead:^{
  585. // 清空成功
  586. [MBProgressHUD showError:YZMsg(@"已忽略未读消息")];
  587. } fail:^(int code, NSString *desc) {
  588. // 清空失败
  589. }];
  590. }
  591. - (NSString *)getLastDisplayString:(V2TIMMessage *)lastMessage
  592. {
  593. NSString *str = @"";
  594. if (lastMessage.status == V2TIM_MSG_STATUS_LOCAL_REVOKED) {
  595. if(lastMessage.isSelf){
  596. return YZMsg(@"你撤回了一条消息");
  597. }
  598. else{
  599. return [NSString stringWithFormat:@"\"%@\"%@", YZMsg(@"对方"),YZMsg(@"撤回了一条消息")];
  600. }
  601. }else if(lastMessage.elemType == V2TIM_ELEM_TYPE_TEXT){
  602. NSString *text = lastMessage.textElem.text;
  603. str = text;
  604. }else if(lastMessage.elemType == V2TIM_ELEM_TYPE_CUSTOM){
  605. //自定义消息
  606. // V2TIMCustomElem *customElem =(V2TIMCustomElem *)lastMessage;
  607. NSData *customData = lastMessage.customElem.data;
  608. NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:customData options:NSJSONReadingMutableLeaves error:nil];
  609. if([minstr([jsonDict valueForKey:@"method"]) isEqual:@"GoodsMsg"]){
  610. str = YZMsg(@"[商品]");
  611. }
  612. // NSLog(@"onRecvNewMessage, customData: %@ \n str:%@", customData,receiveStr);
  613. // str = customElem.desc;
  614. }else if(lastMessage.elemType == V2TIM_ELEM_TYPE_IMAGE){
  615. //图片消息
  616. str = YZMsg(@"[图片]");
  617. }else if(lastMessage.elemType == V2TIM_ELEM_TYPE_SOUND){
  618. //语音消息
  619. str = YZMsg(@"[语音]");
  620. }else if(lastMessage.elemType == V2TIM_ELEM_TYPE_VIDEO){
  621. //视频消息
  622. str = YZMsg(@"[视频]");
  623. }else if(lastMessage.elemType == V2TIM_ELEM_TYPE_FACE){
  624. //表情消息
  625. str = @"[动画表情]";
  626. }else if(lastMessage.elemType == V2TIM_ELEM_TYPE_FILE){
  627. //文件消息
  628. str = @"[文件]";
  629. }else if(lastMessage.elemType == V2TIM_ELEM_TYPE_LOCATION){
  630. //位置消息
  631. str = @"[位置]";
  632. }
  633. return str;
  634. }
  635. //-(void)pulicSendMsgWith:(NSDictionary *)msgDic receiver:(NSString *)receiverid complete:(ImStatusBlock)status;{
  636. // TIMConversation *conversation = [[TIMManager sharedInstance] getConversation:TIM_C2C receiver:receiverid];
  637. // NSData *data = [NSJSONSerialization dataWithJSONObject:msgDic options:NSJSONWritingPrettyPrinted error:nil];
  638. // TIMCustomElem * custom_elem = [[TIMCustomElem alloc] init];
  639. // [custom_elem setData:data];
  640. // TIMMessage * msg = [[TIMMessage alloc] init];
  641. // [msg addElem:custom_elem];
  642. //
  643. // TIMOfflinePushInfo *pushSet = [[TIMOfflinePushInfo alloc]init];
  644. // pushSet.pushFlag = IM_Msg_Push;
  645. // [msg setOfflinePushInfo:pushSet];
  646. //
  647. // [conversation sendMessage:msg succ:^(){
  648. // NSLog(@"SendMsg Succ:%@\n",msgDic);
  649. // //这里都是自己去发送自定义消息,刷新数据
  650. // NSArray *objA = [NSArray arrayWithObject:msg];
  651. // [[NSNotificationCenter defaultCenter] postNotificationName:ybImNeedRefresh object:objA userInfo:nil];
  652. // if (status) {
  653. // status(YES);
  654. // }
  655. // }fail:^(int code, NSString * err) {
  656. // NSLog(@"SendMsg Failed:%d->%@", code, err);
  657. // [MBProgressHUD showError:YZMsg(@"消息发送失败")];
  658. // if (status) {
  659. // status(NO);
  660. // }
  661. // }];
  662. //}
  663. /// 播放、停止响铃
  664. -(void)playAudioCall; {
  665. if (_ringPlayer) {
  666. [_ringPlayer pause];
  667. _ringPlayer = nil;
  668. }
  669. NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"ring" withExtension:@"mp3"];
  670. _ringPlayer = [[AVPlayer alloc] initWithURL:fileURL];
  671. _ringPlayer.volume = 1.0;
  672. [_ringPlayer play];
  673. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playeyEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
  674. }
  675. /// 播放结束
  676. -(void)playeyEnd:(NSNotification*)notify{
  677. [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
  678. [self playAudioCall];
  679. }
  680. -(void)stopAudioCall; {
  681. if (_ringPlayer) {
  682. [_ringPlayer pause];
  683. _ringPlayer = nil;
  684. [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
  685. }
  686. }
  687. /// 消息提示
  688. - (void)tryPlayMsgAlertWithSenderid:(NSString *)senderUid{
  689. NSString *chatUid = strFormat([[NSUserDefaults standardUserDefaults] objectForKey:ybImChatingUid]);
  690. BOOL iscall = [[NSUserDefaults standardUserDefaults] boolForKey:ybIsStartCallKey];
  691. BOOL onRoom = [[NSUserDefaults standardUserDefaults] boolForKey:ybMatchRoomCtrKey];
  692. if ([senderUid isEqual:chatUid] || iscall || onRoom || ![common getMsgVoiceSwitch]) {
  693. NSLog(@"不需要提示音");
  694. return;
  695. }
  696. //2020-12-17调整为用户私信不提示
  697. if ([senderUid containsString:@"dsp_admin_1"] ||
  698. [senderUid containsString:@"dsp_admin_2"] ||
  699. [senderUid containsString:@"dsp_fans"] ||
  700. [senderUid containsString:@"dsp_like"] ||
  701. [senderUid containsString:@"dsp_at"] ||
  702. [senderUid containsString:@"dsp_comment"]||
  703. [senderUid containsString:@"goodsorder_admin"]||
  704. [senderUid containsString:@"dsp_admin_control"]
  705. ) {
  706. NSURL *soundUrl = [[NSBundle mainBundle] URLForResource:@"messageVioce" withExtension:@"mp3"];
  707. SystemSoundID soundID;
  708. AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundUrl,&soundID);
  709. AudioServicesPlaySystemSound(soundID);
  710. }
  711. }
  712. #pragma mark - 消息处理
  713. -(void)addNoti {
  714. // [self removeNoti];
  715. // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onNewMessage:) name:TUIKitNotification_TIMMessageListener object:nil];
  716. // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getAllUnreadNum) name:TUIKitNotification_TIMCancelunread object:nil];
  717. // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getAllUnreadNum) name:TUIKitNotification_TIMRefreshListener object:nil];
  718. }
  719. -(void)removeNoti {
  720. [[NSNotificationCenter defaultCenter] removeObserver:self];
  721. }
  722. - (void)dealloc{
  723. //NSLog(@"im_manager_dealloc");
  724. [self removeNoti];
  725. }
  726. //- (void)onNewMessage:(NSNotification *)notification {
  727. //// NSLog(@"im_manager_new");
  728. // NSArray *msgs = notification.object;
  729. //
  730. // TIMMessage *msg = [msgs lastObject];
  731. // for (int i = 0; i < msg.elemCount; ++i) {
  732. // TIMElem *elem = [msg getElem:i];
  733. // if([elem isKindOfClass:[TIMCustomElem class]]){
  734. // TIMCustomElem *custom = (TIMCustomElem *)elem;
  735. // NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:custom.data options:NSJSONReadingMutableContainers error:nil];
  736. // if ([jsonDic isKindOfClass:[NSDictionary class]] && jsonDic.count > 0) {
  737. // NSLog(@"收到消息------------------\n%@",jsonDic);
  738. // //dsp_admin_control
  739. // NSString *method = strFormat([jsonDic valueForKey:@"method"]);
  740. // // 安全风控、礼物计划-提示
  741. // if ([method isEqual:@"ctrl_plan"] || [method isEqual:@"gift_plan"]) {
  742. // NSString *contentStr = strFormat([jsonDic valueForKey:@"title"]);
  743. // if ([lagType isEqual:EN]) {
  744. // contentStr = strFormat([jsonDic valueForKey:@"title_en"]);
  745. // }
  746. // NSDictionary *alertDic = @{
  747. // @"title":YZMsg(@"提示"),
  748. // @"msg":contentStr,
  749. // };
  750. // [GDYLimitAlert showLimitWithDic:alertDic complete:^{
  751. //
  752. // }];
  753. // }
  754. // // 试图提示
  755. // [[YBImManager shareInstance] tryPlayMsgAlertWithSenderid:msg.sender];
  756. // }
  757. // }
  758. // else if([elem isKindOfClass:[TIMGroupSystemElem class]]){
  759. // TIMGroupSystemElem *custom = (TIMGroupSystemElem *)elem;
  760. // NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:custom.userData options:NSJSONReadingMutableContainers error:nil];
  761. // NSLog(@"new_im_group:%@=======%ld",jsonDic,(long)custom.type);
  762. // if (custom.type == TIM_GROUP_SYSTEM_KICK_OFF_FROM_GROUP_TYPE ||
  763. // custom.type == TIM_GROUP_SYSTEM_DELETE_GROUP_TYPE) {
  764. // // 被踢出、被解散
  765. // [self userQuitOrKickDeal:custom.group];
  766. // [[NSNotificationCenter defaultCenter] postNotificationName:ybImConveEvent object:nil userInfo:nil];
  767. // }
  768. // }
  769. // else{
  770. // if (![elem isKindOfClass:[TIMGroupTipsElem class]]) {
  771. // // 试图提示
  772. // [[YBImManager shareInstance] tryPlayMsgAlertWithSenderid:msg.sender];
  773. // }
  774. // }
  775. // }
  776. // [self getAllUnreadNum];
  777. //}
  778. //-(void)userQuitOrKickDeal:(NSString *)groupId {
  779. // TIMConversation * convM = [[TIMManager sharedInstance] getConversation:TIM_GROUP receiver:groupId];
  780. // [convM setReadMessage:nil succ:^{
  781. // } fail:^(int code, NSString *msg) {
  782. // }];
  783. // BOOL isOK = [[TIMManager sharedInstance] deleteConversation:TIM_GROUP receiver:groupId];
  784. // NSLog(@"del-:%d==id:%@",isOK,groupId);
  785. // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  786. // [[NSNotificationCenter defaultCenter] postNotificationName:TUIKitNotification_TIMCancelunread object:nil];
  787. //
  788. //// if ([[PublicObj currentViewContorller] isKindOfClass:[TChatGroupController class]] ||
  789. //// [[PublicObj currentViewContorller] isKindOfClass:[YBGroupInfoVC class]] ||
  790. //// [[PublicObj currentViewContorller] isKindOfClass:[YBGroupMembersList class]]) {
  791. //// [[YBBaseAppDelegate sharedAppDelegate] popToRootViewController];
  792. //// //[MBProgressHUD showError:YZMsg(@"您被移出群聊")];
  793. //// }
  794. // });
  795. //}
  796. //收到邀请展示本地推送
  797. - (void)showLocalPush:(NSDictionary *)dic{
  798. UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  799. UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
  800. // 标题
  801. content.title = YZMsg(@"通话邀请");
  802. content.subtitle = @"";
  803. // 内容
  804. content.body = [NSString stringWithFormat:@"%@%@%@%@",strFormat([dic valueForKey:@"user_nickname"]),YZMsg(@"向你发起"),[strFormat([dic valueForKey:@"type"]) intValue] == 1 ? YZMsg(@"视频"):YZMsg(@"语音"),YZMsg(@"通话邀请")];
  805. // 添加通知的标识符,可以用于移除,更新等操作
  806. NSString *identifier = @"noticeId";
  807. UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:nil];
  808. [center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
  809. NSLog(@"成功添加推送");
  810. }];
  811. }
  812. //TUIKitNotification_TIMRefreshListener
  813. //- (void)getAllUnreadNum{
  814. //// NSLog(@"im_manager_unread");
  815. //
  816. // TIMManager *manager = [TIMManager sharedInstance];
  817. // NSArray *convs = [manager getConversationList];
  818. // NSMutableArray *arrayd = [NSMutableArray array];
  819. // int unRead = 0;
  820. //
  821. // for (int i = 0; i < convs.count; i ++) {
  822. // TIMConversation *conv = convs[i];
  823. // if([conv getType] == TIM_SYSTEM){
  824. // continue;
  825. // }else if([conv getType] == TIM_GROUP){
  826. // continue;
  827. // }else if ([[conv getReceiver] containsString:@"dsp_user_"]){
  828. // // dsp_user_live 【用于推送】
  829. // continue;
  830. // }
  831. // [arrayd addObject:conv];
  832. // }
  833. // for (int i = 0; i < arrayd.count; i ++) {
  834. // TIMConversation *conv = arrayd[i];
  835. // int jjj = [conv getUnReadMessageNum];
  836. // unRead += jjj;
  837. // NSLog(@"rk==========:%d ===:%@",jjj,[conv getReceiver]);
  838. // }
  839. // YBTabBarController *tabbar = [PublicObj currentTabbar];
  840. // if (!tabbar) {
  841. // NSLog(@"rk_==xxxx===tabbar=nil");
  842. // return;
  843. // }
  844. // //NSLog(@"==xxxx===tabbar=ok");
  845. // UITabBarItem *item = [[[tabbar tabBar] items] objectAtIndex:2];
  846. // //设置item角标数字
  847. // if (unRead == 0) {
  848. // item.badgeValue= nil;
  849. // }else{
  850. // item.badgeValue= [NSString stringWithFormat:@"%d",unRead];
  851. // }
  852. // self.imUnread = unRead;
  853. // [Config saveImUnreadNum:unRead];
  854. // [[NSNotificationCenter defaultCenter] postNotificationName:ybImUnreadChange object:nil userInfo:@{@"unread":@(unRead)}];
  855. //}
  856. #pragma mark - 获取最后一条消息
  857. //- (void)getLastDisplayStringWith:(dispatch_group_t)imListGroup finish:(ImTransformArrayBlock)finish;{
  858. //
  859. // TIMManager *manager = [TIMManager sharedInstance];
  860. // NSArray *convs = [manager getConversationList];
  861. // NSMutableArray *rk_m_array = [NSMutableArray array];
  862. // dispatch_queue_t group_queue = dispatch_get_global_queue(0, 0);
  863. // for (int i = 0; i < convs.count; i++) {
  864. // TIMConversation *conv = convs[i];
  865. // NSString *str = @"";
  866. // TIMMessageDraft *draft = [conv getDraft];
  867. // TIMMessage *msg = [conv getLastMsg];
  868. // //NSLog(@"rk========time:%@==im:%@",msg.timestamp,[conv getReceiver]);
  869. // if(draft && draft.elemCount>0){
  870. // TIMElem *draftElem = [draft getElem:(draft.elemCount-1)];
  871. // if([draftElem isKindOfClass:[TIMTextElem class]]){
  872. // TIMTextElem *text = (TIMTextElem *)draftElem;
  873. // TConversationCellData *data = [[TConversationCellData alloc] init];
  874. // data.subTitle = [NSString stringWithFormat:@"[%@]%@", YZMsg(@"草稿"),text.text];;
  875. // data.unRead = [conv getUnReadMessageNum];
  876. // data.lastConv = conv;
  877. // data.head = TUIKitResource(@"default_group");
  878. // data.convId = [conv getReceiver];
  879. // data.timestamp = msg.timestamp;
  880. // data.convType = (TConvType)[conv getType];
  881. // data.title = data.convId; // [conv getGroupName];
  882. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  883. // [rk_m_array addObject:data];
  884. // } else{
  885. // continue;
  886. // }
  887. // ///return str;
  888. // }else if(msg.status == TIM_MSG_STATUS_LOCAL_REVOKED){
  889. // if(msg.isSelf || [[msg getConversation] getType] == TIM_C2C){
  890. // //return YZMsg(@"你撤回了一条消息");
  891. // NSString *revokedStr = msg.isSelf ? YZMsg(@"你撤回了一条消息"):YZMsg(@"对方撤回了一条消息");
  892. // TConversationCellData *data = [[TConversationCellData alloc] init];
  893. // data.subTitle = revokedStr;
  894. // data.unRead = [conv getUnReadMessageNum];
  895. // data.lastConv = conv;
  896. // data.head = TUIKitResource(@"default_group");
  897. // data.convId = [conv getReceiver];
  898. // data.timestamp = msg.timestamp;
  899. // data.convType = (TConvType)[conv getType];
  900. // data.title = data.convId; // [conv getGroupName];
  901. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  902. // [rk_m_array addObject:data];
  903. // } else if([[msg getConversation] getType] == TIM_GROUP){
  904. // dispatch_group_enter(imListGroup);
  905. // dispatch_group_async(imListGroup, group_queue, ^{
  906. // TIMFriendshipManager *imProfile = [TIMFriendshipManager sharedInstance];
  907. // int revokedOk = [imProfile getUsersProfile:@[msg.sender] forceUpdate:YES succ:^(NSArray<TIMUserProfile *> *profiles) {
  908. // TIMUserProfile * profile = [profiles lastObject];
  909. // NSString *nameStr = [PublicObj transformToStringWithData:[profile.customInfo valueForKey:IMKey_Custom_Suffix_Nickname]];
  910. // NSString *revokedStr = [NSString stringWithFormat:@"\"%@\"%@",nameStr,YZMsg(@"撤回了一条消息")];
  911. // TConversationCellData *data = [[TConversationCellData alloc] init];
  912. // data.subTitle = revokedStr;
  913. // data.unRead = [conv getUnReadMessageNum];
  914. // data.lastConv = conv;
  915. // data.head = TUIKitResource(@"default_group");
  916. // data.convId = [conv getReceiver];
  917. // data.timestamp = msg.timestamp;
  918. // data.convType = (TConvType)[conv getType];
  919. // data.title = data.convId;
  920. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  921. // [rk_m_array addObject:data];
  922. // dispatch_group_leave(imListGroup);
  923. // } fail:^(int code, NSString *msg) {
  924. // dispatch_group_leave(imListGroup);
  925. // }];
  926. // if (revokedOk != 0) {
  927. // dispatch_group_leave(imListGroup);
  928. // }
  929. // });
  930. // }else {
  931. // continue;
  932. // }
  933. // }else {
  934. // TIMElem *lastElem = [msg getElem:(msg.elemCount-1)];
  935. //
  936. // if([lastElem isKindOfClass:[TIMTextElem class]]){
  937. // TIMTextElem *text = (TIMTextElem *)lastElem;
  938. // //str = text.text;
  939. // TConversationCellData *data = [[TConversationCellData alloc] init];
  940. // data.subTitle = text.text;
  941. // data.unRead = [conv getUnReadMessageNum];
  942. // data.lastConv = conv;
  943. // data.head = TUIKitResource(@"default_group");
  944. // data.convId = [conv getReceiver];
  945. // data.timestamp = msg.timestamp;
  946. // data.convType = (TConvType)[conv getType];
  947. // data.title = data.convId;
  948. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  949. // [rk_m_array addObject:data];
  950. // }
  951. // else if([lastElem isKindOfClass:[TIMCustomElem class]]){
  952. // TIMCustomElem *custom = (TIMCustomElem *)lastElem;
  953. // //str = custom.ext;
  954. // NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:custom.data options:NSJSONReadingMutableContainers error:nil];
  955. // if ([strFormat([jsonDic valueForKey:@"method"]) isEqual:@"sendUserGift"] ||
  956. // [strFormat([jsonDic valueForKey:@"method"]) isEqual:@"sendOvoGift"]) {
  957. // str = [NSString stringWithFormat:@"[%@]",strFormat([jsonDic valueForKey:@"name"])];
  958. // }else if ([strFormat([jsonDic valueForKey:@"method"]) isEqual:@"call"]){
  959. // str = YZMsg(@"[通话]");
  960. // }else if([strFormat([jsonDic valueForKey:@"method"]) isEqual:@"GoodsMsg"]){
  961. // str = YZMsg(@"[商品]");
  962. // }
  963. // else if ([strFormat([jsonDic valueForKey:@"method"]) isEqual:@"follow"]){
  964. // NSString *imUid = strFormat([jsonDic valueForKey:@"uid"]);
  965. // if ([imUid isEqual:[Config getOwnID]]) {
  966. // str = YZMsg(@"你关注了对方,快跟Ta聊聊天吧~");
  967. // }else{
  968. // str = YZMsg(@"对方已关注你,快跟Ta聊聊天吧~");
  969. // }
  970. // }
  971. // TConversationCellData *data = [[TConversationCellData alloc] init];
  972. // data.subTitle = str;
  973. // data.unRead = [conv getUnReadMessageNum];
  974. // data.lastConv = conv;
  975. // data.head = TUIKitResource(@"default_group");
  976. // data.convId = [conv getReceiver];
  977. // data.timestamp = msg.timestamp;
  978. // data.convType = (TConvType)[conv getType];
  979. // data.title = data.convId;
  980. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  981. // [rk_m_array addObject:data];
  982. // }
  983. // else if([lastElem isKindOfClass:[TIMImageElem class]]){
  984. // str = YZMsg(@"[图片]");
  985. // TConversationCellData *data = [[TConversationCellData alloc] init];
  986. // data.subTitle = str;
  987. // data.unRead = [conv getUnReadMessageNum];
  988. // data.lastConv = conv;
  989. // data.head = TUIKitResource(@"default_group");
  990. // data.convId = [conv getReceiver];
  991. // data.timestamp = msg.timestamp;
  992. // data.convType = (TConvType)[conv getType];
  993. // data.title = data.convId;
  994. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  995. // [rk_m_array addObject:data];
  996. // }
  997. // else if([lastElem isKindOfClass:[TIMSoundElem class]]){
  998. // str = YZMsg(@"[语音]");
  999. // TConversationCellData *data = [[TConversationCellData alloc] init];
  1000. // data.subTitle = str;
  1001. // data.unRead = [conv getUnReadMessageNum];
  1002. // data.lastConv = conv;
  1003. // data.head = TUIKitResource(@"default_group");
  1004. // data.convId = [conv getReceiver];
  1005. // data.timestamp = msg.timestamp;
  1006. // data.convType = (TConvType)[conv getType];
  1007. // data.title = data.convId;
  1008. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  1009. // [rk_m_array addObject:data];
  1010. // }
  1011. // else if([lastElem isKindOfClass:[TIMVideoElem class]]){
  1012. // str = YZMsg(@"[视频]");
  1013. // TConversationCellData *data = [[TConversationCellData alloc] init];
  1014. // data.subTitle = str;
  1015. // data.unRead = [conv getUnReadMessageNum];
  1016. // data.lastConv = conv;
  1017. // data.head = TUIKitResource(@"default_group");
  1018. // data.convId = [conv getReceiver];
  1019. // data.timestamp = msg.timestamp;
  1020. // data.convType = (TConvType)[conv getType];
  1021. // data.title = data.convId;
  1022. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  1023. // [rk_m_array addObject:data];
  1024. // }
  1025. // else if([lastElem isKindOfClass:[TIMFaceElem class]]){
  1026. // str = @"[动画表情]";
  1027. // TConversationCellData *data = [[TConversationCellData alloc] init];
  1028. // data.subTitle = str;
  1029. // data.unRead = [conv getUnReadMessageNum];
  1030. // data.lastConv = conv;
  1031. // data.head = TUIKitResource(@"default_group");
  1032. // data.convId = [conv getReceiver];
  1033. // data.timestamp = msg.timestamp;
  1034. // data.convType = (TConvType)[conv getType];
  1035. // data.title = data.convId;
  1036. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  1037. // [rk_m_array addObject:data];
  1038. // }
  1039. // else if([lastElem isKindOfClass:[TIMFileElem class]]){
  1040. // str = @"[文件]";
  1041. // TConversationCellData *data = [[TConversationCellData alloc] init];
  1042. // data.subTitle = str;
  1043. // data.unRead = [conv getUnReadMessageNum];
  1044. // data.lastConv = conv;
  1045. // data.head = TUIKitResource(@"default_group");
  1046. // data.convId = [conv getReceiver];
  1047. // data.timestamp = msg.timestamp;
  1048. // data.convType = (TConvType)[conv getType];
  1049. // data.title = data.convId;
  1050. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  1051. // [rk_m_array addObject:data];
  1052. // }
  1053. // else if([lastElem isKindOfClass:[TIMLocationElem class]]){
  1054. // str = YZMsg(@"[位置]");
  1055. // TConversationCellData *data = [[TConversationCellData alloc] init];
  1056. // data.subTitle = str;
  1057. // data.unRead = [conv getUnReadMessageNum];
  1058. // data.lastConv = conv;
  1059. // data.head = TUIKitResource(@"default_group");
  1060. // data.convId = [conv getReceiver];
  1061. // data.timestamp = msg.timestamp;
  1062. // data.convType = (TConvType)[conv getType];
  1063. // data.title = data.convId;
  1064. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  1065. // [rk_m_array addObject:data];
  1066. // }
  1067. // else if ([lastElem isKindOfClass:[TIMGroupTipsElem class]]) {
  1068. // TIMGroupTipsElem *tips = (TIMGroupTipsElem *)lastElem;
  1069. // //NSLog(@"xxxxxxx:=====:%@",tips.userList);
  1070. // switch (tips.type) {
  1071. // case TIM_GROUP_TIPS_TYPE_KICKED: {
  1072. // NSLog(@"im_tips_kicked:%@===ID:%@",tips.userList,tips.group);
  1073. // dispatch_group_enter(imListGroup);
  1074. // dispatch_group_async(imListGroup, group_queue, ^{
  1075. // [[YBImManager shareInstance] transformInfoWithList:tips.userList finish:^(NSString *transformStr) {
  1076. // NSString *keckedStr = [NSString stringWithFormat:@"\"%@\"%@",transformStr,YZMsg(@"退出群组")];
  1077. // TConversationCellData *data = [[TConversationCellData alloc] init];
  1078. // data.subTitle = keckedStr;
  1079. // data.unRead = [conv getUnReadMessageNum];
  1080. // data.lastConv = conv;
  1081. // data.head = TUIKitResource(@"default_group");
  1082. // data.convId = [conv getReceiver];
  1083. // data.timestamp = msg.timestamp;
  1084. // data.convType = (TConvType)[conv getType];
  1085. // data.title = data.convId;
  1086. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  1087. // [rk_m_array addObject:data];
  1088. // dispatch_group_leave(imListGroup);
  1089. // }];
  1090. // });
  1091. // }break;
  1092. // case TIM_GROUP_TIPS_TYPE_INVITE: {
  1093. // NSLog(@"im_tips_invite:%@===ID:%@",tips.userList,tips.group);
  1094. // for (NSString *getStr in tips.userList) {
  1095. // if ([getStr isEqual:[Config getOwnID]]) {
  1096. // [[NSNotificationCenter defaultCenter] postNotificationName:ybImConveEvent object:nil userInfo:nil];
  1097. // }
  1098. // }
  1099. // dispatch_group_enter(imListGroup);
  1100. // dispatch_group_async(imListGroup, group_queue, ^{
  1101. // [[YBImManager shareInstance] transformInfoWithList:tips.userList finish:^(NSString *transformStr) {
  1102. // NSString *inviteStr = [NSString stringWithFormat:@"\"%@\"%@",transformStr,YZMsg(@"加入群组")];
  1103. // TConversationCellData *data = [[TConversationCellData alloc] init];
  1104. // data.subTitle = inviteStr;
  1105. // data.unRead = [conv getUnReadMessageNum];
  1106. // data.lastConv = conv;
  1107. // data.head = TUIKitResource(@"default_group");
  1108. // data.convId = [conv getReceiver];
  1109. // data.timestamp = msg.timestamp;
  1110. // data.convType = (TConvType)[conv getType];
  1111. // data.title = data.convId;
  1112. // data.time = [PublicObj getDateDisplayString:msg.timestamp];
  1113. // [rk_m_array addObject:data];
  1114. // dispatch_group_leave(imListGroup);
  1115. // }];
  1116. // });
  1117. // }break;
  1118. // default:
  1119. // break;
  1120. // }
  1121. // }else {
  1122. // continue;
  1123. // }
  1124. // }
  1125. // }
  1126. // dispatch_group_notify(imListGroup, group_queue, ^{
  1127. // //NSLog(@"last-finish");
  1128. // if (finish) {
  1129. // finish([rk_m_array mutableCopy]);
  1130. // }
  1131. // });
  1132. //}
  1133. #pragma mark - 更新腾讯云用户资料
  1134. //-(void)updateUserInfoToTxWithParam:(NSDictionary *)param; {
  1135. //
  1136. // NSString *yb_age = strFormat([param valueForKey:@"age"]);
  1137. // NSString *yb_avatar = strFormat([param valueForKey:@"avatar"]);
  1138. // NSString *yb_city = strFormat([param valueForKey:@"city"]);
  1139. // NSString *yb_user_nickname = strFormat([param valueForKey:@"user_nickname"]);
  1140. // NSString *yb_sex = strFormat([param valueForKey:@"sex"]);
  1141. // NSString *yb_signature = strFormat([param valueForKey:@"signature"]);
  1142. //
  1143. // NSMutableDictionary *userProfileDic = [NSMutableDictionary dictionary];
  1144. //
  1145. // NSString *ageKey = [TIMProfileTypeKey_Custom_Prefix stringByAppendingString:IMKey_Custom_Suffix_Age];
  1146. // NSString *avatarKey = [TIMProfileTypeKey_Custom_Prefix stringByAppendingString:IMKey_Custom_Suffix_Avatar];
  1147. // NSString *cityKey = [TIMProfileTypeKey_Custom_Prefix stringByAppendingString:IMKey_Custom_Suffix_City];
  1148. // NSString *nameKey = [TIMProfileTypeKey_Custom_Prefix stringByAppendingString:IMKey_Custom_Suffix_Nickname];
  1149. // NSString *sexKey = [TIMProfileTypeKey_Custom_Prefix stringByAppendingString:IMKey_Custom_Suffix_Sex];
  1150. // NSString *signKey = [TIMProfileTypeKey_Custom_Prefix stringByAppendingString:IMKey_Custom_Suffix_Sign];
  1151. //
  1152. // if (![PublicObj checkNull:yb_age]) {
  1153. // [userProfileDic setObject:yb_age forKey:ageKey];
  1154. // }
  1155. // if (![PublicObj checkNull:yb_avatar]) {
  1156. // [userProfileDic setObject:yb_avatar forKey:avatarKey];
  1157. // }
  1158. // if (![PublicObj checkNull:yb_city]) {
  1159. // [userProfileDic setObject:yb_city forKey:cityKey];
  1160. // }
  1161. // if (![PublicObj checkNull:yb_user_nickname]) {
  1162. // [userProfileDic setObject:yb_user_nickname forKey:nameKey];
  1163. // }
  1164. // if (![PublicObj checkNull:yb_sex]) {
  1165. // [userProfileDic setObject:yb_sex forKey:sexKey];
  1166. // }
  1167. // if (![PublicObj checkNull:yb_signature]) {
  1168. // [userProfileDic setObject:yb_signature forKey:signKey];
  1169. // }
  1170. // if ([userProfileDic allKeys].count<=0) {
  1171. // return;
  1172. // }
  1173. // TIMFriendshipManager *imProfile = [TIMFriendshipManager sharedInstance];
  1174. // int isOk = [imProfile modifySelfProfile:[userProfileDic mutableCopy] succ:^{
  1175. // //NSLog(@"im_update_user_suc:%@",userProfileDic);
  1176. // } fail:^(int code, NSString *msg) {
  1177. // NSLog(@"im_update_user_fail:%d-msg:%@",code,msg);
  1178. // }];
  1179. // NSLog(@"im_update_user_isOK:%d",isOk);
  1180. //
  1181. //}
  1182. #pragma mark - 获取加入的群组
  1183. //-(void)getJoinGroupList:(ImGroupListBlock)imGroupList; {
  1184. // TIMGroupManager *groupManager = [TIMGroupManager sharedInstance];
  1185. // int isOk = [groupManager getGroupList:^(NSArray *groupList) {
  1186. // if (imGroupList) {
  1187. // imGroupList(groupList);
  1188. // }
  1189. // } fail:^(int code, NSString *msg) {
  1190. // if (imGroupList) {
  1191. // imGroupList(@[]);
  1192. // }
  1193. // }];
  1194. // if (isOk != 0 && imGroupList) {
  1195. // imGroupList(@[]);
  1196. // }
  1197. //}
  1198. #pragma mark - 群消息转换
  1199. //-(void)transformInfoWithList:(NSArray *)list finish:(ImTransformBlock)finish {
  1200. // NSString *transformStr = @"";
  1201. // TIMFriendshipManager *imProfile = [TIMFriendshipManager sharedInstance];
  1202. // int isOk = [imProfile getUsersProfile:list forceUpdate:YES succ:^(NSArray<TIMUserProfile *> *profiles) {
  1203. // NSMutableArray *m_array = [NSMutableArray array];
  1204. // for (TIMUserProfile * profile in profiles) {
  1205. // NSString *nameStr = [PublicObj transformToStringWithData:[profile.customInfo valueForKey:IMKey_Custom_Suffix_Nickname]];
  1206. // [m_array addObject:nameStr];
  1207. // }
  1208. // NSString *users = [m_array componentsJoinedByString:@"、"];
  1209. // if (finish) {
  1210. // finish(users);
  1211. // }
  1212. // } fail:^(int code, NSString *msg) {
  1213. // if (finish) {
  1214. // finish(transformStr);
  1215. // }
  1216. // }];
  1217. // if (isOk != 0 && finish) {
  1218. // finish(transformStr);
  1219. // }
  1220. //}
  1221. -(TConversationCellData *)createEmptyCellDataWithId:(NSString *)convid {
  1222. TConversationCellData *data = [[TConversationCellData alloc] init];
  1223. data.subTitle = @"";
  1224. data.unRead = 0;
  1225. // data.lastConv = nil;
  1226. data.head = TUIKitResource(@"default_group");
  1227. data.convId = convid;
  1228. data.timestamp = [NSDate date];
  1229. data.convType = TConv_Type_C2C;
  1230. data.title = data.convId;
  1231. data.time = [PublicObj getDateDisplayString:data.timestamp];
  1232. return data;
  1233. }
  1234. //-(void)clearUnreadConvId:(NSString *)convid sendNot:(BOOL)send{
  1235. // TIMConversation *conv = [[TIMManager sharedInstance] getConversation:TIM_C2C receiver:convid];
  1236. // [conv setReadMessage:nil succ:^{
  1237. // NSLog(@"rk_clear_suc");
  1238. // } fail:^(int code, NSString *msg) {
  1239. // NSLog(@"rk_clear_fail");
  1240. // }];
  1241. // if (send) {
  1242. // [[NSNotificationCenter defaultCenter] postNotificationName:TUIKitNotification_TIMCancelunread object:nil];
  1243. // }
  1244. //}
  1245. //-(void)sendClearNot {
  1246. // [[NSNotificationCenter defaultCenter] postNotificationName:TUIKitNotification_TIMCancelunread object:nil];
  1247. //}
  1248. @end
  1249. /*
  1250. #pragma mark - 获取最后一条消息 02
  1251. - (void)getLastDisplayString:(TIMConversation *)conv finish:(ImTransformBlock)finish;{
  1252. if (!finish) {
  1253. return;
  1254. }
  1255. NSString *str = @"";
  1256. TIMMessageDraft *draft = [conv getDraft];
  1257. TIMMessage *msg = [conv getLastMsg];
  1258. if(draft && draft.elemCount>0){
  1259. TIMElem *draftElem = [draft getElem:(draft.elemCount-1)];
  1260. if([draftElem isKindOfClass:[TIMTextElem class]]){
  1261. TIMTextElem *text = (TIMTextElem *)draftElem;
  1262. str = [NSString stringWithFormat:@"[%@]%@", YZMsg(@"草稿"),text.text];
  1263. finish(str);
  1264. } else{
  1265. finish(@"no msg");
  1266. }
  1267. ///return str;
  1268. }else if(msg.status == TIM_MSG_STATUS_LOCAL_REVOKED){
  1269. if(msg.isSelf || [[msg getConversation] getType] == TIM_C2C){
  1270. //return YZMsg(@"你撤回了一条消息");
  1271. NSString *revokedStr = msg.isSelf ? YZMsg(@"你撤回了一条消息"):YZMsg(@"对方撤回了一条消息");
  1272. finish(revokedStr);
  1273. } else if([[msg getConversation] getType] == TIM_GROUP){
  1274. //return YZMsg(@"对方撤回了一条消息");
  1275. TIMFriendshipManager *imProfile = [TIMFriendshipManager sharedInstance];
  1276. int revokedOk = [imProfile getUsersProfile:@[msg.sender] forceUpdate:YES succ:^(NSArray<TIMUserProfile *> *profiles) {
  1277. TIMUserProfile * profile = [profiles lastObject];
  1278. NSString *nameStr = [PublicObj transformToStringWithData:[profile.customInfo valueForKey:IMKey_Custom_Suffix_Nickname]];
  1279. NSString *revokedStr = [NSString stringWithFormat:@"\"%@\"%@",nameStr,YZMsg(@"撤回了一条消息")];
  1280. // NSDictionary *notDic = @{@"type":@"1",
  1281. // @"groupid":[msg getConversation].getReceiver,
  1282. // @"showStr":revokedStr,
  1283. // };
  1284. // [[NSNotificationCenter defaultCenter] postNotificationName:ybImConveEvent object:nil userInfo:notDic];
  1285. finish(revokedStr);
  1286. } fail:^(int code, NSString *msg) {
  1287. finish(@"getlast fail");
  1288. }];
  1289. if (revokedOk != 0) {
  1290. finish(@"getlast fail code");
  1291. }
  1292. }else {
  1293. finish(@"getlast fail type");
  1294. }
  1295. }else {
  1296. TIMElem *lastElem = [msg getElem:(msg.elemCount-1)];
  1297. if([lastElem isKindOfClass:[TIMTextElem class]]){
  1298. TIMTextElem *text = (TIMTextElem *)lastElem;
  1299. str = text.text;
  1300. if (finish) {
  1301. finish(str);
  1302. }
  1303. }
  1304. else if([lastElem isKindOfClass:[TIMCustomElem class]]){
  1305. TIMCustomElem *custom = (TIMCustomElem *)lastElem;
  1306. //str = custom.ext;
  1307. NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:custom.data options:NSJSONReadingMutableContainers error:nil];
  1308. if ([strFormat([jsonDic valueForKey:@"method"]) isEqual:@"sendUserGift"] ||
  1309. [strFormat([jsonDic valueForKey:@"method"]) isEqual:@"sendOvoGift"]) {
  1310. str = [NSString stringWithFormat:@"[%@]",strFormat([jsonDic valueForKey:@"name"])];
  1311. }else if ([strFormat([jsonDic valueForKey:@"method"]) isEqual:@"call"]){
  1312. str = YZMsg(@"[通话]");
  1313. }
  1314. finish(str);
  1315. }
  1316. else if([lastElem isKindOfClass:[TIMImageElem class]]){
  1317. str = YZMsg(@"[图片]");
  1318. finish(str);
  1319. }
  1320. else if([lastElem isKindOfClass:[TIMSoundElem class]]){
  1321. str = YZMsg(@"[语音]");
  1322. finish(str);
  1323. }
  1324. else if([lastElem isKindOfClass:[TIMVideoElem class]]){
  1325. str = YZMsg(@"[视频]");
  1326. finish(str);
  1327. }
  1328. else if([lastElem isKindOfClass:[TIMFaceElem class]]){
  1329. str = @"[动画表情]";
  1330. finish(str);
  1331. }
  1332. else if([lastElem isKindOfClass:[TIMFileElem class]]){
  1333. str = @"[文件]";
  1334. finish(str);
  1335. }else if ([lastElem isKindOfClass:[TIMGroupTipsElem class]]) {
  1336. TIMGroupTipsElem *tips = (TIMGroupTipsElem *)lastElem;
  1337. //NSLog(@"xxxxxxx:=====:%@",tips.userList);
  1338. switch (tips.type) {
  1339. case TIM_GROUP_TIPS_TYPE_KICKED: {
  1340. NSLog(@"im_tips_kicked:%@===ID:%@",tips.userList,tips.group);
  1341. [[YBImManager shareInstance] transformInfoWithList:tips.userList finish:^(NSString *transformStr) {
  1342. NSString *keckedStr = [NSString stringWithFormat:@"\"%@\"%@",transformStr,YZMsg(@"退出群组")];
  1343. // NSDictionary *notDic = @{@"type":@"1",
  1344. // @"groupid":[msg getConversation].getReceiver,
  1345. // @"showStr":keckedStr,
  1346. // };
  1347. // [[NSNotificationCenter defaultCenter] postNotificationName:ybImConveEvent object:nil userInfo:notDic];
  1348. finish(keckedStr);
  1349. }];
  1350. }break;
  1351. case TIM_GROUP_TIPS_TYPE_INVITE: {
  1352. NSLog(@"im_tips_invite:%@===ID:%@",tips.userList,tips.group);
  1353. [[YBImManager shareInstance] transformInfoWithList:tips.userList finish:^(NSString *transformStr) {
  1354. NSString *inviteStr = [NSString stringWithFormat:@"\"%@\"%@",transformStr,YZMsg(@"加入群组")];
  1355. // NSDictionary *notDic = @{@"type":@"1",
  1356. // @"groupid":[msg getConversation].getReceiver,
  1357. // @"showStr":inviteStr,
  1358. // };
  1359. // [[NSNotificationCenter defaultCenter] postNotificationName:ybImConveEvent object:nil userInfo:notDic];
  1360. for (NSString *getStr in tips.userList) {
  1361. if ([getStr isEqual:[Config getOwnID]]) {
  1362. [[NSNotificationCenter defaultCenter] postNotificationName:ybImConveEvent object:nil userInfo:nil];
  1363. }
  1364. }
  1365. finish(inviteStr);
  1366. }];
  1367. }break;
  1368. default:{
  1369. finish(@"no last");
  1370. }break;
  1371. }
  1372. }else {
  1373. finish(@"no last");
  1374. }
  1375. }
  1376. }
  1377. */
  1378. /*
  1379. #pragma mark - 获取最后一条消息 01
  1380. - (NSString *)getLastDisplayString:(TIMConversation *)conv{
  1381. NSString *str = @"";
  1382. TIMMessageDraft *draft = [conv getDraft];
  1383. if(draft){
  1384. for (int i = 0; i < draft.elemCount; ++i) {
  1385. TIMElem *elem = [draft getElem:i];
  1386. if([elem isKindOfClass:[TIMTextElem class]]){
  1387. TIMTextElem *text = (TIMTextElem *)elem;
  1388. str = [NSString stringWithFormat:@"[%@]%@", YZMsg(@"草稿"),text.text];
  1389. break;
  1390. } else{
  1391. continue;
  1392. }
  1393. }
  1394. return str;
  1395. }
  1396. TIMMessage *msg = [conv getLastMsg];
  1397. if(msg.status == TIM_MSG_STATUS_LOCAL_REVOKED){
  1398. if(msg.isSelf){
  1399. return YZMsg(@"你撤回了一条消息");
  1400. } else{
  1401. return YZMsg(@"对方撤回了一条消息");
  1402. }
  1403. }
  1404. for (int i = 0; i < msg.elemCount; ++i) {
  1405. TIMElem *elem = [msg getElem:i];
  1406. if([elem isKindOfClass:[TIMTextElem class]]){
  1407. TIMTextElem *text = (TIMTextElem *)elem;
  1408. str = text.text;
  1409. break;
  1410. }
  1411. else if([elem isKindOfClass:[TIMCustomElem class]]){
  1412. TIMCustomElem *custom = (TIMCustomElem *)elem;
  1413. //str = custom.ext;
  1414. NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:custom.data options:NSJSONReadingMutableContainers error:nil];
  1415. if ([strFormat([jsonDic valueForKey:@"method"]) isEqual:@"sendUserGift"] ||
  1416. [strFormat([jsonDic valueForKey:@"method"]) isEqual:@"sendOvoGift"]) {
  1417. str = [NSString stringWithFormat:@"[%@]",strFormat([jsonDic valueForKey:@"name"])];
  1418. }else if ([strFormat([jsonDic valueForKey:@"method"]) isEqual:@"call"]){
  1419. str = YZMsg(@"[通话]");
  1420. }
  1421. break;
  1422. }
  1423. else if([elem isKindOfClass:[TIMImageElem class]]){
  1424. str = YZMsg(@"[图片]");
  1425. break;
  1426. }
  1427. else if([elem isKindOfClass:[TIMSoundElem class]]){
  1428. str = YZMsg(@"[语音]");
  1429. break;
  1430. }
  1431. else if([elem isKindOfClass:[TIMVideoElem class]]){
  1432. str = YZMsg(@"[视频]");
  1433. break;
  1434. }
  1435. else if([elem isKindOfClass:[TIMFaceElem class]]){
  1436. str = @"[动画表情]";
  1437. break;
  1438. }
  1439. else if([elem isKindOfClass:[TIMFileElem class]]){
  1440. str = @"[文件]";
  1441. break;
  1442. }
  1443. //else if([elem isKindOfClass:[TIMGroupSystemElem class]]){
  1444. // TIMGroupSystemElem *custom = (TIMGroupSystemElem *)elem;
  1445. // NSLog(@"last_im_group:=======%ld",(long)custom.type);
  1446. //}
  1447. else if([elem isKindOfClass:[TIMGroupTipsElem class]]){
  1448. TIMGroupTipsElem *tips = (TIMGroupTipsElem *)elem;
  1449. NSLog(@"xxxxcccccc:%ld",(long)tips.type);
  1450. switch (tips.type) {
  1451. case TIM_GROUP_TIPS_TYPE_INFO_CHANGE: {
  1452. for (TIMGroupTipsElemGroupInfo *info in tips.groupChangeList) {
  1453. switch (info.type) {
  1454. case TIM_GROUP_INFO_CHANGE_GROUP_NAME: {
  1455. str = [NSString stringWithFormat:@"\"%@\"修改群名为\"%@\"", tips.opUser, info.value];
  1456. } break;
  1457. case TIM_GROUP_INFO_CHANGE_GROUP_INTRODUCTION: {
  1458. str = [NSString stringWithFormat:@"\"%@\"修改群简介为\"%@\"", tips.opUser, info.value];
  1459. }break;
  1460. case TIM_GROUP_INFO_CHANGE_GROUP_NOTIFICATION: {
  1461. str = [NSString stringWithFormat:@"\"%@\"修改群公告为\"%@\"", tips.opUser, info.value];
  1462. } break;
  1463. case TIM_GROUP_INFO_CHANGE_GROUP_OWNER: {
  1464. str = [NSString stringWithFormat:@"\"%@\"修改群主为\"%@\"", tips.opUser, info.value];
  1465. } break;
  1466. default:
  1467. break;
  1468. }
  1469. }
  1470. } break;
  1471. case TIM_GROUP_TIPS_TYPE_KICKED: {
  1472. NSString *users = [tips.userList componentsJoinedByString:@"、"];
  1473. str = [NSString stringWithFormat:@"\"%@\"将\"%@\"剔出群组", tips.opUser, users];
  1474. }break;
  1475. case TIM_GROUP_TIPS_TYPE_INVITE: {
  1476. NSString *users = [tips.userList componentsJoinedByString:@"、"];
  1477. str = [NSString stringWithFormat:@"\"%@\"邀请\"%@\"加入群组", tips.opUser, users];
  1478. }break;
  1479. default:
  1480. break;
  1481. }
  1482. }else{
  1483. continue;
  1484. }
  1485. }
  1486. return str;
  1487. }
  1488. */