源码

首页 » 归档 » 源码 » 使用Swift在HealthKit中进行睡眠分析-ios学习从入门到精通尽在姬长信

使用Swift在HealthKit中进行睡眠分析-ios学习从入门到精通尽在姬长信

分享最热门的ios资讯

571495-96c1d78d8667c019.jpg

原文:Using Sleep Analysis in HealthKit with Swift,作者:Martin_Joy

当今社会,睡眠革命逐渐成为一种时尚,与以往相比,用户不仅想知道自己的睡眠时间,同时对用于分析他们一段时间内睡眠状态的数据也很感兴趣。科技的飞速生长,包罗硬件技术,尤其是手机技术的生长,为这个日益增长的需求带来了面目目样的曙光。

Apple提供了一种很酷的方式,可以宁静地访问用户的个人健康信息,并将这些信息宁静地存储在其内置应用Health。使用HealthKit框架,你不仅可以开发一个健身应用,还可以访问睡眠分析数据。

在这篇教程中,我将对HealthKit框架做个简要的介绍,并演示如何创建一款具有睡眠分析功能的简单应用。

简介

HealthKit框架提供一个叫HealthKit store的加密数据库用以存储数据。你可以使用HKHealthStore类来访问这个数据库。iPhone和Apple Watch都有自己的HealthKit store,而且用户健康状况的数据在两种设备之间是同步的。然而,需要注意的是,为了节约空间,旧数据会被周期性地从Apple Watch 中清除。此外,iPad不支持HealthKit和Health

HealthKit是一个很强大的工具,可以资助开发者们基于健康数据去创建一个iOS 或者 watchOS App。它可以管理多渠道的数据,而且凭据用户的偏好自动合并差别来源的数据。这些健康类App可以访问各个来源的原生数据,同时合并数据。这些数据不仅可以表明身体健康指标,健身和营养状况,还可以用来分析睡眠状态。

文章的后半部门内容,我将展示如何在iOS系统上使用HealthKit框架去存储和访问睡眠分析的数据。这些要领在watchOS应用上同样有效。

请注意:这篇教程的编程环境是 Swift 2.0 和 Xcode 7。所以学习这篇教程的时候,确定自己使用的是Xcode 7 或其更面目目样的版本。

在开始之前,请下载启动工程并解压。我已经为你创建了基本功能的用户界面。当你运行这个工程的时候,你将看到一个计时器UI,当你按下开始按钮以后就会显示计时。

使用HealthKit框架

我们要创建的应用目的是保存计时期间的睡眠分析信息和检索数据。要使用 HealthKit,开发者需要获取使用HealthKit的授权。在你的工程中,进行target -> capabilities -> 打开HealthKit开关操作。

HealthKit-allow-1024x640.jpg

接下来,你将需要在ViewController类中使用下面代码去创建一个HKHealthStore实例

let healthStore = HKHealthStore()

稍后我们将使用HKHealthStore实例去访问HealthKit Store。

正如上文提到的那样,HealthKit给予用户控制自身健康数据的权限。所以你首先不得不去请求用户的许可,这样你才可以访问(读/写)用户的睡眠分析数据。想要访问用户数据,前提是要导入内置的HealthKit 框架,并更面目目样在viewDidLoad中的代码如下:

override func viewDidLoad() {
    super.viewDidLoad()
    let typestoRead = Set([
        HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)!
        ])
    let typestoShare = Set([
        HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)!
        ])
    self.healthStore.requestAuthorizationToShareTypes(typestoShare, readTypes: typestoRead) { (success, error) -> Void in
        if success == false {
            NSLog(" Display not allowed")
        }
    }
}

以上代码将提示用户去同意或拒绝你的权限请求。在这个闭包中,你可以处理成功或失败状态的回调事件,而且可以获得请求的结果。用户也纷歧定会同意你app所有的权限请求,所以你必须在app中合理地处理错误。

但是出于测试的目的,你必须选择“允许”选项来允许应用法式访问你的设备上的健康数据。

Health-App-Permission.jpg

写入睡眠分析数据

首先,我们如何能够拿到睡眠分析数据呢?通过Apple的文档,每个睡眠分析数据样本都仅有一个数值。为了区分卧床和睡眠状态,HealthKit使用了两个或更多的重叠时间的样本加以分析。通过对照这些样本的开始和结束时间,APP就可以得出一些二次统计数据:

  • 用户进入睡眠所花费的时间

  • 用户在床上的时间和实际睡眠时间的百分比

  • 用户在床上醒来的次数

  • 用户卧床和睡眠的时间的总和

record_sleep_data-1024x525.jpg

简而言之,你需根据下面的要领将睡眠分析数据保存到HealthKit Store:

  • 界说两个NSData工具用于开始和结束时间

  • 使用HKCategoryTypeIdentifierSleepAnalysis创建一个HKObjectType实例

  • 创建一个面目目样的HKCategorySample类型的实例,用于记录睡眠数据。单个的样本代表用户卧床或睡眠的时长。因此,我们将创建一个包罗重叠时间的卧床状态和睡眠状态的样本。

  • 最后,使用HKHealthStore的saveObject要领保存上述实例。

