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

Logré crear un iBeacon que activa 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 segundo plano.

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 debería ser automático.

Una vez que haya creado una CLBeaconRegion y haya comenzado a supervisarla, Location Services realizará un seguimiento de si su teléfono está dentro o fuera de la región, incluso cuando 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 methods CLLocationManagerDelegate apropiados.

Descubrí el comportamiento anterior a través de la experimentación con mi propia aplicación, pero también lo he visto con el progtwig de ejemplo AirLocate de Apple. Con AirLocate, si configura una región de monitoreo y luego reinicia su teléfono, AirLocate seguirá enviando una notificación local tan pronto como el teléfono ingrese a la región.

Tenga cuidado al probar esto, porque a veces tarda 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 normalmente usan aceleración de hardware para detectar balizas en 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 correctamente 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.

OK, 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 su aplicación sea invocada al cruzar un límite de región de baliza después de que la aplicación haya finalizado (suponiendo que su aplicación funcione correctamente cuando esté en primer plano):

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

Entonces, 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 , así:

     -(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 shanetworkingApplication] presentLocalNotificationNow:notification]; } 

-> Entonces, si su aplicación ha finalizado (debe ejecutarse al less UNA VEZ), cuando el dispositivo pasa por un límite de beacon que está monitoreando, iOS invocará su aplicación y llamará al método locationManager:didDetermineState en su AppDelegate.m module. 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 get más información.

Estoy bastante seguro de que la presión de la memory no tiene nada que ver con esto. Además, la configuration notifyEntryStateOnDisplay tiene nada que ver con este problema. La configuration notifyEntryStateOnDisplay solo se utiliza cuando el usuario enciende la pantalla del dispositivo iOS (es decir, golpea "inicio" o button superior izquierdo). Si el usuario hace esto y notifyEntryStateOnDisplay es TRUE , Y el dispositivo está DENTRO de la región de la baliza para la que está monitoreando, LUEGO recibirá una notificación en la pantalla en ese momento. Si esta propiedad está establecida en FALSE , no lo hace.

Por supuesto, debe ejecutar iOS 7.1 para que este material funcione correctamente.

Para más detalles, visite la documentation de Apple.

Debe cambiar notifyEntryStateOnDisplay = YES para CLBeaconRegion para que el sistema despierte su aplicación para el evento de input / 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 control de input / salida de baliza si su aplicación fue cancelada previamente debido a la presión de la memory del sistema. Si el usuario mata la aplicación al deslizarla en la vista de tareas, el sistema no activará su aplicación. Para verificar este comportamiento, inicie su aplicación, póngala en segundo plano y luego inicie consecutivamente varias aplicaciones que consumen memory. Lanzé varios juegos en 3D antes de que el sistema termine mi aplicación debido a la presión de la memory.

Simplemente actualice su versión de iOS a 7.1 y configure "notifyEntryStateOnDisplay = YES" y debería funcionar como un encanto incluso cuando su aplicación no se esté ejecutando. ¡Tenía este problema antes pero se reparó una vez que hice esta actualización! Disfrutar..

La única forma en que he podido hacer que esto funcione es supervisando los cambios de location principales que parecen hacer el truco. Tenga en count que no he probado esto para todos los escenarios del dispositivo o el uso de casos.

Sí, podemos presentar la notificación local en estado de muerte o en estado de background, solo siga los pasos,

1) Inicie el administrador de location con la class CLLocationManager.

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

2) Crea 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 methods de delegado de administrador de location como,

 -didEnterRegion -didExitRegion 

El anterior método de administrador de location funcionará incluso si su aplicación es matar o en segundo plano. El sistema hará un seguimiento de su baliza y, cuando se encuentre fuera de range, el sistema disparará el método didExitRegion y, cuando entre en el sistema, disparará el método didEnterRegion.