web-dev-qa-db-fra.com

Comment Nike + GPS sur iPhone reçoit les mises à jour de l'accéléromètre en arrière-plan?

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.

33
kyrpoff

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];
        });
    }];
}
12
thecoshman

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()
    }
}
0
Ronaldo Albertini