Recientemente he actualizado mi iOS dispositivos que utilizan iOS 7. Una de las aplicaciones que estamos desarrollando utiliza de fondo de los servicios de ubicación para rastrear la ubicación del dispositivo y todos nuestros probadores han informado de que la aplicación ya no aparece a la pista en el fondo de iOS 7.

Hemos comprobado que el fondo de la página de la aplicación está habilitada en la configuración del dispositivo y de la generación anterior funcionó a la perfección bajo iOS 6. Incluso si el dispositivo se reciclan, la aplicación se reinicia después de una actualización de la ubicación.

¿Hay algo más que necesita ser hecho para hacer este trabajo en virtud de iOS 7?

InformationsquelleAutor Alan Samet | 2013-09-22

7 Comentarios

  1. 47

    Aquí está la solución que he utilizado para obtener continua de la ubicación de iOS 7 dispositivos no importa que esté en primer plano o de fondo.

    Usted puede encontrar toda la solución y la explicación de su blog y también en github:-

    1. Fondo de Actualización de la Ubicación de Programación para iOS 7, y 8

    2. Github del Proyecto: Antecedentes de Actualización de la Ubicación de Programación para iOS 7, y 8

    Métodos y Explicación:-

    1. Me reinicie el administrador de ubicación de cada 1 minuto en función de didUpdateLocations

    2. Puedo permitir que el administrador de ubicaciones para obtener la ubicación del dispositivo durante 10 segundos antes de apagarlo (para ahorrar batería).

    Parcial Código A Continuación:-

    -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    for(int i=0;i<locations.count;i++){
    CLLocation * newLocation = [locations objectAtIndex:i];
    CLLocationCoordinate2D theLocation = newLocation.coordinate;
    CLLocationAccuracy theAccuracy = newLocation.horizontalAccuracy;
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    if (locationAge > 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: tengo un par de peticiones para agregar códigos de ejemplo en el envío de la ubicación del servidor durante un cierto intervalo de tiempo. He añadido los códigos de ejemplo y también combinado una corrección para BackgroundTaskManager para resolver un problema de fondo de funcionamiento durante un período prolongado de tiempo. Si usted tiene cualquier pregunta, usted es bienvenido a unirse a nosotros para una discusión aquí: Fondo de Actualización de la Ubicación de Programación para iOS 7, la Actualización de la Ubicación del Servidor de Discusión

    Actualización en enero de 2015: Si desea obtener la actualización de la ubicación, incluso cuando la aplicación está suspendida, por favor consulte: Obtener Actualizaciones de Ubicación para la Aplicación de iOS, Incluso cuando se Suspendió

    • actualiza a iOS 7.1 no requieren de estas soluciones, ¿correcto?
    • No estoy seguro. No he intentar la solución anterior en iOS 7.1. Voy a probar eso cuando tengo tiempo.
    • Lo que si usamos de Fondo mecanismo de Captura de despertar a la aplicación cuando no se está ejecutando? No sé si es aceptable por parte de apple para utilizar BackgroundFetch para obtener detalles de la ubicación.
    • Sí, Fondo búsqueda es posible y creo que es aceptable por parte de Apple. La solución que he proporcionado es sólo bueno para las aplicaciones que necesitan constante actualización de la ubicación para cada N minutos. Si tu aplicación no necesita la frecuente actualización de la ubicación, el Fondo de recuperación solicitud es en realidad una mejor solución.
    • Es posible iniciar el administrador de ubicación en el fondo cuando se utiliza de fondo fetch? Entonces, eso sería una solución mejor para mí que la actualización de la ubicación de cada minuto..
    • Hey Rickey me gusta tu código y lo he descargado y probado su github del proyecto, pero por favor, puedes agregar un tutorial acerca de cómo agregar el código a anyones otro proyecto?
    • Sí, lo haré cuando tenga tiempo. Voy a añadir instrucciones adicionales y también la Cocoapod en el Github del proyecto.
    • I love u hombre 🙂 me he descargado el código y utiliza sus clases con poco cambio en mi AppDelegate. Se está trabajando como un encanto muchas Gracias
    • No hay problema.. 😉
    • Hay una razón por la que estás programando en didUpdateLocations en lugar de restartLocationUpdates? Yo creo que un patrón como: 1. Horario de restartLocationUpdates. 2. Al final de restartLocationUpdates programar otra llamada de restartLocationUpdates. Me gustaría pensar que este patrón puede ser más seguro porque usted no tiene que depender de didUpdateLocations que se llama. En relación a señalar, ya que usted está confiando en didUpdateLocations que ha sido llamado, debe también reprogramar restartLocationUpdates en el didFailWithError delegado?
    • iOS 9 mata se apaga después de 3 minutos, pero se puede arreglar con un código rápido, además de que he encontrado en este comentario: mobileoop.com/…
    • me podrían ayudar a hacer swift

  2. 18

    Si usted mira en la WWDC 2013 Sesión de vídeo de #204 – ¿Qué hay de nuevo con la multitarea pdf, página número 15 menciona claramente que las aplicaciones no lanzar en el fondo si el usuario mata desde la app switcher. Por favor vea la imagen,

    Antecedentes de los Servicios de Ubicación no funciona en iOS 7

    • Hasta el siguiente reinicio
  3. 15

    Creo que hicieron una optimización (probablemente con el uso de sensores de movimiento), para detectar «relativamente» estacionaria de posicionamiento del teléfono y detener las actualizaciones de localización. Esto es sólo una especulación, pero mis pruebas actualmente mostrar:

    1. Partir de las actualizaciones de ubicación; (probado con una precisión de 10 y 100 metros, 3 veces cada uno)
    2. De giro del dispositivo de apagado de pantalla para poner la aplicación en segundo plano;
    3. Deje el dispositivo estacionario (por ejemplo, sobre una mesa) durante 30 min.

    Los datos que muestra el registro de la geo-actualizaciones dejar de venir después de ~ 15 m y 30 años. Con que todos los demás procesamiento en segundo plano que hacer es interrumpido.

    Mi dispositivo es un iPhone 5 con iOS 7.

    Estoy 95% seguro, este no era el caso en iOS 6/6.1. Donde conseguir geo actualizaciones con 100m de precisión utilizado para dar más o menos continua ejecutando en segundo plano.

    Actualización

    Si usted reinicie el administrador de ubicación de cada 8 minutos, se debe ejecutar de forma continua.

    Actualización #2

    Yo no he probado esto en últimas, pero esta es la forma en que me reinicia cuando escribí el post. 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;
    }
    }
    • Esto parece estar en línea con lo que he observado. Siempre me estoy moviendo la aplicación permanece activa, pero si estoy parado durante un período prolongado de tiempo, es como CoreLocation ignora la pausesLocationUpdatesAutomatically configuración y nunca se reanuda.
    • Exactamente. Si deja las actualizaciones, es como que nunca se reanudó.
    • He actualizado la respuesta.
    • podría publicar un fragmento de código? Me estoy dando cuenta de que si yo reinicio de administrador de ubicaciones en el fondo, la tarea es finalmente asesinado cuando backgroundTimeRemaining llega a cero.
    • gracias por los consejos. Hice un reinicio de administrador de ubicación de todos los minutos, la app capaz de informar de nuestro localización del usuario de forma continua. Sin embargo, me enteré de que el uso de este enfoque, la batería para teléfono de morir más rápido de lo que se esperaba.. me.e antes de los cambios, Nuestra prueba teléfonos (iPhone 5, 4S) se puede ejecutar desde las 8am hasta las 10pm, Después de los cambios, la batería muera a las 4:00pm…es este el mismo resultado en su final?
    • Mis pruebas muestran que el 10% por hora con AccuracyBest, 5% por hora AccuracyHundredMeters. Probado con el iPhone 5.
    • por favor, puedes subir algo de código o ejemplo respecto de ella.
    • He incluido un fragmento de ahora. Espero que esto sea útil.
    • Muchas gracias por la actualización,pero me puede decir dónde llamar a este método, tiene la llamo en NSTimer ? Sería genial si después de esa línea también.
    • Estoy usando CoreMotion a la pista de algunos de los dispositivos de sensores. Tengo un bloque que se llama con los cambios y que cuando me llame tryRestartLocationManager. Simplemente dijo, yo ejecutar continuamente algo más (no lo he probado con un temporizador, pero debería funcionar) y constantemente me llame a este método. Timer es una mejor opción y si nada relacionado cambiado en iOS debe estar funcionando.
    • Thnks por la respuesta de nuevo 🙂 . tengo una pregunta puedo llamar [locationManager startUpdatingLocation]; en backgroud , cuando pushnotification se llama?
    • no estoy seguro. Mi conjetura es que usted tiene que comenzar en el primer plano y, a continuación, reinicie en una tarea de fondo.
    • He encontrado una solución que podría ayudar a ambos. Usted puede tomar un vistazo a la respuesta: stackoverflow.com/questions/18946881/…
    • Has probado con iOS 7.1?
    • Nope, no lo he hecho.
    • Sus ok cuando las actualizaciones de ubicación de la parada cuando el dispositivo no se mueva, este siempre fue el caso, ya que ios5. Hizo el servicio de ubicaciones reiniciar proporcionando lugares cuando se mueve de nuevo, o fue el servicio de ubicación para siempre?

  4. 7

    Uno de mis app de iOS necesita enviar actualización de la ubicación del servidor a intervalos regulares y siguientes enfoque trabajado para nosotros…..

    De partida en iOS 7:

    • una aplicación debe ya han estado utilizando los servicios de localización
      (startUpdatingLocation) ANTES de haber sido segundo plano en el orden de
      los elegibles para el fondo de tiempo de ejecución
    • el fondo de gracia período de tiempo de espera se ha reducido de 10 minutos a 3
      minutos
    • detener las actualizaciones de ubicación (a través de stopUpdatingLocation) comenzará el 3
      minuto backgroundTimeRemaining contar
    • partir de las actualizaciones de ubicación, mientras que ya en el fondo no
      restablecer el backgroundTimeRemaining

    Así, NO DEJE las actualizaciones de ubicación en cualquier momento…en su Lugar, prefieren utilizar la precisión necesaria (excelente ubicación vs grueso de la ubicación). Grueso ubicación no consume mucho la batería…por lo que esta solución resuelve el problema.

    Después de mucho buscar en línea, encuentra un enlace que proporcionan una solución viable para iOS 7. La solución es la siguiente:

    • Mientras que la aplicación todavía está en el primer plano, el lugar de inicio de las actualizaciones
      (startUpdatingLocation) pero establecer la precisión y la distancia filtros para
      muy curso de grano (por ejemplo, de 3 km) actualizaciones. Es importante hacer esto
      en el primer plano (en applicationDidEnterBackground es demasiado tarde).
    • Cuando una de grano fino, se requiere la resolución, establecer temporalmente el
      la precisión y la distancia de los filtros para obtener la mejor ubicación posible, y
      a continuación, volver a el curso de grano valores–, pero nunca dejar de
      actualizaciones de ubicación.
    • Debido a la ubicación de las actualizaciones son siempre habilitada, la aplicación no va a conseguir
      suspende cuando se va al fondo.

    Y asegúrese de añadir el siguiente a su solicitud de Información.plist
    «la ubicación» a la UIBackgroundModes clave
    «la ubicación de los servicios» y «gps» para el UIRequiredDeviceCapabilities clave

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

  5. 5

    He encontrado otro hilo El lugar de inicio del Administrador en el sistema operativo iOS 7 de tarea en segundo plano Banda mencionó que

    He encontrado el problema/solución. Cuando es el momento para iniciar el servicio de ubicación y detener la tarea en segundo plano, de fondo tarea debe ser detenido con un retraso (me puse de 1 segundo). De lo contrario, el servicio de ubicación no comienzan.

    ¿Alguien puede probar y verificar que?

    Nikolay, puede pegar aquí el código? He probado a reiniciar el administrador de ubicación de cada 8 minutos, pero no se ejecuta de forma continua.

    Actualización:

    Después de buscar en Alta y Baja, he encontrado la Solución de Apple Foro!

    En iOS 7, no se puede iniciar el servicio de ubicación en el fondo. Si desea que el servicio de ubicación para seguir funcionando en el fondo, usted tiene que comenzar en primer plano y seguirá ejecutándose en segundo plano.

    Si fueras como yo, detenga el servicio de ubicación y uso del temporizador para volver a empezar en el fondo, NO va a funcionar.

    Para obtener información más detallada, se pueden ver los primeros 8 minutos de vídeo 307 de la WWDC 2013: https://developer.apple.com/wwdc/videos/

    Feb 2014 Actualización:
    Puedo obtener la ubicación de forma continua desde el dispositivo con iOS 7 después de varios meses de intentar. Usted puede ver la respuesta completa aquí: Antecedentes de los Servicios de Ubicación no funciona en iOS 7

    • Lo siento, no he visto que hay cualquier desarrollo en este hilo (¿por qué no disparar un correo electrónico, stackoverflow?).Estoy empezando en el primer plano. Aún así, estoy reiniciando en el fondo, cada 8 minutos.
    • Cuando usted dice «reiniciar en el fondo», ¿te refieres a llamar startUpdatingLocation/stopUpdatingLocation?
    • Lo siento chicos, me podrían ayudar a saber cómo iniciar los servicios de ubicación en primer plano?? ¿Qué debo hacer? Realmente le agradezco su ayuda. Gracias
    • se puede cambiar la precisión deseada o distanceFilter cuando la aplicación pasa a segundo plano?
    • Chicos, después de más de 2 meses de tratar muchos tipos diferentes de soluciones. He encontrado una muy buena solución que consumen menos de 5% de batería por hora. Voy a compartir la solución con todos ustedes en un par de días.
    • ¿has publicado tu solución? Yo también trabajo en este tema y no puede resolverlo. Esta es mi pregunta: stackoverflow.com/questions/21220245/…
    • sería genial si la publicación de su solución.
    • Lo siento por la tardanza. Acabo de actualizar mi respuesta a continuación.
    • Nunca he entendido de tu fondo de los problemas. mi aplicación se ejecuta en el fondo de conseguir un lugar por segundo. Nunca detuve ubicaciones de grabación (he probado mientras estoy en movimiento, senderismo). (iphone 4, ios 6, ios 7.1, AccuarcyBest). Cualquier tips de cómo probar si es que sucede en mi app también?
    • Es la aplicación de envío de las coordenadas de ubicación de cada N minutos a su servidor? Si es así, usted puede intentar este. Ejecutar la aplicación en segundo plano durante 30 minutos – 1 hora. Compruebe que el servidor de base de datos para ver si usted tiene la ubicación para cada N minutos. Si se deja de enviar la ubicación después de algún tiempo, significa que la aplicación ha sido terminado en el fondo.
    • Si usted necesita para asegurarse de que su ubicación no será detenido por el sistema después de 15 minutos en el fondo, a continuación, puede implementar como aquí: stackoverflow.com/a/28373247/2102779

  6. 0

    Debe establecer pausesLocationUpdatesAutomatically propiedad de CLLocationManagerclase a falso para deshabilitar el sistema de la pausa de la ubicación de las actualizaciones.

Dejar respuesta

Please enter your comment!
Please enter your name here