iphone - geolocalizacion - ¿Cómo utilizar las notificaciones push basadas en la geografía en iOS?
crear app geolocalizacion (1)
¿Es posible hacer uso de notificaciones push basadas en información geográfica en iOS cuando la aplicación se cancela (no en segundo plano)?
Estoy interesado en crear una aplicación, donde el usuario elija una posición en un mapa, y luego, si él / ella, por ejemplo, se encuentra cerca de esa área, se activará una notificación local de inserción basada en información geográfica.
Sin embargo, ¿es esta "idea" incluso posible? ¿Puede el GPS ejecutar y comparar coordenadas cuando la aplicación se mata y ejecutar, y notificar al usuario cuando está en su lugar? ¿Hay algún tutorial / artículo / más información de algún tipo sobre el tema que pueda leer?
La mayoría de la información que leí en línea eran más como ideas generales de implementación sin nada específico, aunque al respecto.
Para rastrear la ubicación de un usuario mientras la aplicación no se está ejecutando (es decir, ha finalizado anteriormente), hay dos opciones:
Desde la guía de programación de la aplicación iOS en "Seguimiento de la ubicación del usuario":
El servicio de ubicación de cambio significativo es altamente recomendado para aplicaciones que no necesitan datos de ubicación de alta precisión. Con este servicio, las actualizaciones de ubicación se generan solo cuando la ubicación del usuario cambia significativamente; por lo tanto, es ideal para aplicaciones sociales o aplicaciones que proporcionan al usuario información no crítica y relevante para la ubicación. Si la aplicación se suspende cuando se produce una actualización, el sistema la reactiva en segundo plano para manejar la actualización. Si la aplicación inicia este servicio y luego finaliza, el sistema vuelve a iniciar la aplicación automáticamente cuando una nueva ubicación está disponible . Este servicio está disponible en iOS 4 y versiones posteriores, y está disponible solo en dispositivos que contienen una radio celular.
Sin embargo, de acuerdo con la referencia de la clase CLLocationManager , no es demasiado precisa y las actualizaciones no son frecuentes:
Nota: las aplicaciones pueden esperar una notificación tan pronto como el dispositivo se mueva 500 metros o más de su notificación anterior. No debe esperar notificaciones más de una vez cada cinco minutos. Si el dispositivo es capaz de recuperar datos de la red, es mucho más probable que el administrador de ubicación envíe notificaciones de manera oportuna.
La supervisión de la región funciona de manera similar, incluido el reinicio de la aplicación después de la finalización, pero con mayor precisión (según la disponibilidad de las redes Wifi y las torres de telefonía móvil):
Las distancias de umbral específicas están determinadas por el hardware y las tecnologías de ubicación que están actualmente disponibles. Por ejemplo, si Wi-Fi está desactivado, el monitoreo de la región es significativamente menos preciso. Sin embargo, para fines de prueba, puede suponer que la distancia mínima es de aproximadamente 200 metros.
Otra consideración de monitoreo de la región es que (de acuerdo con la referencia de clase de CLLocationManager ) las notificaciones de entrada y salida de la región solo se pueden recibir de 3 a 5 minutos después de cruzar los límites de la región.
Dependiendo de los requisitos reales, la supervisión de la región se podría usar para obtener una ubicación "aproximada" y luego, cuando el usuario se encuentre dentro de una región específica, inicie el servicio basado en GPS más preciso en el administrador de ubicación. Cuando el usuario abandona la región de interés, apague el servicio de GPS para conservar la batería y vuelva al servicio de monitoreo de ubicación aproximada (es decir, monitoreo de región) una vez más. Aquí hay una implementación básica:
SomeViewController.m :
... @interface SomeViewController () <CLLocationManagerDelegate> @property (nonatomic, strong) CLLocationManager *locationManager; @property (nonatomic, strong) CLRegion *someRegion; @end @implementation SomeViewController - (void)viewDidLoad { [super viewDidLoad]; self.locationManager = [[CLLocationManager alloc] init]; CLLocationDistance radius = 10; // 10 metre sensitivity self.someRegion = [[CLRegion alloc] initCircularRegionWithCenter:someCoordinates radius:radius identifier:@"Smithtown Dry Cleaners"]; self.locationManager.delegate = self; [self.locationManager startMonitoringForRegion:self.someRegion]; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.distanceFilter = 10; [self.locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { [self.locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { [self.locationManager stopUpdatingLocation]; } // Delegate method from the CLLocationManagerDelegate protocol. - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation* location = [locations lastObject]; // If the user''s current location is not within the region anymore, stop updating if ([self.someRegion containsCoordinate:location.coordinate] == NO) { [self.locationManager stopUpdatingLocation]; } NSString *locationData = [NSString stringWithFormat:@"latitude %+.6f, longitude %+.6f/n", location.coordinate.latitude, location.coordinate.longitude]; NSLog(@"%@", locationData); UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.alertBody = locationData; localNotification.alertAction = @"Location data received"; localNotification.hasAction = YES; [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; }
Recuerde agregar las entradas correspondientes al archivo plist de la aplicación para que la aplicación se ejecute en segundo plano con acceso a los recursos apropiados:
MyApp-Info.plist :
<key>UIBackgroundModes</key> <array> ... <string>location</string> </array> <key>UIRequiredDeviceCapabilities</key> <array> ... <string>location-services</string> <string>gps</string> </array>
El código anterior asume el uso de iOS6 y ARC