webentwicklung-frage-antwort-db.com.de

Wie empfängt Nike + GPS auf dem iPhone Beschleunigungsmesser-Updates im Hintergrund?

Die neue Nike + GPS-Anwendung für iOS 5 kann Beschleunigungsmesserereignisse im Hintergrund verarbeiten (wodurch die Laufbandverfolgung in Innenräumen ermöglicht wird). Wie ist das möglich? Wenn ich meine Anwendung in den Hintergrund stelle, werden keine Ereignisse mehr empfangen. Ich benutze die Standard UIAccelerometer API.

33
kyrpoff

Um eine Antwort auf diese Frage zu geben, obwohl sie bereits selbst beantwortet wurde ...

"Wenn Sie die neuere Core Motion-API verwenden, können Sie Updates im Hintergrund erhalten."

Hier ist ein Beispiel:

- (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

Wenn der Block mit dem Update des Schrittzählers angezeigt wird, rufe ich die Methode zum Ausschalten und Einschalten des GPS auf. Für mich wurde das Problem behoben, wenn der Benutzer nach Hause drückt und eine Stunde lang Musik auf spotify hört.

Vergessen Sie nicht, die Projekteinstellungen -> Funktionen -> Hintergrundmodi -> Standortaktualisierungen zu aktivieren

    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