ubicacion - Obtenga actualizaciones de ubicación para la aplicación iOS incluso cuando está suspendido
whatsapp notificaciones iphone (2)
Después de meses de pruebas y errores al experimentar el Core Location Framework, he encontrado la solución para obtener la actualización de la ubicación incluso cuando la aplicación se cierra / suspende. Funciona bien para iOS 7 y 8.
Aquí está la solución: -
Si su aplicación es una aplicación móvil basada en la ubicación que necesita monitorear la ubicación del dispositivo cuando tiene cambios significativos, el iOS le devolverá algunas coordenadas de ubicación cuando el dispositivo se haya movido a más de 500 metros de la última ubicación conocida. Sí, incluso cuando la aplicación es eliminada / suspendida por el usuario o por el propio iOS, aún puede obtener las actualizaciones de ubicación.
Entonces, para que un
locationManager
obtenga una actualización de ubicación incluso cuando la aplicación se
startMonitoringSignificantLocationChanges
/ suspende, debe usar el método
startMonitoringSignificantLocationChanges
, no puede usar
startUpdatingLocation
.
Cuando iOS desea devolver la actualización de ubicación a la aplicación, le ayudará a
UIApplicationLaunchOptionsLocationKey
la aplicación y devolver una clave
UIApplicationLaunchOptionsLocationKey
al método delegado de la aplicación
didFinishLaunchingWithOptions
.
La clave
UIApplicationLaunchOptionsLocationKey
es muy importante y debe saber cómo manejarla.
Debe crear una nueva instancia de locationManager cuando reciba la clave y obtendrá la actualización de ubicación en el método de delegado de locationManager
didUpdateLocations
.
Aquí está el código de ejemplo:-
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
self.shareModel = [LocationShareModel sharedModel];
if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {
self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
self.shareModel.anotherLocationManager.delegate = self;
self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
if(IS_OS_8_OR_LATER) {
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
return YES;
}
Además del método
didFinishLaunchingWithOptions
, he creado la instancia de
locationManager
cuando la aplicación está activa.
Aquí hay algunos ejemplos de código:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];
if(IS_OS_8_OR_LATER) {
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if(self.shareModel.anotherLocationManager)
[self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];
self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
self.shareModel.anotherLocationManager.delegate = self;
self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
if(IS_OS_8_OR_LATER) {
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
He escrito un artículo que explica los detalles sobre cómo obtener la actualización de ubicación para iOS 7 y 8 incluso cuando la aplicación se cierra / suspende. También he subido el código fuente completo en GitHub con los pasos sobre cómo probar esta solución.
Visite las siguientes URL para obtener más información: -
A principios de 2014, Apple actualizó iOS 7.0 a 7.1 para permitir actualizaciones de ubicación incluso cuando la aplicación no está activa en primer plano y no en segundo plano. ¿Como hacemos eso?
He leído algunos artículos como iOS 7.1 de Apple que solucionará un error de geolocalización . Pero Apple no proporcionó mucha comunicación relacionada con eso ni ningún código de muestra sobre cómo obtener la actualización de ubicación, incluso cuando la aplicación se cierra / finaliza / suspende.
He leído las Notas de la versión para iOS 7.1 . No pude encontrar nada relacionado con eso también.
Entonces, ¿cómo obtenemos la actualización de ubicación para iOS 7 y 8 incluso cuando la aplicación está suspendida?
locationManager = [[CLLocationManager alloc] init];
#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
if(IS_OS_8_OR_LATER)
{
[locationManager requestWhenInUseAuthorization];
}
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; //whenever we move
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
[locationManager startUpdatingLocation];
la actualización de la ubicación del usuario de ese código solo para la aplicación en ejecución, pero no la ejecución en segundo plano
[locationManager requestWhenInUseAuthorization];