technology que microlocalización learning español eddystone developer datasheet beacons ios ios7 ibeacon

ios - que - Ranging Beacons solo funciona cuando se ejecuta la aplicación?



learning ibeacon pdf (6)

Aquí está el proceso que debe seguir para variar en segundo plano:

  1. Para cualquier CLBeaconRegion siempre mantenga la supervisión, en segundo plano o en primer plano, y continúe notifyEntryStateOnDisplay = YES
  2. notifyEntryStateOnDisplay llama a locationManager:didDetermineState:forRegion: en segundo plano, así que implementa esta llamada delegada ...

...Me gusta esto:

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

Espero que esto ayude.

Estoy teniendo dificultades para que esto funcione cuando la aplicación no se está ejecutando. Tengo locationManager:didRangeBeacons:inRegion: implementado y se llama cuando la aplicación se ejecuta en primer plano o en segundo plano, sin embargo, no parece hacer nada cuando salgo de la aplicación y bloqueo la pantalla. El ícono de servicios de ubicación desaparece y nunca sé que ingresé a un rango de baliza. ¿Debería seguir funcionando la notificación local?

Tengo actualizaciones de la ubicación y utiliza los accesorios Bluetooth LE seleccionados en los modos de fondo (XCode 5) No pensé que los necesitaba.

Cualquier ayuda muy apreciada.

-(void)watchForEvents { // this is called from application:didFinishLaunchingWithOptions id class = NSClassFromString(@"CLBeaconRegion"); if (!class) { return; } CLBeaconRegion * rflBeacon = [[CLBeaconRegion alloc] initWithProximityUUID:kBeaconUUID identifier:kBeaconString]; rflBeacon.notifyOnEntry = YES; rflBeacon.notifyOnExit = NO; self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; [self.locationManager startRangingBeaconsInRegion:rflBeacon]; [self.locationManager startMonitoringForRegion:rflBeacon]; } -(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { if (beacons.count == 0 || eventRanged) { // breakpoint set here for testing return; } eventRanged = YES; if (backgroundMode) { // this is set in the EnterBackground/Foreground delegate calls UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.alertBody = [NSString stringWithFormat:@"Welcome to the %@ event.",region.identifier]; notification.soundName = UILocalNotificationDefaultSoundName; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; } // normal processing here... }


Código para iOS 9 para ubicar las balizas en segundo plano, utilizando las actualizaciones de ubicación :

  1. Abra Configuración del proyecto -> Capacidades -> Modos de fondo -> Alternar las Location Updates y Uses Bluetooth LE accessories en ON .

  2. Cree un CLLocationManager , solicite Always monitorear la autorización (no olvide agregar que la Application does not run in background a NO y NSLocationAlwaysUsageDescription en NSLocationAlwaysUsageDescription de la aplicación) y configure las siguientes propiedades:

    locationManager!.delegate = self locationManager!.pausesLocationUpdatesAutomatically = false locationManager!.allowsBackgroundLocationUpdates = true

  3. Empieza a ir para balizas y región de monitoreo:

    locationManager!.startMonitoringForRegion(yourBeaconRegion) locationManager!.startRangingBeaconsInRegion(yourBeaconRegion) locationManager!.startUpdatingLocation() // Optionally for notifications UIApplication.sharedApplication().registerUserNotificationSettings( UIUserNotificationSettings(forTypes: .Alert, categories: nil))

  4. Implemente CLLocationManagerDelegate y en su didEnterRegion envíe los startRangingBeaconsInRegion() y startUpdatingLocation() (opcionalmente también envíe la notificación) y configure stopRangingBeaconsInRegion() y stopUpdatingLocation() en didExitRegion

Tenga en cuenta que esta solución funciona, pero Apple no la recomienda debido al consumo de batería y la privacidad del cliente.

Más aquí: https://community.estimote.com/hc/en-us/articles/203914068-Is-it-possible-to-use-beacon-ranging-in-the-background-


El monitoreo puede iniciar una aplicación que no se está ejecutando. El rango no puede.

La clave para que el monitoreo inicie su aplicación es establecer esta CLBeaconRegion mal documentada en su CLBeaconRegion : r egion.notifyEntryStateOnDisplay = YES; Esto puede iniciar su aplicación en una transición de región incluso después de reiniciar completamente su teléfono. Pero hay un par de advertencias:

  1. Su aplicación se inicia en segundo plano solo por unos segundos. (Intente agregar declaraciones NSLog a applicationDidEnterBackground y otros métodos en su AppDelegate para ver qué está pasando).
  2. iOS puede tomarse su propio momento para decidir que ingresó a CLBeaconRegion . Lo he visto tardar hasta cuatro minutos.

En lo que respecta al alcance, a pesar de que no puede haber activado el despertar de su aplicación, puede hacer que la aplicación supervise y alcance simultáneamente. Si el monitoreo despierta su aplicación y la pone en segundo plano durante unos segundos, las devoluciones de llamadas se inician de inmediato. Esto le da la oportunidad de realizar acciones de alcance rápido mientras su aplicación aún se está ejecutando.

EDITAR: La investigación adicional demuestra que notifyEntryStateOnDisplay no tiene ningún efecto en la supervisión en segundo plano, por lo que lo anterior debería funcionar independientemente de si tiene este indicador. Vea esta explicación detallada y la discusión de los retrasos que puede experimentar


Su aplicación debería activarse actualmente si solo desea recibir una notificación cuando ingresa a una región de baliza. La única restricción de fondo que conozco es el hecho de alojar un iBeacon en un dispositivo iOS. En ese caso, la aplicación debería estar físicamente abierta en primer plano. Para esa situación, sería mejor hacer la implementación directa de CoreBluetooth CBPeripheralManager . De esa manera tendrías algunas habilidades publicitarias en el fondo.


Usted está haciendo dos operaciones separadas aquí: balizas de ''alcance'' y monitoreo para una región. Puede supervisar una región en el fondo, pero no las balizas de rango.

Por lo tanto, su implementación de locationManager:didRangeBeacons:inRegion: no se llamará en segundo plano. En su lugar, su llamada a startMonitoringForRegion resultará en que se llame a uno / algunos de los siguientes métodos:

– locationManager:didEnterRegion: – locationManager:didExitRegion: – locationManager:didDetermineState:forRegion:

Estos serán llamados en el fondo. En ese punto, puede activar una notificación local, como en su código original.


Usted puede hacer que van en el fondo. Sin embargo, hay una trampa. El usuario tiene que llevar la aplicación a primer plano, que es cuando comienza el rango. Luego, incluso si el usuario bloquea la pantalla y la aplicación pasa al segundo plano, continuará didRangeBeacons y llamando a la didRangeBeacons llamada didRangeBeacons cada 1 segundo para siempre.

Para activar las actualizaciones de ubicación de fondo, seleccione su proyecto, vaya a Información y agregue una fila llamada "Modos de Fondo Requeridos". Luego, agregue elementos relevantes: actualizaciones de ubicación, comunica / comparte datos a través de corebluetooth, etc.

Ahora, una vez que reciba una devolución de llamada cuando ingrese a la región, su aplicación se activará en segundo plano y notificará al usuario. El usuario abre la aplicación para poner la aplicación en primer plano. En este punto, puede iniciar el proceso de alcance llamando a startRangingBeaconsInRegion . Además, llame al método startUpdatingLocation que actualizará la ubicación en segundo plano.