¿Cómo Nike + GPS en iPhone recibe actualizaciones de acelerómetro en el fondo?

La nueva aplicación Nike + GPS para iOS 5 es capaz de procesar eventos de acelerómetro en segundo plano (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.

Por el bien de proporcionar una respuesta a esta pregunta, a pesar de que ya está respondida por uno mismo …

“Si usa la API Core Motion más nueva, puede recibir actualizaciones en segundo plano”.

Aquí hay 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]; }); }]; } 

Cuando el bloque con la actualización del podómetro, llamo 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 olvides habilitar Configuración del proyecto -> Capacidades -> Modos de fondo -> 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() } }