Странное свойство Expo.Pedometer.getStepCountAsync - PullRequest
0 голосов
/ 05 июня 2019

Я не уверен, что это проблема с шагомером Expo или iOS, но я заметил странное поведение, описанное ниже.

Представьте, что у нас есть временной интервал t1 - t2, разделенный t0, то есть t1 < t0 < t2. Теперь, если мы посчитаем шаг в каждом из этих интервалов:

import { Pedometer } from 'expo';

const steps1 = await Pedometer.getStepCountAsync(t1, t0);
const steps2 = await Pedometer.getStepCountAsync(t0, t2);
const steps3 = await Pedometer.getStepCountAsync(t1, t2);

Я ожидаю, что следующая разница будет близка к 0 (если не всегда 0):

difference = steps1 + steps2 - steps3

Но я заметил, что на практике это часто не так. Разница может быть 100, 200 или даже 1000 шагов. Что еще хуже, если вы попытаетесь «переместиться» t0 в примере, эта разница также изменится.

Что еще хуже, кажется, что это происходит не всегда. Мой iPhone 8 имеет эту проблему, возможно, 2 дня в месяце. И несмотря на то, что это выглядит довольно глупо, но я заметил, что это происходит, когда в течение дня возникают проблемы с подключением.

Вопрос: Почему шаги в каждом интервале не равны шагам в интервале объединения?

1 Ответ

0 голосов
/ 05 июня 2019

Я думаю, что нашел решение для этого.

Если вы хотите найти шаги в интервале от t1 до t2 вместо:

const steps = await Pedometer.getStepCountAsync(t1, t2);

сделать следующее:

const t0 = new Date(0);
const steps1 = await Pedometer.getStepCountAsync(t0, t1);
const steps2 = await Pedometer.getStepCountAsync(t0, t2);
const steps = steps2 - steps1; // THIS IS THE ANSWER!

Это не решает проблему с самим шагомером / Экспо, но дает стабильное решение: все шаги в подинтервалах теперь складываются в шаги во всем интервале.

ВАЖНОЕ ОБНОВЛЕНИЕ

Решение выше работает для iOS, но вылетает шагомер на Android. Поэтому я пришел с другим решением (использовать более короткий интервал):

const t0 = startOfDay(t1); // beginning of the same day works fine for me
const steps1 = await Pedometer.getStepCountAsync(t0, t1);
const steps2 = await Pedometer.getStepCountAsync(t0, t2);
const steps = steps2 - steps1; // THIS IS THE ANSWER!

ЕЩЕ ОДНО ВАЖНОЕ ОБНОВЛЕНИЕ

Также я заметил, что если вы сделаете что-то вроде:

await Pedometer.getStepCountAsync(t0, t0); // when both parameters are equal

Это также дает сбой на Android.

ДАЖЕ БОЛЬШЕ ВАЖНОЕ ОБНОВЛЕНИЕ

Обратите внимание, что t0 должно быть началом дня !!! Я узнал об этом, экспериментируя с разными устройствами. Также, чтобы избежать ошибки Android при прохождении одинакового времени, просто добавьте функцию-обертку, которая проверяет равенство дат и возвращает 0 в таком случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...