Notificación iBeacon cuando la aplicación no se está ejecutando

Me las arreglé para hacer un iBeacon que desencadena una notificación de inserción local en mi iPhone cuando la baliza está dentro del scope. Funciona perfectamente cuando la aplicación está en modo de fondo.

Mi pregunta es: ¿Puedo activar la notificación incluso cuando la aplicación no se está ejecutando, ni siquiera en segundo plano?

Pensé que esto era posible, pero no estoy seguro. Si es así, ¿cómo puedo lograr esto?

¡Gracias!

Sí, es posible y debe ser automático.

Después de haber creado una CLBeaconRegion y haber comenzado a monitorear en ella, los Servicios de Ubicación mantendrán un registro de si su teléfono está dentro o fuera de la región, incluso si su aplicación no se está ejecutando. Si su aplicación no se está ejecutando durante una transición, iOS lanzará su aplicación en segundo plano durante unos segundos para llamar a los métodos apropiados CLLocationManagerDelegate.

Descubrí el comportamiento anterior mediante la experimentación con mi propia aplicación, pero también lo he visto con el progtwig de muestra AirLocate de Apple. Con AirLocate, si configura una región de monitoreo y luego reinicia su teléfono, AirLocate aún enviará una notificación local tan pronto como el teléfono entre en la región.

Tenga cuidado al probar esto, ya que a veces transcurren hasta 4 minutos después de encender / apagar un iBeacon antes de que iOS reconozca la transición de estado de la región. EDITAR : a partir del iPhone 5, las aplicaciones suelen utilizar la aceleración de hardware para detectar balizas en unos pocos segundos, y si la aceleración de hardware no está disponible, puede tomar hasta 15 minutos.

EDITAR: A partir de iOS 8, debe asegurarse de haber llamado y obtenido con éxito la locationManager.requestAlwaysAuthorization() como locationManager.requestWhenInUseAuthorization() solo permite detectar beacons en primer plano.

He publicado una discusión detallada sobre cómo funciona todo esto en esta publicación de blog.

De acuerdo, he conseguido que esto funcione correctamente y he experimentado con él, así que aquí está la respuesta. Esto es lo que debe hacer para que se invoque su aplicación cuando cruce un límite de la región de baliza después de que la aplicación haya finalizado (suponiendo que su aplicación funciona correctamente cuando está en primer plano):

  1. Debe implementar un delegado de CLLocation dentro de su módulo AppDelegate.m . Este delegado es lo que obtiene iOS, por lo que si no tiene el código de delegado CLLocation en AppDelegate.m , no podrá responder a iOS cuando se haya terminado su aplicación. Esto es lo que hace la aplicación de muestra AirLocate de Apple.

Por lo tanto, dentro de AppDelegate.m necesita lo siguiente (también necesita vincular en CoreLocation.h ):

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // This location manager will be used to notify the user of region state transitions when the app has been previously terminated. self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; return YES; } 
  1. Dentro de AppDelegate.m , debe implementar el método locationManager didDetermineState , como este:

     -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{ UILocalNotification *notification = [[UILocalNotification alloc] init]; if(state == CLRegionStateInside) { notification.alertBody = [NSString stringWithFormat:@"You are inside region %@", region.identifier]; } else if(state == CLRegionStateOutside) { notification.alertBody = [NSString stringWithFormat:@"You are outside region %@", region.identifier]; } else { return; } [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; } 

-> Entonces, si su aplicación ha finalizado (debe ejecutarse al menos UNA VEZ), cuando el dispositivo realiza la transición a través de un límite de baliza que está monitoreando, iOS invocará su aplicación y llamará al método locationManager:didDetermineState en su AppDelegate.m módulo. Dentro de este método, puede configurar y llamar a presentLocalNotificationNow. Si su aplicación NO está en primer plano cuando esto sucede, iOS presentará la notificación en la pantalla, incluso si está bloqueada. El usuario tendrá que invocar la aplicación para obtener más información.

Estoy bastante seguro de que la presión de la memoria no tiene nada que ver con esto. Además, la configuración notifyEntryStateOnDisplay no tiene nada que ver con este problema. El ajuste notifyEntryStateOnDisplay solo se utiliza cuando el usuario enciende la pantalla del dispositivo iOS (es decir, acierta “inicio” o botón superior izquierdo). Si el usuario hace esto y notifyEntryStateOnDisplay es TRUE , Y el dispositivo está DENTRO de la región de baliza que está monitoreando, ENTONCES recibe una notificación en la pantalla en ese momento. Si esta propiedad está configurada en FALSE , no es así.

Por supuesto, necesita ejecutar iOS 7.1 para que esto funcione correctamente.

Para más detalles, visita la documentación de Apple

Debe cambiar notifyEntryStateOnDisplay = YES para CLBeaconRegion para que el sistema active su aplicación para el evento de entrada / salida de iBeacon.

Pero hay una parte difícil. Si su aplicación no se está ejecutando, el sistema solo activará su aplicación para el manejo de la entrada / salida de la baliza si su aplicación se terminó antes debido a la presión de la memoria del sistema. Si el usuario mata la aplicación deslizándola hacia arriba en la vista de tareas, el sistema no activará su aplicación. Para verificar este comportamiento, inicie su aplicación, colóquela en segundo plano y luego inicie varias aplicaciones que consumen memoria consecutivamente. Lancé varios juegos en 3D antes de que el sistema termine mi aplicación debido a la presión de la memoria.

Simplemente actualice su versión de iOS a 7.1 y configure “notifyEntryStateOnDisplay = YES” y debería funcionar como un amuleto incluso cuando su aplicación no se esté ejecutando. ¡Estaba teniendo este problema antes, pero lo arreglaron una vez que hice esta actualización! Disfrutar..

La única forma en que he podido hacer que esto funcione es monitoreando cambios de ubicación importantes que parecen hacer el truco. Tenga en cuenta que no he probado esto para todos los escenarios del dispositivo o caso de uso.

Sí, podemos presentar la notificación local en estado de matar o en el estado de fondo, solo siga los pasos,

1) Inicie el administrador de ubicaciones utilizando la clase CLLocationManager.

 locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.desiredAccuracy=kCLLocationAccuracyBest; locationManager.distanceFilter=kCLDistanceFilterNone; 

2) Crear CLBeaconRegion como,

 CLBeaconRegion *beacon_Region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:mjorVa minor:minorVa identifier:identifier]; beacon_Region.notifyEntryStateOnDisplay = YES; beacon_Region.notifyOnEntry=YES; beacon_Region.notifyOnExit=YES; 

3) Implementar dos métodos de delegado de administrador de ubicación como,

 -didEnterRegion -didExitRegion 

El método anterior de administrador de ubicación funcionará incluso si tu aplicación está desactivada o en segundo plano. El sistema hará un seguimiento de su baliza y cuando salga del rango, el sistema disparará el método didExitRegion y, cuando ingrese, el sistema activará el método didEnterRegion.

    Intereting Posts