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


Me las arreglé para hacer un iBeacon que desencadena una notificación push local en mi iPhone cuando la baliza está en el rango. 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!

Author: Lapidus, 2013-10-02

6 answers

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

Después de crear un CLBeaconRegion y comenzar a monitorear en él, los Servicios de ubicación harán 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 la aplicación no se está ejecutando durante una transición, iOS iniciará la aplicación en segundo plano durante unos segundos para llamar a los métodos CLLocationManagerDelegate adecuados.

Descubrí el comportamiento anterior a través de la experimentación con mi propia aplicación, pero también lo han presenciado con el programa de muestra AirLocate de Apple. Con AirLocate, si configura una región de monitoreo y reinicia el teléfono, AirLocate aún entregará una notificación local tan pronto como el teléfono ingrese a la región.

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

EDITAR: A partir de iOS 8, debe asegurarse de haber llamado y obtenido correctamente locationManager.requestAlwaysAuthorization() ya que locationManager.requestWhenInUseAuthorization() solo permite detectar balizas en primer plano.

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

 64
Author: davidgyoung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-02 21:44:37

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 se invoque al cruzar un límite de región de baliza después de que la aplicación se haya terminado (asumiendo que su aplicación funciona correctamente cuando está en primer plano):

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

Entonces, dentro de AppDelegate.m necesitas lo siguiente (también necesitas enlazar 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 LocationManager didDetermineState método, 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 sharedApplication] presentLocalNotificationNow:notification];
     }
    

}> Entonces, si su aplicación se ha terminado (debe ejecutarse al menos UNA VEZ), cuando el dispositivo transite a través de un límite de baliza que está supervisando, iOS invocará su aplicación y llamará al método locationManager:didDetermineState en su AppDelegate.módulo m. 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, el ajuste notifyEntryStateOnDisplay tampoco tiene nada que ver con este asunto. La configuración notifyEntryStateOnDisplay solo se usa cuando el usuario enciende la pantalla del dispositivo iOS (es decir, presiona "inicio" o el 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 recibirá una notificación en la pantalla en ese momento. Si esta propiedad se establece en FALSE, no lo hace.

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

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

 18
Author: TNBtech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-07 15:21:28

Debe cambiar notifyEntryStateOnDisplay=YES for CLBeaconRegion para que el sistema active el evento de entrada/salida de la aplicación para 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 entrada/salida de balizas si su aplicación se terminó previamente 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á la aplicación. Para verificar este comportamiento, inicie su aplicación, póngala en en segundo plano, luego inicie consecutivamente varias aplicaciones que consumen memoria. Lancé varios juegos en 3D antes de que mi aplicación sea terminada por el sistema debido a la presión de la memoria.

 9
Author: Jian Yin Shen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-06 00:25:21

Simplemente actualice su versión de iOS a 7.1 y establezca "notifyEntryStateOnDisplay=YES" y debería funcionar como un encanto incluso cuando su aplicación no se está ejecutando. Estaba teniendo este problema antes, pero se arregló una vez que hice esta actualización! Disfrutar..

 6
Author: Hugh Mbaezue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-11 16:14:59

La única manera en que he sido capaz de hacer este trabajo es mediante el seguimiento de los cambios de ubicación importantes que parecen hacer el truco. Tenga en cuenta que no he probado esto para todos los escenarios de dispositivos o casos de uso.

 2
Author: Ronny Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-26 20:18:18

Sí, podemos presentar la notificación local en estado kill o en estado background, simplemente siga los pasos,

1) Inicie el administrador de ubicaciones usando 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étodo delegado administrador de ubicación como,

-didEnterRegion
-didExitRegion

El método de administrador de dos ubicaciones anterior funcionará incluso si tu aplicación está muerta o en segundo plano. El sistema hará un seguimiento de su baliza y cuando se sale del alcance del sistema disparará el método didExitRegion y cuando llegue el sistema disparará el método didEnterRegion.

 1
Author: Gautam Sareriya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-05 10:45:58