Los servicios de ubicación en segundo plano no funcionan en iOS 7

Recientemente, actualicé mis dispositivos iOS para usar iOS 7. Una de las aplicaciones que estamos desarrollando utiliza servicios de ubicación en segundo plano para rastrear la ubicación del dispositivo y todos nuestros probadores informaron que la aplicación ya no parece rastrear en segundo plano en iOS. 7.

Hemos verificado que la creación de fondos para la aplicación está habilitada en la configuración del dispositivo y que la comstackción anterior funcionaba perfectamente en iOS 6. Incluso si el dispositivo se ciclaba, la aplicación se reiniciaría después de una actualización de ubicación.

¿Hay algo más que deba hacerse para que esto funcione en iOS 7?

Me disculpo por la demora en publicar la solución. He estado ocupado en los últimos meses y me he visto atrapado en mi vida personal hasta que me olvidé de este hilo. Esta es la solución que utilicé para obtener una ubicación continua desde dispositivos con iOS 7, sin importar si está en primer plano o en segundo plano.

Puede encontrar la solución completa y la explicación del blog y también github: –

  1. Progtwigción de actualización de ubicación de fondo para iOS 7 y 8

  2. Proyecto Github: progtwigción de actualización de la ubicación de fondo para iOS 7 y 8

Métodos y explicación: –

  1. Reinicio el administrador de ubicación cada 1 minuto en la función didUpdateLocations

  2. Permito que el administrador de ubicación obtenga las ubicaciones del dispositivo durante 10 segundos antes de apagarlo (para ahorrar batería).

Código parcial a continuación: –

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ for(int i=0;i 30.0) continue; //Select only valid location and also location with good accuracy if(newLocation!=nil&&theAccuracy>0 &&theAccuracy<2000 &&(!(theLocation.latitude==0.0&&theLocation.longitude==0.0))){ self.myLastLocation = theLocation; self.myLastLocationAccuracy= theAccuracy; NSMutableDictionary * dict = [[NSMutableDictionary alloc]init]; [dict setObject:[NSNumber numberWithFloat:theLocation.latitude] forKey:@"latitude"]; [dict setObject:[NSNumber numberWithFloat:theLocation.longitude] forKey:@"longitude"]; [dict setObject:[NSNumber numberWithFloat:theAccuracy] forKey:@"theAccuracy"]; //Add the vallid location with good accuracy into an array //Every 1 minute, I will select the best location based on accuracy and send to server [self.shareModel.myLocationArray addObject:dict]; } } //If the timer still valid, return it (Will not run the code below) if (self.shareModel.timer) return; self.shareModel.bgTask = [BackgroundTaskManager sharedBackgroundTaskManager]; [self.shareModel.bgTask beginNewBackgroundTask]; //Restart the locationMaanger after 1 minute self.shareModel.timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(restartLocationUpdates) userInfo:nil repeats:NO]; //Will only stop the locationManager after 10 seconds, so that we can get some accurate locations //The location manager will only operate for 10 seconds to save battery NSTimer * delay10Seconds; delay10Seconds = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(stopLocationDelayBy10Seconds) userInfo:nil repeats:NO]; } 

Actualización en mayo de 2014 : recibí algunas solicitudes para agregar códigos de muestra al enviar la ubicación al servidor durante un determinado intervalo de tiempo. Agregué los códigos de muestra y también combiné una solución para BackgroundTaskManager para resolver un problema técnico de fondo durante un período prolongado. Si tiene alguna pregunta, le invitamos a unirse a nosotros para una discusión aquí: Progtwigción de actualización de ubicación de fondo para iOS 7 con actualización de ubicación a la discusión del servidor

Actualización en enero de 2015 : si desea obtener la actualización de ubicación incluso cuando la aplicación se suspende, consulte: Cómo obtener actualizaciones de ubicación para iOS 7 y 8, incluso cuando la aplicación está suspendida.

Si mira WWDC 2013, video de la sesión n. ° 204: novedades sobre el pdf multitarea, la página número 15 menciona claramente que las aplicaciones no se lanzarán en segundo plano si el usuario lo elimina del conmutador de aplicaciones. Por favor mira la imagen,

enter image description here

Creo que hicieron una optimización (probablemente usando sensores de movimiento), para detectar el posicionamiento “relativamente” estacionario del teléfono y detienen las actualizaciones de ubicación. Esto es solo una especulación, pero mis pruebas actualmente muestran:

  1. Inicio de actualizaciones de ubicación; (probado con una precisión de 10 y 100 metros, 3 veces cada uno)
  2. Apague la pantalla del dispositivo para poner la aplicación en segundo plano;
  3. Deje el dispositivo estacionario (por ejemplo, en un escritorio) durante 30 minutos.

Los datos que registro muestran que las actualizaciones geográficas dejan de aparecer después de ~ 15 my 30 s. Con eso, todos los demás procesos en segundo plano que hagas también se terminan.

