Как Nike + GPS на iPhone получает обновления акселерометра в фоновом режиме? - PullRequest
33 голосов
/ 03 января 2012

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

Ответы [ 2 ]

12 голосов
/ 07 марта 2012

Чтобы дать ответ на этот вопрос, даже если он уже сам отвечает ...

"Если вы используете более новый 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];
        });
    }];
}
0 голосов
/ 28 июля 2017

При появлении блока с обновлением шагомера, я вызываю способ выключить и включить 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()
    }
}
...