Как различать источники с помощью запроса сна HealthKit - PullRequest
0 голосов
/ 08 мая 2020

В настоящее время я использую следующий код для запроса количества часов, в течение которых пользователь спал за последние 24 часа:

   func getHealthKitSleep() {
        let healthStore = HKHealthStore()
        let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)

        // Get all samples from the last 24 hours
        let endDate = Date()
        let startDate = endDate.addingTimeInterval(-1.0 * 60.0 * 60.0 * 24.0)
        let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: [])

        // Sleep query
        let sleepQuery = HKSampleQuery(
            sampleType: HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis)!,
            predicate: predicate,
            limit: 0,
            sortDescriptors: [sortDescriptor]){ (query, results, error) -> Void in
                if error != nil {return}
                // Sum the sleep time
                var minutesSleepAggr = 0.0
                if let result = results {
                    for item in result {
                        if let sample = item as? HKCategorySample {
                            if sample.value == HKCategoryValueSleepAnalysis.asleep.rawValue && sample.startDate >= startDate {
                                let sleepTime = sample.endDate.timeIntervalSince(sample.startDate)
                                let minutesInAnHour = 60.0
                                let minutesBetweenDates = sleepTime / minutesInAnHour
                                minutesSleepAggr += minutesBetweenDates
                            }
                        }
                    }
                    self.sleep = Double(String(format: "%.1f", minutesSleepAggr / 60))!
                    print("HOURS: \(String(describing: self.sleep))")
                }
        }
        // Execute our query
        healthStore.execute(sleepQuery)
    }

Это отлично работает, если у пользователя есть только одно приложение для сна в качестве источник данных. Проблема в том, что если пользователь использует 2 приложения для сна, например, в качестве источников, данные будут удвоены. Как я могу различать источники? Если у меня есть возможность различать источники, я хотел бы либо брать данные только из одного источника, либо, возможно, брать среднее значение из источников.

1 Ответ

0 голосов
/ 19 августа 2020

Когда вы просматриваете семплы, вы можете получить доступ к информации об источнике для каждого. Я принимаю только один источник, поэтому я просто сохраняю переменную имени источника, и если текущий образец имеет другое имя источника, я продолжаю цикл без обработки данных из этого образца, но вы можете объединить данные другими способами, если хотите to.

Вот как получить доступ к информации об источнике:

if let sample = item as? HKCategorySample {
    let name = sample.sourceRevision.source.name
    let id = sample.sourceRevision.source.bundleIdentifier
}

Дополнительная информация об объекте HKSourceRevision приведена здесь .

...