Как Nike+ GPS на iPhone получает обновления акселерометра в фоновом режиме?

Новое приложение Nike+ GPS для iOS 5 способно обрабатывать события акселерометра в фоновом режиме (что позволяет отслеживать беговую дорожку в помещении). Как это возможно? Когда я помещаю свое приложение в фоновый режим, оно перестает получать события. Я использую стандартный UIAccelerometer API.

2 ответа

Ради предоставления ответа на этот вопрос, даже если он уже сам ответил...

"Если вы используете более новый Core Motion API, вы можете получать обновления в фоновом режиме".

Вот пример:

- (void)startAccelerationCollection {
    [self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init]
                                             withHandler:^(CMAccelerometerData *data, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.accelerometerReadings addObject:data];
        });
    }];
}

Когда блок с обновлением шагомера, я вызываю метод, чтобы выключить и включить GPS. Для меня это исправило проблему, когда пользователь нажимал домой и оставался в течение часа, слушая музыку на spotify.

Не забудьте включить Настройки проекта -> Возможности -> Фоновые режимы -> Обновления местоположения

    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()
    }
}
Другие вопросы по тегам