web-dev-qa-db-ja.com

iPhoneのNike + GPSは、バックグラウンドで加速度計の更新をどのように受信しますか?

IOS5用の新しいNike + GPSアプリケーションは、バックグラウンドで加速度計イベントを処理できます(したがって、屋内のトレッドミル追跡が可能になります)。これはどのように可能ですか?アプリケーションをバックグラウンドに置くと、イベントの受信が停止します。標準のUIAccelerometerAPIを使用しています。

33
kyrpoff

この質問への回答を提供するために、それはすでに自己回答されていますが...

「新しいCoreMotion APIを使用すると、バックグラウンドで更新を受け取ることができます。」

次に例を示します。

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

歩数計の更新がブロックされたら、GPSをオフにしてからオンにするメソッドを呼び出します。私にとっては、ユーザーがホームを押してSpotifyで音楽を1時間聴いたときに問題が解決しました。

プロジェクト設定->機能->バックグラウンドモード->場所の更新を有効にすることを忘れないでください

    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