El range y la proximidad del iBeacon es cochambroso

Estoy trabajando en una class para manejar todas mis testings de iBeacon. Su propósito es comenzar a search regiones, extender las balizas, identificarlas y luego enviar notifications. El código está debajo.

El problema que estoy teniendo es que la aplicación funciona muy lentamente, sé que los iBeacons tienen problemas de latencia y, a veces, simplemente dejan de funcionar (no identificarán un faro cercano). Mi código es desorderado, lo sé, tratando de orderar la lógica antes de trabajar en su limpieza. Me pregunto si he perdido una falla lógica aquí (y con eso quiero decir, ¡me pregunto qué fallas lógicas he presentado!).

#import "dcBeaconManager.h" @implementation dcBeaconManager @synthesize currentBeaconState; bool testRanging = false; int firstRegionEntenetworking = 0; int beaconsRangedCount = 0; - (void)initBeaconManager { NSLog(@"initBeaconManager called"); self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; NSUUID *uuid = [[NSUUID alloc]initWithUUIDString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"]; self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"digiConsRegion"]; [self.locationManager startMonitoringForRegion:self.beaconRegion]; [self.locationManager requestStateForRegion:self.beaconRegion]; currentBeaconState = @"initial"; } - (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { NSLog(@"Started looking for regions"); [self.locationManager requestStateForRegion:self.beaconRegion]; } - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { NSLog(@"Region discovenetworking"); if (firstRegionEntenetworking == 0) { NSLog(@"First time in region"); UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.alertBody = @"Welcome to Digial Conversations, we are upstairs."; notification.soundName = UILocalNotificationDefaultSoundName; [[UIApplication shanetworkingApplication] presentLocalNotificationNow:notification]; firstRegionEntenetworking = 1; } [self.locationManager startRangingBeaconsInRegion:self.beaconRegion]; } - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion]; UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.alertBody = @"We hope you enjoyed the event, thank you for coming."; notification.soundName = UILocalNotificationDefaultSoundName; [[UIApplication shanetworkingApplication] presentLocalNotificationNow:notification]; } - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { CLBeacon *beacon = [[CLBeacon alloc] init]; beacon = [beacons lastObject]; NSNumber *currentBeaconMajor = beacon.major; //it's major (group) number NSNumber *currentBeaconMinor = beacon.minor; //it's minor (individual) number if (([currentBeaconMinor floatValue] == 59204) && ([currentBeaconMajor floatValue] == 33995) && (beacon.proximity == CLProximityNear)) { if (beaconsRangedCount == 0) { currentBeaconState = @"Mint"; beaconsRangedCount ++; } if ([currentBeaconState isEqualToString:@"Blue"] || [currentBeaconState isEqualToString:@"Purple"]) { [[NSNotificationCenter defaultCenter] postNotificationName:@"didLocateMint" object:nil]; } } else if (([currentBeaconMinor floatValue] == 7451) && ([currentBeaconMajor floatValue] == 63627) && (beacon.proximity == CLProximityNear)) { if (beaconsRangedCount == 0) { currentBeaconState = @"Blue"; beaconsRangedCount ++; } if ([currentBeaconState isEqualToString:@"Mint"] || [currentBeaconState isEqualToString:@"Purple"]) { [[NSNotificationCenter defaultCenter] postNotificationName:@"didLocateBlue" object:nil]; } } else if (([currentBeaconMinor floatValue] == 51657) && ([currentBeaconMajor floatValue] == 26976) && (beacon.proximity == CLProximityNear)) { if (beaconsRangedCount == 0) { currentBeaconState = @"Purple"; beaconsRangedCount ++; } if ([currentBeaconState isEqualToString:@"Mint"] || [currentBeaconState isEqualToString:@"Blue"]) { [[NSNotificationCenter defaultCenter] postNotificationName:@"didLocatePurple" object:nil]; } } else { [[NSNotificationCenter defaultCenter] postNotificationName:@"didLeaveNearRegion" object:nil]; } } @end 

¿Te refieres a que didEnterRegion y callbacks de DoExitRegion se están retrasando?

Si su aplicación se está ejecutando en primer plano mientras está en el range, debería ingresar notifications de región en un segundo y salir de las notifications de región en unos pocos segundos. Si su aplicación está en segundo plano, puede tardar hasta 15 minutos en get una notificación de región o fuera de la región.

Para más detalles sobre este momento, ver aquí .

Estos problemas de latencia no son específicos de baliza. Tienen que ver con la forma en que se implementa la API CoreLocation en iOS.