首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询HealthKit for HKCategoryTypeIdentifierSleepAnalysis

查询HealthKit for HKCategoryTypeIdentifierSleepAnalysis
EN

Stack Overflow用户
提问于 2015-11-06 00:09:51
回答 2查看 3K关注 0票数 8

我已经构建了一个导入睡眠样本的方法,但是我无法获得它来返回睡眠数小时的适当值。

查询睡眠数据的方法如下所示:

代码语言:javascript
复制
func updateHealthCategories() {

    let categoryType = HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)

    let start = NSDate(dateString:"2015-11-04")
    let end = NSDate(dateString:"2015-11-05")

    let categorySample = HKCategorySample(type: categoryType!,
        value: HKCategoryValueSleepAnalysis.Asleep.rawValue,
        startDate: start,
        endDate: end)

    self.hoursSleep = Double(categorySample.value)

    print(categorySample.value)
}

日期的格式如下:

代码语言:javascript
复制
extension NSDate
{
    convenience
    init(dateString:String) {
        let dateStringFormatter = NSDateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd"
        dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
        let d = dateStringFormatter.dateFromString(dateString)!
        self.init(timeInterval:0, sinceDate:d)
    }
}

我调用11月4日至5日的数据,其中包含以下数据:

但是,categorySample.value返回的是1而不是3

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-06 00:44:36

您正在访问的值是类别示例值、HKCategoryType,而不是睡眠时数。

HKCategoryTypeIdentifierSleepAnalysis的定义

代码语言:javascript
复制
typedef enum : NSInteger {
   HKCategoryValueSleepAnalysisInBed,
   HKCategoryValueSleepAnalysisAsleep,
} HKCategoryValueSleepAnalysis;

定义两个可能的值,0或1,其中1的值与HKCategoryValueSleepAnalysisAsleep匹配。

要想入睡需要设置一个HKSampleQuery

代码如下所示:

代码语言:javascript
复制
if let sleepType = HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis) {

    let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: .None)
    let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)
    let query = HKSampleQuery(sampleType: sleepType, predicate: predicate, limit: 30, sortDescriptors: [sortDescriptor]) { (query, tmpResult, error) -> Void in                  
        if let result = tmpResult {
            for item in result {
                if let sample = item as? HKCategorySample {                     
                    let value = (sample.value == HKCategoryValueSleepAnalysis.InBed.rawValue) ? "InBed" : "Asleep"                     
                    print("sleep: \(sample.startDate) \(sample.endDate) - source: \(sample.source.name) - value: \(value)")
                    let seconds = sample.endDate.timeIntervalSinceDate(sample.startDate)
                    let minutes = seconds/60
                    let hours = minutes/60
                }
            }
        }
    }

    healthStore.executeQuery(query)
}

我从http://benoitpasquier.fr/sleep-healthkit/中总结了这一点。

票数 9
EN

Stack Overflow用户

发布于 2022-10-29 10:49:16

这是Swift 5,iOS 16兼容的答案,如果有人还在寻找。您可以根据需要解析/操作数据。

代码语言:javascript
复制
func getSleepAnalysis() {
    let healthStore = HKHealthStore()
    let endDate = Date()

    guard let startDate = Calendar.current.date(byAdding: .day, value: -7, to: endDate) else {
        fatalError("*** Unable to create the start date ***")
    }


    // first, we define the object type we want
    guard let sleepType = HKObjectType.categoryType(forIdentifier: .sleepAnalysis) else {
        return
    }

    // we create a predicate to filter our data
    let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictStartDate)

    // I had a sortDescriptor to get the recent data first
    let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)

    // we create our query with a block completion to execute
    let query = HKSampleQuery(sampleType: sleepType, predicate: predicate, limit: Int(HKObjectQueryNoLimit), sortDescriptors: [sortDescriptor]) { (query, result, error) in
        if error != nil {
            // handle error
            return
        }

        if let result = result {

            // do something with those data
            result
                .compactMap({ $0 as? HKCategorySample })
                .forEach({ sample in
                    guard let sleepValue = HKCategoryValueSleepAnalysis(rawValue: sample.value) else {
                        return
                    }

                    let isAsleep = sleepValue == .asleep
                    print("HealthKit sleep \(sample.startDate) \(sample.endDate) - source \(sample.sourceRevision.source.name) - isAsleep \(isAsleep)")
                })
        }
    }

    // finally, we execute our query
    healthStore.execute(query)
}

我希望您能在此之前获得SleepAnalysis的授权,以便检索数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33557205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档