Получите шаги в фоновом режиме с iOS 7

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

- (void)countSteps {
    [[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0 / KUPDATEFREQUENCY];
    [[UIAccelerometer sharedAccelerometer] setDelegate:self];

    px = py = pz = 0;
    numSteps = 0;

    self.labelSteps.text = [NSString stringWithFormat:@"%d", numSteps];
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    float xx = acceleration.x;
    float yy = acceleration.y;
    float zz = acceleration.z;

    float dot = (px * xx) + (py * yy) + (pz * zz);
    float a = ABS(sqrt(px * px + py * py + pz * pz));
    float b = ABS(sqrt(xx * xx + yy * yy + zz * zz));

    dot /= (a * b);

    if (dot <= 0.82) {
        if (!isSleeping) {
            isSleeping = YES;
            [self performSelector:@selector(wakeUp) withObject:nil afterDelay:0.3];
            numSteps += 1;
            self.labelSteps.text = [NSString stringWithFormat:@"%d", numSteps];
        }
    }
    px = xx;
    py = yy;
    pz = zz;
}

- (void)wakeUp {
    isSleeping = NO;
}

С этим кодом, когда дисплей iPhone включен, он отлично работает, но когда я выключаю дисплей, он больше не работает. Для отслеживания позиции я увидел, что в iOS 7 есть функция "фоновый режим". С помощью этой функции я могу получить координаты, когда дисплей iPhone выключен. Теперь я должен получить значения акселерометра, когда дисплей выключен, как я могу это сделать? Я читал в Интернете, что iOS не позволяет использовать акселерометр в фоновом режиме (только iPhone 5s с сопроцессором M7 может получить значение акселерометра при выключенном дисплее), как я могу подсчитать шаги, используя акселерометр в фоновом режиме? Я думаю, что должен быть способ, иначе я не могу понять, как работает приложение Moves.

1 ответ

Решение

Вы не можете получить доступ к акселерометру, когда дисплей выключен, но вы можете отслеживать изменения местоположения, даже если дисплей выключен, независимо от модели iPhone. По моим предположениям, приложение Moves использует геолокационные изменения для подсчета шагов. В документации CLLocationManger я читал это

В iOS 6 и более поздних версиях вы можете отложить доставку данных о местоположении, когда ваше приложение находится в фоновом режиме. Рекомендуется использовать эту функцию в ситуациях, когда ваше приложение может обработать данные позже без каких-либо проблем. Например, приложение, которое отслеживает местоположение пользователя на туристической тропе, может откладывать обновления до тех пор, пока пользователь не достигнет определенного расстояния, а затем обработать все точки сразу. Отсрочка обновлений помогает экономить электроэнергию, позволяя вашему приложению оставаться спящим в течение более длительных периодов времени.

- (void)allowDeferredLocationUpdatesUntilTraveled:(CLLocationDistance)distance timeout:(NSTimeInterval)timeout

Если ваше приложение работает в фоновом режиме, и система способна оптимизировать энергопотребление, диспетчер местоположений сообщает оборудованию GPS, чтобы оно сохраняло новые местоположения внутри до тех пор, пока не будут соблюдены указанное расстояние или время ожидания. Когда один или оба критерия удовлетворены, диспетчер местоположений заканчивает отложенные местоположения, вызывая locationManager: didFinishDeferredUpdatesWithError: метод его делегата и доставляет кэшированные местоположения в locationManager: didUpdateLocations: метод. Если ваше приложение находится на переднем плане, диспетчер местоположений не откладывает доставку событий, но отслеживает указанные критерии. Если ваше приложение переходит в фоновый режим до того, как критерии будут выполнены, менеджер местоположения может начать откладывать доставку событий.

Поэтому, когда вы получаете набор кэшированных расположений, вы можете рассчитать приблизительное количество шагов, которые произошли. Я просто даю все свои дикие мысли, решать только вам!

Смотрите также, кажется интересным https://www.cocoacontrols.com/controls/somotiondetector

Другие вопросы по тегам