Как получить общее количество шагов HealthKit за предыдущие даты

Я пытаюсь получить шаги от Health Kit, он отлично работает для мобильных устройств, но когда я подключаю Apple Watch, мое приложение получает больше шагов, чем Health kit. Я отслеживаю его и обнаруживаю, что он собирает подробную запись шагов, но общее количество шагов меньше, чем в аптечке.

Мое приложение получает сумму этих шагов:

введите здесь описание изображения

Но я хочу получить это:

введите здесь описание изображения

Вот мой код:

func MultipleDaysStepsAndActivitiesTest(_ startDate:Date, completion: @escaping (NSDictionary, [HealthKitManuallActivity], NSError?) -> () ) {
    let type = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount) // The type of data we are requesting

    let now = Date()

    let newDate = startDate

    let predicate = HKQuery.predicateForSamples(withStart: newDate, end: now, options: HKQueryOptions())

    var dates = now.datesBetweenGivenDates(startDate,endDate:now)
    dates = dates.reversed()

    let query = HKSampleQuery(sampleType: type!, predicate: predicate, limit: 0, sortDescriptors: nil) { query, results, error in

        var dict:[String:Double] = [:]

        if results?.count > 0 {

            for result in results as! [HKQuantitySample] {
                print(result)
                if result.sourceRevision.source.name != kHealthKitSource {

                    if dict[self.fmt.string(from: result.startDate)] != nil {
                        dict[self.fmt.string(from: result.startDate)] = dict[self.fmt.string(from: result.startDate)]! + result.quantity.doubleValue(for: HKUnit.count())

                    } else {
                        dict[self.fmt.string(from: result.startDate)] = result.quantity.doubleValue(for: HKUnit.count())
                    }
                }
            }
        }

        var sDate = startDate // first date
        let cal = Calendar.current
        print(dict)

        if dict.isEmpty {

            while sDate <= Date() {
                dict[self.fmt.string(from: sDate)] = 0
                sDate = cal.date(byAdding: .day, value: 1, to: sDate)!
            }

        } else {

            while sDate <= Date() {

                if dict[self.fmt.string(from: sDate)] == nil {
                    dict[self.fmt.string(from: sDate)] = 0
                }

                sDate = cal.date(byAdding: .day, value: 1, to: sDate)!
            }
        }

        // reading activities
        self.MultipleDaysWorkouts(startDate, endDate: now, completion: { (activities, error) in

            if results?.count == 0 {

                for activity in activities {
                    dict[activity.startDate] = 0.0
                }
            }

            // reading mindfulness activities

            self.MultipleDayMindFullnessActivity(startDate, completion: { (mindfulnessActivities, mindError) in

                if mindError == nil {

                    let allActivities = mindfulnessActivities + activities
                    completion(dict as NSDictionary, allActivities, mindError as NSError?)

                }

            })

        })

    }

    execute(query)
}

person Asim Ifitkhar Abbasi    schedule 20.06.2017    source источник
comment
Возможный дубликат Aggregated CMPedometerData (общее количество iPhone + Watch)   -  person Dávid Pásztor    schedule 20.06.2017


Ответы (1)


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

person Allan    schedule 20.06.2017
comment
это сделано с HKStatisticsCollectionQuery спасибо :-) - person Asim Ifitkhar Abbasi; 21.06.2017