笔者注:对于类别样本的类型,可以参考HealthKit Constants Reference

如果你想用Swift 实现上述所有,这里提供关于保存卧床和睡眠分析数据的代码片段。请在ViewController类中插入如下代码:

func saveSleepAnalysis() {
    // alarmTime and endTime are NSDate objects
    if let sleepType = HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis) {
        // we create our new object we want to push in Health app
        let object = HKCategorySample(type:sleepType, value: HKCategoryValueSleepAnalysis.InBed.rawValue, startDate: self.alarmTime, endDate: self.endTime)
        // at the end, we save it
        healthStore.saveObject(object, withCompletion: { (success, error) -> Void in
            if error != nil {
                // something happened
                return
            }
            if success {
                print("My new data was saved in HealthKit")
            } else {
                // something happened again
            }
        })
        let object2 = HKCategorySample(type:sleepType, value: HKCategoryValueSleepAnalysis.Asleep.rawValue, startDate: self.alarmTime, endDate: self.endTime)
        healthStore.saveObject(object2, withCompletion: { (success, error) -> Void in
            if error != nil {
                // something happened
                return
            }
            if success {
                print("My new data (2) was saved in HealthKit")
            } else {
                // something happened again
            }
        })
    }
}

当我们想去保存睡眠数据到HealthKit中去的时候,就可以调用这个要领。

读取睡眠分析数据

要读取睡眠分析数据,需要创建一个查询要领。首先创建一个HKCategoryTypeIdentifierSleepAnalysis类型的HKObjectType实例。你也可能需要使用一个断言,通过startDate和endDate这两个NSData工具对应的时间范围来过滤取回的数据。同时还需要创建一个sortDescriptor工具,来对样本数据进行排序,从而获得你想要的结果。

查询睡眠数据的代码大致如下:

func retrieveSleepAnalysis() {
    // first, we define the object type we want
    if let sleepType = HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis) {
        // Use 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: nil, limit: 30, sortDescriptors: [sortDescriptor]) { (query, tmpResult, error) -> Void in
            if error != nil {
                // something happened
                return
            }
            if let result = tmpResult {
                // do something with my data
                for item in result {
                    if let sample = item as? HKCategorySample {
                        let value = (sample.value == HKCategoryValueSleepAnalysis.InBed.rawValue) ? "InBed" : "Asleep"
                        print("Healthkit sleep: \(sample.startDate) \(sample.endDate) - value: \(value)")
                    }
                }
            }
        }
        // finally, we execute our query
        healthStore.executeQuery(query)
    }
}

以上的代码先查询到所有的睡眠分析的数据,并根据降序排列。每个查询结果将被打印出来,打印结果包罗开始时间、结束时间、以及所对应的类别(卧床或睡眠)。我已经设置了限制,取回最近的三十条记录样本。你可以使用自己的断言要领自界说开始时间和结束时间来限制查询的区间。

应用测试

对于 demo 法式,我已经使用了一个NSTimer去显示点击开始按钮后流逝的时间。NSDate工具被创建用来保存开始和结束之间的睡眠分析数据。在stop要领中,你可以调用saveSleepAnalysis()要领和retrieveSleepAnalysis()要领去保存和获取睡眠数据。

@IBAction func stop(sender: AnyObject) {
    endTime = NSDate()
    saveSleepAnalysis()
    retrieveSleepAnalysis()
    timer.invalidate()
}

然而在你个人的应用中,你或许会通过改变对应的NSDate工具,从而选择相应的开始时间和多个(差别的)结束时间来记录个人卧床和睡眠状态的数据。

当完成调整后,你可以运行这个demo并开始计时,运行APP几分钟,然后点击stop按钮。之后,打开这款健康应用,就可以找到你的睡眠数据啦。

sleep-analysis-test-1024x725.jpg

对于健康类App的一些建议

HealthKit旨在为开发者们提供一个公共平台,可以很方便地共享和访问用户的数据,并制止任何可能的重复或纷歧致的数据。苹果审核指南对使用 HealthKit的APP有很明确的要求,如果对用户的读/写权限请求没有明确的描述就很可能导致应用法式被拒绝。

如果你的健康类APP存储伪造或者错误的数据,也将会会被拒绝。这意味着,你不能使用类似于本教程中的睡眠分析数据,你需要通过准确的算法去计算与健康有关的数据。或许你应该尝试使用设备中内置传感器的统计数据,加以分析,得出分析数据,以制止出现错误或禁绝确数据。

关于完整的Xcode项目,你可以在这里下载。

用意志战胜身体的惰性!

(0)

本文由 姬長信 创作,文章地址:https://blog.isoyu.com/archives/701.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:7 月 14, 2016 at 08:00 上午

关键词:

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复