La nouvelle application Nike + GPS pour iOS 5 est capable de traiter les événements de l’accéléromètre en arrière-plan (permettant ainsi le suivi du tapis de course à l’intérieur). Comment est-ce possible? Lorsque je mets ma candidature en arrière-plan, les événements ne sont plus reçus. J'utilise l'API UIAccelerometer standard.
Afin de répondre à cette question, même si elle répond déjà à elle-même ...
"Si vous utilisez la nouvelle API Core Motion, vous pouvez recevoir les mises à jour en arrière-plan."
Voici un exemple:
- (void)startAccelerationCollection {
[self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init]
withHandler:^(CMAccelerometerData *data, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.accelerometerReadings addObject:data];
});
}];
}
Lorsque le bloc avec mise à jour du podomètre, j'appelle la méthode pour désactiver et activer le GPS. Pour moi, le problème a été résolu lorsque l'utilisateur appuyait sur la touche d'accueil et restait une heure à écouter de la musique sur Spotify.
N'oubliez pas d'activer les paramètres du projet -> Capacités -> Modes d'arrière-plan -> Mises à jour de la position
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()
}
}