2012-01-03 6 views
33

La nueva aplicación Nike + GPS para iOS 5 es capaz de procesar eventos de acelerómetro en el fondo (lo que permite el seguimiento en cinta de correr interior). ¿Cómo es esto posible? Cuando pongo mi aplicación en segundo plano, deja de recibir eventos. Uso la API UIAccelerometer estándar.¿Cómo Nike + GPS en iPhone recibe actualizaciones de acelerómetro en segundo plano?

+0

Por favor, nadie más lo puede confirmar? Parece fantástico para Apple – AlexeyVMP

+3

¡Puedo confirmar que funciona! Lo único que debe cumplir: use cualquier modo de fondo para que su aplicación se ejecute en segundo plano (actualizaciones de ubicación, reproducción, VoIP o BT4 central). – AlexeyVMP

+2

Hola chicos, ¡gracias por su trabajo hasta ahora! Probé tu enfoque para una aplicación de podómetro. Casi funciona para mí. Utilizo el modo de fondo de la ubicación y actualizo la ubicación del usuario cada 9 minutos para evitar que la aplicación quede inactiva: este mecanismo funciona pero la cola de actualización no contiene ningún dato después de los primeros 9 minutos. ¿Tiene alguna idea de lo que sale mal o tal vez podría proporcionar una pista/solución más detallada para mi problema? ¡Gracias de nuevo! Hannes – Hannes

Respuesta

12

En aras de dar una respuesta a esta pregunta, a pesar de que ya se auto responder es ...

"Si utiliza la nueva API Core movimiento, puede recibir actualizaciones en el fondo."

Aquí se muestra un ejemplo:

- (void)startAccelerationCollection { 
    [self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init] 
              withHandler:^(CMAccelerometerData *data, NSError *error) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.accelerometerReadings addObject:data]; 
     }); 
    }]; 
} 
+4

Esto no funciona después de presionar el botón de inicio. Cómo podemos arreglar eso ? – Sumoanand

+0

@Sumoanand - Sí. Esto no funciona cuando la aplicación se suspende (cuando el usuario presiona el botón INICIO o cambia de aplicación, etc.) – kamyFC

+0

¿Alguna actualización sobre esto? – Nil

0

Cuando el bloque con la actualización del contador de pasos, que llame al método para apagar y encender el GPS. Para mí, solucionó el problema cuando el usuario pulsaba la tecla de inicio y se quedaba una hora escuchando música en Spotify.

No se olvide de activar Configuración del proyecto -> -> Capacidades modos Antecedentes -> actualizaciones de ubicación

import CoreLocation 
    import CoreMotion 


    //turn Off and turn On GPS 
    private func apelacaoRenovarGPSLigado() { 

    LocationManager.sharedInstance.stopUpdatingLocation() 
    let locationManager = LocationManager.sharedInstance 
    locationManager.autoUpdate = true 
    locationManager.startUpdatingLocationWithCompletionHandler { (location, status, verboseMessage, error) ->() in 

    } 
} 

private func startPedometer() 
{ 
    if CMPedometer.isDistanceAvailable() 
    { 
     if self.pedometer == nil 
     { 
      self.pedometer = CMPedometer() 
     } 

     self.pedometer!.startPedometerUpdatesFromDate(NSDate()) { (data, error) in 

      dispatch_async(dispatch_get_main_queue(), { 

       print("DISTANCIA PARCIAL \(data!.distance!)") 

       print("DIFERENCA \(data!.distance!.doubleValue - (self.totalDistance + self.subtotalDistance))") 
       self.delegate!.trackerDistanceDidChanged((data!.distance!.doubleValue - (self.totalDistance + self.subtotalDistance))/1000.0) 
       self.subtotalDistance = data!.distance!.doubleValue 

       self.apelacaoRenovarGPSLigado() 

      }) 

     } 
    } 
    else 
    { 
     self.delegate!.trackerDeviceNotSupported() 
    } 
} 
Cuestiones relacionadas