Health обрабатывает несколько источников шагов иначе, чем HealthKit - swift

Приложение My Swift для iOS подключается к HealthKit, чтобы показать пользователю, сколько шагов он сделал за день. По большей части это удается. Когда единственным источником шагов являются шаги, записанные встроенной функцией шагомера iPhone, все работает нормально, и количество шагов, показываемое моим приложением, совпадает с количеством шагов в приложении Health. Однако, когда есть несколько источников данных - на моем личном iPhone, моих умных часах Pebble Time и шагомере iPhone оба передают шаги в Health, - мое приложение сходит с ума, записывая все шаги с обоих. В то время как приложение iOS Health исключает повторяющиеся шаги (что оно может делать, потому что и мой iPhone, и мой Pebble сообщают о шагах в Health каждые 60 секунд) и показывают точное ежедневное количество шагов, данные, которые мое приложение получает из HealthKit, включают все шаги из обоих источники, вызывающие большие неточности.

Как я могу получить доступ к окончательному результату приложения Health с точным подсчетом шагов, вместо того, чтобы подключаться к потоку завышенных данных HealthKit о шагах?

ОБНОВЛЕНИЕ. Вот код, который я использую для ежедневного получения данных о состоянии здоровья:

func recentSteps2(completion: (Double, NSError?) -> () )
    {

        checkAuthorization() // checkAuthorization just makes sure user is allowing us to access their health data.
        let type = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) // The type of data we are requesting


        let date = NSDate()
        let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let newDate = cal.startOfDayForDate(date)
        let predicate = HKQuery.predicateForSamplesWithStartDate(newDate, endDate: NSDate(), options: .None) // Our search predicate which will fetch all steps taken today

        // The actual HealthKit Query which will fetch all of the steps and add them up for us.
        let query = HKSampleQuery(sampleType: type!, predicate: predicate, limit: 0, sortDescriptors: nil) { query, results, error in
            var steps: Double = 0

            if results?.count > 0
            {
                for result in results as! [HKQuantitySample]
                {
                    steps += result.quantity.doubleValueForUnit(HKUnit.countUnit())
                }
            }

            completion(steps, error)
        }

        storage.executeQuery(query)
    }

person owlswipe    schedule 11.04.2016    source источник
comment
Включите фрагмент кода, демонстрирующий, как вы рассчитываете количество шагов, которые делает пользователь. Какой тип запроса вы используете?   -  person Allan    schedule 12.04.2016
comment
@Allan Я обновил свой вопрос, включив в него код, который я использую для расчета шагов пользователя.   -  person owlswipe    schedule 12.04.2016


Ответы (1)


В вашем коде слишком много шагов, потому что он просто суммирует результаты HKSampleQuery. Образец запроса вернет все образцы, соответствующие заданному предикату, включая перекрывающиеся образцы из нескольких источников. Если вы хотите точно вычислить количество шагов пользователя с помощью HKSampleQuery, вам придется обнаруживать перекрывающиеся выборки и избегать их подсчета, что было бы утомительно и сложно сделать правильно.

В Health используются HKStatisticsQuery и HKStatisticsCollectionQuery для вычисления агрегированных значений. Эти запросы вычисляют для вас сумму (и другие агрегированные значения) и делают это эффективно. Однако, что наиболее важно, они устраняют дублирование перекрывающихся выборок, чтобы избежать чрезмерного подсчета.

документация для HKStatisticsQuery включает образец кода.

person Allan    schedule 12.04.2016
comment
Спасибо! Могу я получить дополнительную информацию о HKStatisticsQuery? Может быть, образец кода или ссылка на учебное пособие (я искал в Google, и это довольно редко)? - person owlswipe; 13.04.2016
comment
Вы пробовали посмотреть пример кода в справочной документации? developer.apple.com/library/ios/documentation/HealthKit/ < / а> - person Allan; 13.04.2016
comment
У вас это сработало? У нас та же проблема с шагами, собранными с помощью FitBit, и шагами, собранными с помощью iPhone. - person Mike Dee; 08.10.2020
comment
Хорошая точка зрения. Мы считаем минуты сна в нашем приложении и, к сожалению, не смогли найти простой способ их дедупликации, потому что анализ сна является типом категории в HealthKit, а это означает, что вы не можете использовать для них запросы HKStatistics. Есть ли у вас какие-либо предложения, как решить эту проблему, или сделать простые запросы HKSample, а затем сравнить startDate / endDate - единственный способ? Спасибо - person Igor Vasilev; 29.12.2020
comment
@IgorVasilev описанный вами подход - лучший способ обработки данных о сне, поскольку, как вы сказали, не существует эквивалента HKStatisticsCollectionQuery, который обрабатывает сон. - person Allan; 02.01.2021