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

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开关操作。

接下来,你将需要在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中合理地处理错误。

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

写入睡眠分析数据

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

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

用户在床上醒来的次数

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

简而言之,你需按照下面的方法将睡眠分析数据保存到HealthKit Store:定义两个NSData对象用于开始和结束时间

使用HKCategoryTypeIdentifierSleepAnalysis创建一个HKObjectType实例

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

最后,使用HKHealthStore的saveObject方法保存上述实例。

如果你想用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按钮。之后,打开这款健康应用,就可以找到你的睡眠数据啦。

对于健康类App的一些建议

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

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

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

ios睡眠分析 卧床 睡眠_使用Swift在HealthKit中进行睡眠分析相关推荐

  1. win10使计算机进入睡眠状态什么意思,技巧:如何在win10中进入睡眠模式计算机睡眠模式设置教程...

    如何在Win10系统中快速进入睡眠模式?如何设置为自动进入睡眠模式?每个人都熟悉系统睡眠模式.如果计算机掉了东西,您可以将计算机设置为睡眠以节省电量.但是,如果您想进入休眠状态,则通常需要进行繁琐的设 ...

  2. python在平面设计中的作用_图形创意在平面设计中的作用分析

    龙源期刊网 http://www.qikan.com.cn 图形创意在平面设计中的作用分析 作者:张 雷 王志芬

  3. 数学建模用python分析月消费_数学建模在实际中的应用——以百货商场会员消费为例...

    案  例  AN  LI 摘要: 本文主要研究大型百货商场中会员与非会员的消费特征.为提高商场管理效率,制定科学合理的管理 模型,通过网络数据(附件1)划分出会员在生命周期的各种状态(普通会员.活跃会 ...

  4. swift 过滤字符串_使用Swift提取字符串中的最后一个单词

    小编典典 您可以使用String方法enumerateSubstringsInRange.第一个参数只是传递您的字符串Range和选项.byWords.只需将每个子字符串附加到结果集合中并返回即可. ...

  5. ip协议分析实验报告_入门工业通讯之EtherNet/IP协议分析

    写在前面 前面我们系统得说了工业控制系统的通讯,大家肯定会想到PROFINET.ETHERNET/IP.ETHERCAT等工业以太网: 技术解读PROFINET.Ethernet/IP等7种主流工业以 ...

  6. 单体预聚合的目的是什么_聚合物在加工过程中降解可能性分析与预防

    降解是聚合物加工过程中经常会出现的缺陷,本文结合聚合物降解发生的原因分析,介绍聚合物加工过程中降解发生的可能性及其预防. 聚合反应是由单体合成聚合物的反应过程.有聚合能力的低分子原料称单体.一种单体的 ...

  7. 多媒体分析与理解_多媒体在课堂教学中应用的研究研究报告(二)

    多媒体在课堂教学中应用的研究研究报告 三.过程.结果与分析 (一)对班级学生上多媒体课后调查情况: 通过对班级全部学生的综合调查,其基本结果为: (1)喜欢上多媒体课的学生占96%,不喜欢上多媒体课的 ...

  8. mysql的查询分析工具下载_万能数据库查询分析器(ODBC数据库查询分析工具)V7.03 最新版...

    万能数据库查询分析器(ODBC数据库查询分析工具)是一款功能强大,性能良好的数据库查询辅助工具,对开发人员来说是一款省时省力的数据库分析工具. 功能特点: 可以通过它查询ODBC数据源(包括世面上所有 ...

  9. ios 行间距和段落间距_如何在Microsoft Word中控制行间距和段落间距

    ios 行间距和段落间距 There are lots of reasons you might want to change the amount of space between lines in ...

  10. python分析红楼梦中人物形象_《红楼梦》中女性人物形象分析

    探春,胸怀.文才高王熙凤一等,她有不同于其他人的远见,有着和男人一较高低的魄力.但有才有志如此的探春,最后还是远嫁他乡.庶出的身份也曾让她感到过屈辱,但是她不流俗,不孤高;不自卑,不自弃;不悲天悯人, ...

最新文章

  1. 使用EF操作Oracle数据库小计
  2. GIS开发随笔(3)——ArcXML和NET_Link方法
  3. 物料分类账的基本原理
  4. android xml 未能解析文件,Android Studio中“无法解析符号R”
  5. 鬼才项斌,用人工智能推动教育服务创新
  6. ASP.NET MVC 5调用其他Action
  7. linux mysql 5.7密码忘记_Mysql5.7.14 linux版密码忘记的找回方法
  8. 洛谷P3382 【模板】三分法
  9. 在window.onload中使用setTimeout
  10. 7-5 计算分段函数[3] (10 分)
  11. java添加购物车代码_Java web实现购物车功能的示例代码
  12. Wpf中显示Unicode字符
  13. 小米5splus(高配版/全网通)线刷兼救砖_解账户锁_纯净刷机包_教程
  14. 音乐推荐系统协同过滤算法解释
  15. 【CCNA第二天】路由器密码破解及恢复
  16. 最近频繁用到正则表达式,恶补一下,高手略过(零宽断言)
  17. 产品初探:银行理财产品简介
  18. easypoi导入图片_EasyPOI—导出Excel图片问题
  19. 视频横竖屏模式切换,如何将多个视频任意转换
  20. Backend TkAgg is interactive backend. Turning interactive mode on.解决办法

热门文章

  1. 多个excel如何合并
  2. 计算机硬件码修改软件,电脑机器码,教您电脑机器码修改软件
  3. 快速判断base16,base32,base64
  4. excel如何实现中文单词自动翻译成英文?这个公式教你了
  5. OKR教练:OKR评分,你可以这样做。
  6. Hashcat密码破解
  7. 手机麦克风结构原理图_麦克风的构造图解 麦克风偏置电路和滤波电路
  8. spring quartz 表达式在线生成器
  9. 维护和维修涉密计算机网络 必须严格采取,安全保密管理员主要负责涉密网络的日常安全保密管理工作,包括()。A.涉密网络的日常运行维护工 - 普法考试题库问答...
  10. 几何布朗 matlab,几何布朗运动