Mi dispositivo es iPhone 5 con iOS 7.

Estoy un 95% seguro, este no fue el caso en iOS 6 / 6.1. Donde obtener actualizaciones geográficas con una precisión de 100 m solía proporcionarle una ejecución prácticamente continua en segundo plano.

Actualizar

Si reinicia el administrador de ubicación cada 8 minutos, debería ejecutarse continuamente.

Actualización # 2

No he probado esto en la última versión, pero así es como lo reinicié cuando escribí la publicación. Espero que esto sea útil.

 - (void)tryRestartLocationManager { NSTimeInterval now = [[NSDate date] timeIntervalSince1970]; int seconds = round(floor(now - locationManagerStartTimestamp)); if ( seconds > (60 * 8) ) { [locationManager stopUpdatingLocation]; [locationManager startUpdatingLocation]; locationManagerStartTimestamp = now; } } 

Una de mis aplicaciones para iOS necesita enviar actualizaciones de ubicación al servidor a intervalos regulares y el siguiente enfoque funcionó para nosotros ….

A partir de iOS 7:

  • una aplicación ya debe haber estado usando los servicios de ubicación (startUpdatingLocation) ANTES de haber estado en segundo plano para que los elegibles para el tiempo de ejecución en segundo plano
  • el tiempo de espera del período de gracia de fondo se redujo de 10 minutos a 3 minutos
  • detener las actualizaciones de ubicación (a través de stopUpdatingLocation) iniciará la cuenta atrás de 3 minutos backgroundTimeRemaining
  • el inicio de las actualizaciones de ubicación mientras se está en segundo plano no restablecerá el backgroundTimeRemaining

Por lo tanto, NO DETENGA las actualizaciones de ubicación en cualquier momento … En su lugar, prefiera usar la precisión necesaria (ubicación precisa frente a ubicación aproximada). La ubicación aproximada no consume mucha batería … por lo que esta solución resuelve su problema.

Después de mucha búsqueda en línea, encontré un enlace que proporciona una solución viable para iOS 7. La solución es la siguiente:

  • Si bien la aplicación todavía está en primer plano, inicie las actualizaciones de ubicación (startUpdatingLocation) pero configure los filtros de precisión y distancia en actualizaciones muy detalladas (por ejemplo, 3 km). Es importante hacer esto en primer plano (en applicationDidEnterBackground es demasiado tarde).
  • Cuando se requiere una resolución de grano fino, establezca temporalmente los filtros de precisión y distancia para obtener la mejor ubicación posible, y luego inviértalos de nuevo a los valores granulares del curso, pero nunca detenga las actualizaciones de ubicación.
  • Debido a que las actualizaciones de ubicación siempre están habilitadas, la aplicación no se suspenderá cuando vaya al fondo.

Y asegúrese de agregar lo siguiente a la “ubicación” de Info.plist de su aplicación a la clave UIBackgroundModes “location-services” y “gps” a la clave UIRequiredDeviceCapabilities

Créditos: http://gooddevbaddev.wordpress.com/2013/10/22/ios-7-running-location-based-apps-in-the-background/

Encontré otro hilo Inicie el Administrador de ubicaciones en iOS 7 desde la tarea de fondo. Sash mencionó que

Encontré el problema / solución. Cuando llega el momento de iniciar el servicio de ubicación y detener la tarea en segundo plano, la tarea en segundo plano debe detenerse con un retraso (establezco 1 segundo). De lo contrario, el servicio de ubicación no comenzará.

¿Alguien puede probar eso y verificar?

Nikolay, ¿puedes pegar tu código aquí? Traté de reiniciar el administrador de ubicación cada 8 minutos, pero no se ejecuta continuamente.

Actualizar:

Después de buscar alto y bajo, ¡encontré la solución del foro de Apple!

En iOS 7, no puede iniciar el servicio de ubicación en segundo plano . Si desea que el servicio de ubicación continúe ejecutándose en segundo plano, debe iniciarlo en primer plano y continuará ejecutándose en segundo plano.

Si fueras como yo, detén el servicio de ubicación y usa el temporizador para reiniciarlo en segundo plano, NO funcionará.

Para obtener información más detallada, puede ver los primeros 8 minutos del video 307 de la WWDC 2013: https://developer.apple.com/wwdc/videos/

Actualización de febrero de 2014: puedo obtener la ubicación continuamente desde el dispositivo usando iOS 7 después de varios meses de bashs. Puede ver la respuesta completa aquí: Los servicios de ubicación en segundo plano no funcionan en iOS 7

¿El icono en la barra de estado está encendido? Es un comportamiento extraño que tuve también. Compruebe mi pregunta: startMonitoringSignificantLocationChanges pero después de un tiempo didUpdateLocations ya no se llama

Descubrí que los cambios de ubicación significativos estaban encendidos, pero simplemente detener y reiniciar el servicio (para cambios significativos) no estaba activando nuevas ubicaciones.