| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- //
- // JXMultipleLogin.m
- // shiku_im
- //
- // Created by p on 2018/5/22.
- // Copyright © 2018年 Reese. All rights reserved.
- //
- #import "JXMultipleLogin.h"
- #import "JXDevice.h"
- @implementation JXMultipleLogin
- static JXMultipleLogin *sharedManager;
- +(JXMultipleLogin*)sharedInstance{
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- sharedManager = [[JXMultipleLogin alloc] init];
- });
-
- return sharedManager;
- }
- -(id)init{
- self = [super init];
- if (self) {
- _deviceArr = [[JXDevice sharedInstance] fetchAllDeviceFromLocal];
- }
-
- return self;
- }
- // 发送上线消息,通知其他端自己上线
- - (void)sendOnlineMessage {
- JXMessageObject *msg=[[JXMessageObject alloc]init];
- msg.timeSend = [NSDate date];
- msg.fromUserId = MY_USER_ID;
- msg.content = @"1";
-
- msg.toUserId = MY_USER_ID;
- msg.type = [NSNumber numberWithInt:kWCMessageTypeMultipleLogin];
- [g_xmpp sendMessage:msg roomName:nil];//发送消息
- }
- // 发送下线消息,通知其他端自己下线
- - (void)sendOfflineMessage{
- JXMessageObject *msg=[[JXMessageObject alloc]init];
- msg.timeSend = [NSDate date];
- msg.fromUserId = MY_USER_ID;
- msg.content = @"0";
-
- msg.toUserId = MY_USER_ID;
- msg.type = [NSNumber numberWithInt:kWCMessageTypeMultipleLogin];
- [g_xmpp sendMessage:msg roomName:nil];//发送消息
- }
- // 收到登录验证回执或收到200消息,判断其他端是否在线
- - (void)upDateOtherOnline:(XMPPMessage *)message isOnLine:(NSNumber *)isOnLine{
-
- NSString *from;
- // NSString *to = [message toStr];
- NSRange range = [from rangeOfString:@"/"];
- if (range.location != NSNotFound) {
- NSString *str = [from substringFromIndex:range.location + 1];
-
- // 如果是自己端给的回执,不做处理
- if ([str isEqualToString:@"ios"] || !str) {
- return;
- }
-
- for (JXDevice *device in _deviceArr) {
- if ([device.userId rangeOfString:str].location != NSNotFound) {
- [device updateIsOnLine:isOnLine userId:device.userId];
- [device updateIsSendRecipt:isOnLine userId:device.userId];
- device.isOnLine = isOnLine;
- device.isSendRecipt = isOnLine;
- device.timerNum = 0;
- if ([isOnLine intValue] == 1) {
- device.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(deviceTimerAction:) userInfo:nil repeats:YES];
- }else {
- [device.timer invalidate];
- device.timer = nil;
- }
- [g_notify postNotificationName:kUpdateIsOnLineMultipointLogin object:nil];
- break;
- }
- }
- }
-
- }
- // isOnline统一全部置状态
- - (void)upDateAllDeviceOnline:(NSNumber *)isOnline {
-
- for (JXDevice *device in _deviceArr) {
- device.isOnLine = isOnline;
- device.isSendRecipt = isOnline;
- [device updateIsOnLine:isOnline userId:device.userId];
- [device updateIsSendRecipt:isOnline userId:device.userId];
- [g_notify postNotificationName:kUpdateIsOnLineMultipointLogin object:nil];
- }
- }
- // 转发消息给其他端
- - (void) relaySendMessage:(XMPPMessage *)message msg:(JXMessageObject *)msg {
-
- if ([msg.type intValue] == kWCMessageTypeMultipleLogin || msg.isGroup) {
- return;
- }
- // 转发消息不再转发
- NSString *from ;
- NSRange range = [from rangeOfString:@"@"];
- NSString *fromId = [from substringToIndex:range.location];
- if ([fromId isEqualToString:MY_USER_ID]) {
-
- NSRange range1 = [from rangeOfString:@"/"];
- NSString *str = [from substringFromIndex:range1.location + 1];
- for (JXDevice *device in _deviceArr) {
- if ([device.userId rangeOfString:str].location != NSNotFound) {
- device.timerNum = 0;
- }
- }
- return;
- }
- for (JXDevice *device in _deviceArr) {
- if ([device.isOnLine intValue] == 1) {
- [g_xmpp relaySendMessage:msg relayUserId:device.userId roomName:nil];
- }
- }
- }
- - (void)deviceTimerAction:(NSTimer *)timer {
- for (JXDevice *device in _deviceArr) {
- if (timer == device.timer) {
- device.timerNum ++;
- if (device.timerNum >= 300) {
- device.timerNum = 0;
- if ([device.isSendRecipt intValue] == 1) {
- device.isSendRecipt = [NSNumber numberWithInt:0];
- [device updateIsSendRecipt:device.isSendRecipt userId:device.userId];
- [self sendOnlineMessage];
- }else {
- device.isOnLine = [NSNumber numberWithInt:0];
- [device updateIsOnLine:device.isOnLine userId:device.userId];
- [device.timer invalidate];
- device.timer = nil;
- [g_notify postNotificationName:kUpdateIsOnLineMultipointLogin object:nil];
- }
- }
- break;
- }
- }
- }
- // 其他端在线状态更新
- - (void)upDateOtherOnlineWithResources:(NSArray *)resources {
-
- for (JXDevice *device in _deviceArr) {
-
- BOOL flag = NO;
- for (NSString *str in resources) {
- // 如果是自己端给的回执,不做处理
- if ([str isEqualToString:@"ios"] || !str || str.length <= 0) {
- continue;
- }
-
- if ([device.userId rangeOfString:str].location != NSNotFound) {
- flag = YES;
- break;
- }
- }
- if (flag) {
- NSNumber *isOnLine = [NSNumber numberWithInt:1];
- [device updateIsOnLine:isOnLine userId:device.userId];
- [device updateIsSendRecipt:isOnLine userId:device.userId];
- device.isOnLine = isOnLine;
- device.isSendRecipt = isOnLine;
- break;
- }else {
-
- NSNumber *isOnLine = [NSNumber numberWithInt:0];
- [device updateIsOnLine:isOnLine userId:device.userId];
- [device updateIsSendRecipt:isOnLine userId:device.userId];
- device.isOnLine = isOnLine;
- device.isSendRecipt = isOnLine;
- }
- }
-
- }
- @end
|