Получать уведомления при выходе из маяков

Я работаю с тремя iBeacon, чтобы найти их диапазон на iPhone / iPad для процедуры посещаемости. Мне нужно, чтобы три маяка могли быть идентифицированы приложением, и когда пользователь входит в любой регион маяка, он должен получать уведомление о том, что он вошел в систему. И он должен выходить из системы только тогда, когда пользователь выходит из всех трех маяков.

В то же время пользователь не должен получать никаких уведомлений, если пользователь уже вошел в систему или когда он входит в новый маяк. (Означает, что пользователь изменил свою позицию с одного маяка на другой регион маяка).

Здесь в моем коде три маяка идентифицируются и регистрируются в уведомлении. Но он не выходит из системы при выходе из трех маяков и не выходит из системы, когда находится внутри региона и переключается с одного маяка на другой.

Пожалуйста, помогите мне, кто-нибудь, чтобы решить мою проблему.

Вот мой код:

NSMutableDictionary *parameters = [[NSMutableDictionary alloc]init];
    [parameters setObject:EmpID.text forKey:@"eid"];
    [parameters setObject:@"entry" forKey:@"type"];

    NSLog(@"Params:%@",parameters);

    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    AFHTTPRequestOperationManager *sermanager = [AFHTTPRequestOperationManager manager];
    sermanager.responseSerializer = [AFHTTPResponseSerializer serializer];
    sermanager.requestSerializer = [AFJSONRequestSerializer serializer];
    [sermanager.requestSerializer setValue:@"parse-application-id-removed" forHTTPHeaderField:@"X-Parse-Application-Id"];
    [sermanager.requestSerializer setValue:@"parse-rest-api-key-removed" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
    [sermanager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    sermanager.securityPolicy.allowInvalidCertificates = YES;


    NSString *urlString=[NSString stringWithFormat:@"http://livmob.com/beacon/index.php/api/Employee/getEmployeeDetails"];

    [sermanager POST:urlString parameters:parameters  success:^(AFHTTPRequestOperation *operation, id responseObject)
     {
         NSError *error = nil;
         NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error];
         NSLog(@"JSON:%@",JSON);

         [MBProgressHUD hideHUDForView:self.view animated:YES];
         NSString *empIdGet=[JSON valueForKeyPath:@"Response.employeeDetail.eid"][0];
         NSArray *bloodGroup=[JSON valueForKeyPath:@"Response.employeeDetail.bloodGroup"][0];
         NSArray *department=[JSON valueForKeyPath:@"Response.employeeDetail.department"][0];
         NSArray *dob=[JSON valueForKeyPath:@"Response.employeeDetail.dob"][0];
         NSArray *email=[JSON valueForKeyPath:@"Response.employeeDetail.email"][0];
         NSArray *name=[JSON valueForKeyPath:@"Response.employeeDetail.name"][0];
         NSArray *phone=[JSON valueForKeyPath:@"Response.employeeDetail.phone"][0];
         NSArray *photo=[JSON valueForKeyPath:@"Response.employeeDetail.photo"][0];
         NSArray *role=[JSON valueForKeyPath:@"Response.employeeDetail.role"][0];

         empid=empIdGet;

         [[NSUserDefaults standardUserDefaults]setObject:empIdGet forKey:@"EMPID"];
         [[NSUserDefaults standardUserDefaults]setObject:role forKey:@"EMP_ROLE"];
         [[NSUserDefaults standardUserDefaults]setObject:photo forKey:@"EMP_PHOTO"];
         [[NSUserDefaults standardUserDefaults]setObject:phone forKey:@"EMP_PHONE"];
         [[NSUserDefaults standardUserDefaults]setObject:name forKey:@"EMP_NAME"];
         [[NSUserDefaults standardUserDefaults]setObject:email forKey:@"EMP_EMAIL"];
         [[NSUserDefaults standardUserDefaults]setObject:dob forKey:@"EMP_DOB"];
         [[NSUserDefaults standardUserDefaults]setObject:department forKey:@"EMP_DEPT"];
         [[NSUserDefaults standardUserDefaults]setObject:bloodGroup forKey:@"EMP_BLOOD"];


         NSUUID * nearUUID =[[NSUUID alloc] initWithUUIDString:[NSString stringWithFormat:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"]];

         self.beaconRegion =[[CLBeaconRegion alloc]initWithProximityUUID:nearUUID identifier:@"near"];
         [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
         [self.locationManager startMonitoringForRegion:self.beaconRegion];
         UUIDStr = [nearUUID UUIDString];

         NSUUID *nearUUID1 =[[NSUUID alloc] initWithUUIDString:[NSString stringWithFormat:@"6CA02DDF-78A2-3F7E-DD54-238F91B19E57"]];

         self.beaconRegion1 =[[CLBeaconRegion alloc]initWithProximityUUID:nearUUID1 identifier:@"near"];

         [self.locationManager startRangingBeaconsInRegion:self.beaconRegion1];
         [self.locationManager startMonitoringForRegion:self.beaconRegion1];
         UUIDStr1 = [nearUUID1 UUIDString];

NSUUID *nearUUID2 =[[NSUUID alloc] initWithUUIDString:[NSString stringWithFormat:@"DD5D08FD-303F-4B8B-D8FB-89D491955B2E"]];

         self.beaconRegion1 =[[CLBeaconRegion alloc]initWithProximityUUID:nearUUID2 identifier:@"near"];

         [self.locationManager startRangingBeaconsInRegion:self.beaconRegion1];
         [self.locationManager startMonitoringForRegion:self.beaconRegion1];
         UUIDStr2 = [nearUUID2 UUIDString]; 

         [self entryMethod];

         self.proximityContentManager = [[ProximityContentManager alloc]
                                         initWithBeaconIDs:@[
                                                             [[BeaconID alloc] initWithUUIDString:@"6CA02DDF-78A2-3F7E-DD54-238F91B19E57" major:41073 minor:64330],
                                                             [[BeaconID alloc] initWithUUIDString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D" major:590 minor:16462],
                                                             [[BeaconID alloc] initWithUUIDString:@"DD5D08FD-303F-4B8B-D8FB-89D491955B2E" major:41749 minor:53281]
                                                             ]
                                         beaconContentFactory:[[CachingContentFactory alloc] initWithBeaconContentFactory:[BeaconDetailsCloudFactory new]]];
         self.proximityContentManager.delegate = self;

         [self.proximityContentManager startContentUpdates];

     }
             failure:^(AFHTTPRequestOperation *operation, NSError *error)
     {

         [MBProgressHUD hideHUDForView:self.view animated:YES];

         NSLog(@"Error:%@",error.localizedDescription);
     }];

    }
return YES;
}

- (void)proximityContentManager:(ProximityContentManager *)proximityContentManager didUpdateContent:(id)content
{

BeaconDetails *beaconDetails = content;
if (beaconDetails)
{
    NSLog(@"beaconDetails %@",beaconDetails.beaconName);
    beaconNameStr = beaconDetails.beaconName;
}
}

- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}


- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{

}


- (void)locationManager:(CLLocationManager *)manager
    didRangeBeacons:(NSArray *)beacons
           inRegion:(CLRegion *)region
{

NSLog(@"Own Beacons %@",beacons);

self.beaconsArray = beacons;


for (CLBeacon *beacon in self.beaconsArray)
{
    if (beacon.proximity == CLProximityImmediate)
    {
        NSLog(@"Own State Immediate %@",beaconNameStr);
    }
    else if (beacon.proximity == CLProximityNear)
    {
        NSLog(@"Own State Near %@",beaconNameStr);
    }
    else if (beacon.proximity == CLProximityFar)
    {
        NSLog(@"Own State Far %@",beaconNameStr);
    }
    else if (beacon.proximity == CLProximityUnknown)
    {
        NSLog(@"Own State Unknown %@",beaconNameStr);
    }
    else
    {
        NSLog(@"Own Exited %@",beaconNameStr);


    }
}
}


-(void)entryMethod
{

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"Already entered" forKey:@"userstatus"];

NSString *statusStr =[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"userstatus"]];

if ([statusStr isEqualToString:@"Already entered"])
{

[defaults synchronize];
NSString *empIdNew =[defaults objectForKey:@"EMPID"];

NSMutableDictionary *parameters = [[NSMutableDictionary alloc]init];
[parameters setObject:empIdNew forKey:@"eid"];
[parameters setObject:@"entry" forKey:@"type"];

NSLog(@"Params:%@",parameters);


AFHTTPRequestOperationManager *sermanager = [AFHTTPRequestOperationManager manager];
sermanager.responseSerializer = [AFHTTPResponseSerializer serializer];
sermanager.requestSerializer = [AFJSONRequestSerializer serializer];
[sermanager.requestSerializer setValue:@"parse-application-id-removed" forHTTPHeaderField:@"X-Parse-Application-Id"];
[sermanager.requestSerializer setValue:@"parse-rest-api-key-removed" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
[sermanager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
sermanager.securityPolicy.allowInvalidCertificates = YES;

NSString *urlString=[NSString stringWithFormat:@"http://livmob.com/beacon/index.php/api/Employee/employeeLogin"];

[sermanager POST:urlString parameters:parameters  success:^(AFHTTPRequestOperation *operation, id responseObject)
 {
     NSError *error = nil;
     NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error];
     NSLog(@"JSON:%@",JSON);

 }


         failure:^(AFHTTPRequestOperation *operation, NSError *error)
 {
     NSLog(@"Error");
 }];


NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
[defaults1 synchronize];
[defaults1 setValue:@"You are Time In" forKey:@"defaultStatus"];

SeconVC *second = (SeconVC *)[self.storyboard instantiateViewControllerWithIdentifier:@"SeconVC"];
[self.navigationController pushViewController:second animated:YES];
}

else {
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = [NSDate date];
notification.alertBody = @"You are Time In!";
notification.timeZone = [NSTimeZone defaultTimeZone];
notification.soundName = UILocalNotificationDefaultSoundName;
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}}
//*******************************didEnterRegion:***************************************//

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    [self.proximityContentManager startContentUpdates];

    NSLog(@"Emp ID:%@",empid);

    NSString *statusStr =[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"userstatus"]];

    if (![statusStr isEqualToString:@"Already entered"])
    {


        [NSObject cancelPreviousPerformRequestsWithTarget:self
                                         selector:@selector(PerformingDelay)
                                           object:nil];
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

        [defaults setObject:@"Already entered" forKey:@"userstatus"];
        [defaults synchronize];
        NSString *empIdNew =[defaults objectForKey:@"EMPID"];

            if ([UUIDStr isEqualToString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"] || [UUIDStr1 isEqualToString:@"6CA02DDF-78A2-3F7E-DD54-238F91B19E57"])
            {
                NSLog(@"you are Login into %@",beaconNameStr);

                NSMutableDictionary *parameters = [[NSMutableDictionary alloc]init];
                [parameters setObject:empIdNew forKey:@"eid"];
                [parameters setObject:@"entry" forKey:@"type"];

                NSLog(@"Params:%@",parameters);

                if (empid.length ==0)
                {
                    NSLog(@"No values are passed");
                }
                else
                {
                    [[NSUserDefaults standardUserDefaults]setObject:statusStrNew forKey:@"EMPID"];


                    NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
                    [defaults1 synchronize];
                    [defaults1 setValue:@"You are Time In" forKey:@"defaultStatus"];

                    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                    SeconVC *viewController = [storyboard instantiateViewControllerWithIdentifier:@"SeconVC"];

                    UILocalNotification *notification = [[UILocalNotification alloc] init];
                    notification.fireDate = [NSDate date];
                    notification.alertBody = @"You are Time In!";
                    notification.timeZone = [NSTimeZone defaultTimeZone];
                    notification.soundName = UILocalNotificationDefaultSoundName;
                    [[UIApplication sharedApplication] scheduleLocalNotification:notification];

                    if (timeStr.length ==0) {
                        NSLog(@"No values passed");
                    }
                    else{
                        NSMutableDictionary *parameters = [[NSMutableDictionary alloc]init];
                        [parameters setObject:timeStr forKey:@"logoutTime"];

                    AFHTTPRequestOperationManager *sermanager = [AFHTTPRequestOperationManager manager];
                    sermanager.responseSerializer = [AFHTTPResponseSerializer serializer];
                    sermanager.requestSerializer = [AFJSONRequestSerializer serializer];
                    [sermanager.requestSerializer setValue:@"parse-application-id-removed" forHTTPHeaderField:@"X-Parse-Application-Id"];
                    [sermanager.requestSerializer setValue:@"parse-rest-api-key-removed" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
                    [sermanager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
                    sermanager.securityPolicy.allowInvalidCertificates = YES;

                    NSString *urlString=[NSString stringWithFormat:@"http://livmob.com/beacon/index.php/api/Employee/employeeLogin"];

                    [sermanager POST:urlString parameters:parameters  success:^(AFHTTPRequestOperation *operation, id responseObject)
                     {
                         NSError *error = nil;
                         NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error];
                         NSLog(@"JSON:%@",JSON);

                     }
                             failure:^(AFHTTPRequestOperation *operation, NSError *error)
                     {
                         NSLog(@"Error");


                     }];
                    }
                }
            }
    }
    }

//*******************************Exit Functions****************//
-(void)PerformingDelay
{

        NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
        [defaults1 synchronize];
        [defaults1 setValue:@"You are Time Out" forKey:@"defaultStatus"];

        UILocalNotification *notification = [[UILocalNotification alloc] init];
        notification.fireDate = [NSDate date];
        notification.alertBody = @"You are Time Out!";
        notification.timeZone = [NSTimeZone defaultTimeZone];
        notification.soundName = UILocalNotificationDefaultSoundName;
        NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"You Left!"
                                                             forKey:@"Notify"];
        notification.userInfo = userDict;
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];


        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults synchronize];
        NSString *empId =[defaults objectForKey:@"EMPID"];
        [defaults setObject:@"User Left" forKey:@"userstatus"];

        if (empId.length ==0)
        {
            NSLog(@"No values are passed");
        }
        else
        {

            @try
            {
                NSMutableDictionary *parameters = [[NSMutableDictionary alloc]init];
                [parameters setObject:empId forKey:@"eid"];
                [parameters setObject:@"exit" forKey:@"type"];

                NSLog(@"Params:%@",parameters);


                NetworkStatus internetStatus = [reachability currentReachabilityStatus];
                if (internetStatus == NotReachable)
                {

                    UILocalNotification *notification = [[UILocalNotification alloc] init];

                    notification.fireDate = [NSDate date];

                    notification.alertBody = @"Internet connection is lost, your attendance status will not be updated. Please check your internet connection to update it.";

                    notification.timeZone = [NSTimeZone defaultTimeZone];

                    notification.soundName = UILocalNotificationDefaultSoundName;

                    [[UIApplication sharedApplication] scheduleLocalNotification:notification];

                    timeStr = [NSString stringWithFormat:@"%@",[NSDate date]];
                    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
                    [formatter setDateFormat:@"hh:mm:ss"];

                    NSDate *date = [formatter dateFromString:timeStr];

                    [[NSUserDefaults standardUserDefaults] setObject:date forKey:@"logoutTime"];

                }
                else
                {

                AFHTTPRequestOperationManager *sermanager = [AFHTTPRequestOperationManager manager];
                sermanager.responseSerializer = [AFHTTPResponseSerializer serializer];
                sermanager.requestSerializer = [AFJSONRequestSerializer serializer];
                [sermanager.requestSerializer setValue:@"parse-application-id-removed"  forHTTPHeaderField:@"X-Parse-Application-Id"];
                [sermanager.requestSerializer setValue:@"parse-rest-api-key-removed" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
                [sermanager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
                sermanager.securityPolicy.allowInvalidCertificates = YES;

                NSString *urlString=[NSString stringWithFormat:@"http://livmob.com/beacon/index.php/api/Employee/employeeLogin"];

                [sermanager POST:urlString parameters:parameters  success:^(AFHTTPRequestOperation *operation, id responseObject)
                 {
                     NSError *error = nil;
                     NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error];
                     NSLog(@"JSON:%@",JSON);

                 }
                         failure:^(AFHTTPRequestOperation *operation, NSError *error)
                 {
                     NSLog(@"Error");
                 }];
                            }
            }
            @catch (NSException *exception)
            {
                NSLog(@"Emp Id Error");
            }
        }
    }



- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{

[MBProgressHUD showHUDAddedTo:self.view animated:YES];

    [self performSelector:@selector(PerformingDelay) withObject:nil afterDelay:120.0];
    NSLog(@"User Logged Out %@", beaconNameStr);

    NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
    [defaults1 synchronize];
    [defaults1 setValue:@"You are Time Out" forKey:@"defaultStatus"];
}

Заранее спасибо!


person Abirami Bala    schedule 03.03.2016    source источник
comment
Это 423 строки кода. Вы значительно увеличите шансы на получение помощи, если сократите ее, сосредоточившись больше на минимальном в минимальном, полном и проверяемом примере (stackoverflow. com/help/mcve)   -  person heypiotr    schedule 03.03.2016


Ответы (1)


Ваш код слишком много для меня читать. Я действительно не пройти через это.

У вас есть 3 UUID для 3 маяков (регионов). При каждом входе/выходе iOS будет иметь обратный вызов didEnterRegion и didExitRegion независимо.

Что вам нужно сделать, так это использовать переменную для записи состояния 3 регионов, входящего или исходящего. И затем вы проверяете статус в каждом обратном вызове didEnterRegion/didExitRegion и имеете правило, как показано ниже:

сделалВведитеРегион:

если 0 в меняется на 1 в : сначала пользователь входит в регион

сделалExitRegion

если x в изменяется на 0 в ( x != 0): пользователь сначала полностью выходит из региона

Надеюсь, это поможет вам.

person melson.jao    schedule 04.03.2016
comment
Извините, поскольку я был новичком в этом (задавал вопросы), сделаю это позже. В любом случае спасибо за ваш ответ. это сработало для меня. и извините за поздний ответ. - person Abirami Bala; 16.08.2016