ios core-location core-bluetooth ibeacon

ios - locationManager: didEnterRegion no se llama cuando se detecta una baliza



core-location core-bluetooth (4)

Es difícil decir si he visto exactamente lo mismo sin más detalles sobre las condiciones iniciales de su prueba. Pero sí, en algunos casos específicos, he visto locationManager: didRangeBeacons: inRegion que se llama incluso sin recibir una llamada a locationManager: didEnterRegion.

Si comienza a establecer y monitorear al mismo tiempo con la misma región, e iOS cree que ya estaba en la región monitoreada, es posible que no reciba una llamada a locationManager: didEnterRegion.

Para probar realmente si algo está mal, debe configurar un caso de prueba en el que:

  1. Asegúrate de no estar en la región.
  2. Deja que iOS funcione por varios minutos
  3. Comience a monitorear esa región
  4. Deja que iOS siga funcionando por unos minutos.
  5. Entra en la región.
  6. Ver si recibe una llamada a locationManager: didEnterRegion

Si aún no recibe una llamada después de pasar por lo anterior, entonces algo está definitivamente mal.

Mientras realizaba pruebas con balizas (dispositivos iOS), encontré que la baliza del oyente daba un comportamiento inesperado. locationManager: no se llama al método didEnterRegion incluso si una baliza entra en una región. Pero el locationManager: didRangeBeacons: inRegion: se llama correctamente, y las balizas detectadas se muestran allí. ¿Alguien ha experimentado algo como esto?


También debe tener en cuenta que está monitoreando una región , no una baliza en particular.

Por lo tanto, si tiene 3 balizas que comparten la misma proximityUUID y su región se define solo como la proximityUUID (sin valores mayores y menores), se le notificará solo en dos situaciones:

  1. No había balizas de la región dentro del alcance y se descubrieron las primeras balizas / balizas ( didEnterRegion:

  2. Una o más balizas de la región estaban dentro del alcance y todas se didExitRegion: de vista durante unos 30 segundos ( didExitRegion:


Compruebe si sus métodos se implementan de la siguiente manera. En viewDidLoad , comience a monitorear al final

self.beaconRegion.notifyOnEntry=YES; self.beaconRegion.notifyOnExit=YES; self.beaconRegion.notifyEntryStateOnDisplay=YES; [self.locationManager startMonitoringForRegion:self.beaconRegion];

después del inicio del monitoreo, solicite el estado para su región definida

- (void) locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { [self.locationManager requestStateForRegion:self.beaconRegion]; }

Una vez determinado el estado, comience a ir a las balizas.

-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { if (state == CLRegionStateInside) { //Start Ranging [manager startRangingBeaconsInRegion:self.beaconRegion]; } else { //Stop Ranging here } }

e implementa los siguientes métodos de acuerdo a tus necesidades ...

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { self.statusLbl.text=@"Entered region"; } -(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { self.statusLbl.text=@"Exited region"; } -(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { if(beacons.count>0) {} }

Espero que esto resuelva su problema.


before starting coding in project , you must follow given setup guidlines --> 1. in project info or info.plist --> Custom IOS Target Properties --> . add "Required background modes" . in this add two items --> ."App shares data using CoreBluetooth" ."App registers for location updates" 2. in project Capability --> There is Background Modes . check "Loaction update" . check "Acts as a Bluetooth LE accessory" . check "uses bluetooth LE accessories"

(y siga las instrucciones dadas por el Sr. Davidgyoung. Créame, definitivamente funcionará).