JXMultipleLogin.m 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //
  2. // JXMultipleLogin.m
  3. // shiku_im
  4. //
  5. // Created by p on 2018/5/22.
  6. // Copyright © 2018年 Reese. All rights reserved.
  7. //
  8. #import "JXMultipleLogin.h"
  9. #import "JXDevice.h"
  10. @implementation JXMultipleLogin
  11. static JXMultipleLogin *sharedManager;
  12. +(JXMultipleLogin*)sharedInstance{
  13. static dispatch_once_t onceToken;
  14. dispatch_once(&onceToken, ^{
  15. sharedManager = [[JXMultipleLogin alloc] init];
  16. });
  17. return sharedManager;
  18. }
  19. -(id)init{
  20. self = [super init];
  21. if (self) {
  22. _deviceArr = [[JXDevice sharedInstance] fetchAllDeviceFromLocal];
  23. }
  24. return self;
  25. }
  26. // 发送上线消息,通知其他端自己上线
  27. - (void)sendOnlineMessage {
  28. JXMessageObject *msg=[[JXMessageObject alloc]init];
  29. msg.timeSend = [NSDate date];
  30. msg.fromUserId = MY_USER_ID;
  31. msg.content = @"1";
  32. msg.toUserId = MY_USER_ID;
  33. msg.type = [NSNumber numberWithInt:kWCMessageTypeMultipleLogin];
  34. [g_xmpp sendMessage:msg roomName:nil];//发送消息
  35. }
  36. // 发送下线消息,通知其他端自己下线
  37. - (void)sendOfflineMessage{
  38. JXMessageObject *msg=[[JXMessageObject alloc]init];
  39. msg.timeSend = [NSDate date];
  40. msg.fromUserId = MY_USER_ID;
  41. msg.content = @"0";
  42. msg.toUserId = MY_USER_ID;
  43. msg.type = [NSNumber numberWithInt:kWCMessageTypeMultipleLogin];
  44. [g_xmpp sendMessage:msg roomName:nil];//发送消息
  45. }
  46. // 收到登录验证回执或收到200消息,判断其他端是否在线
  47. - (void)upDateOtherOnline:(XMPPMessage *)message isOnLine:(NSNumber *)isOnLine{
  48. NSString *from;
  49. // NSString *to = [message toStr];
  50. NSRange range = [from rangeOfString:@"/"];
  51. if (range.location != NSNotFound) {
  52. NSString *str = [from substringFromIndex:range.location + 1];
  53. // 如果是自己端给的回执,不做处理
  54. if ([str isEqualToString:@"ios"] || !str) {
  55. return;
  56. }
  57. for (JXDevice *device in _deviceArr) {
  58. if ([device.userId rangeOfString:str].location != NSNotFound) {
  59. [device updateIsOnLine:isOnLine userId:device.userId];
  60. [device updateIsSendRecipt:isOnLine userId:device.userId];
  61. device.isOnLine = isOnLine;
  62. device.isSendRecipt = isOnLine;
  63. device.timerNum = 0;
  64. if ([isOnLine intValue] == 1) {
  65. device.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(deviceTimerAction:) userInfo:nil repeats:YES];
  66. }else {
  67. [device.timer invalidate];
  68. device.timer = nil;
  69. }
  70. [g_notify postNotificationName:kUpdateIsOnLineMultipointLogin object:nil];
  71. break;
  72. }
  73. }
  74. }
  75. }
  76. // isOnline统一全部置状态
  77. - (void)upDateAllDeviceOnline:(NSNumber *)isOnline {
  78. for (JXDevice *device in _deviceArr) {
  79. device.isOnLine = isOnline;
  80. device.isSendRecipt = isOnline;
  81. [device updateIsOnLine:isOnline userId:device.userId];
  82. [device updateIsSendRecipt:isOnline userId:device.userId];
  83. [g_notify postNotificationName:kUpdateIsOnLineMultipointLogin object:nil];
  84. }
  85. }
  86. // 转发消息给其他端
  87. - (void) relaySendMessage:(XMPPMessage *)message msg:(JXMessageObject *)msg {
  88. if ([msg.type intValue] == kWCMessageTypeMultipleLogin || msg.isGroup) {
  89. return;
  90. }
  91. // 转发消息不再转发
  92. NSString *from ;
  93. NSRange range = [from rangeOfString:@"@"];
  94. NSString *fromId = [from substringToIndex:range.location];
  95. if ([fromId isEqualToString:MY_USER_ID]) {
  96. NSRange range1 = [from rangeOfString:@"/"];
  97. NSString *str = [from substringFromIndex:range1.location + 1];
  98. for (JXDevice *device in _deviceArr) {
  99. if ([device.userId rangeOfString:str].location != NSNotFound) {
  100. device.timerNum = 0;
  101. }
  102. }
  103. return;
  104. }
  105. for (JXDevice *device in _deviceArr) {
  106. if ([device.isOnLine intValue] == 1) {
  107. [g_xmpp relaySendMessage:msg relayUserId:device.userId roomName:nil];
  108. }
  109. }
  110. }
  111. - (void)deviceTimerAction:(NSTimer *)timer {
  112. for (JXDevice *device in _deviceArr) {
  113. if (timer == device.timer) {
  114. device.timerNum ++;
  115. if (device.timerNum >= 300) {
  116. device.timerNum = 0;
  117. if ([device.isSendRecipt intValue] == 1) {
  118. device.isSendRecipt = [NSNumber numberWithInt:0];
  119. [device updateIsSendRecipt:device.isSendRecipt userId:device.userId];
  120. [self sendOnlineMessage];
  121. }else {
  122. device.isOnLine = [NSNumber numberWithInt:0];
  123. [device updateIsOnLine:device.isOnLine userId:device.userId];
  124. [device.timer invalidate];
  125. device.timer = nil;
  126. [g_notify postNotificationName:kUpdateIsOnLineMultipointLogin object:nil];
  127. }
  128. }
  129. break;
  130. }
  131. }
  132. }
  133. // 其他端在线状态更新
  134. - (void)upDateOtherOnlineWithResources:(NSArray *)resources {
  135. for (JXDevice *device in _deviceArr) {
  136. BOOL flag = NO;
  137. for (NSString *str in resources) {
  138. // 如果是自己端给的回执,不做处理
  139. if ([str isEqualToString:@"ios"] || !str || str.length <= 0) {
  140. continue;
  141. }
  142. if ([device.userId rangeOfString:str].location != NSNotFound) {
  143. flag = YES;
  144. break;
  145. }
  146. }
  147. if (flag) {
  148. NSNumber *isOnLine = [NSNumber numberWithInt:1];
  149. [device updateIsOnLine:isOnLine userId:device.userId];
  150. [device updateIsSendRecipt:isOnLine userId:device.userId];
  151. device.isOnLine = isOnLine;
  152. device.isSendRecipt = isOnLine;
  153. break;
  154. }else {
  155. NSNumber *isOnLine = [NSNumber numberWithInt:0];
  156. [device updateIsOnLine:isOnLine userId:device.userId];
  157. [device updateIsSendRecipt:isOnLine userId:device.userId];
  158. device.isOnLine = isOnLine;
  159. device.isSendRecipt = isOnLine;
  160. }
  161. }
  162. }
  163. @end