随着移动手机设备硬件的进步,持续带来了各种人性化的指标分析体系,例如运动数据统计分析、饮食习惯统计分析等等,大大增强了人类对于自身各种活动的认知和理解。而在这个快节奏的时代,睡眠质量的分析比以往任何时候都更加的有意义,一场睡眠革命正在悄然的在人们的生活中崛起。通过针对睡眠质量的统计分析,能够清晰的获知人们睡眠的开始、结束、从而显露出睡眠的趋势等等。

苹果提供了一种非常酷的方式以用来于用户的个人健康信息进行数据交流,并且保持了数据安全和存储安全,这就是苹果在iOS系统中内建的健康应用 — Health。而Health应用程序使用的技术框架是苹果专门打造的一款健康服务框架 — HealthKit,开发者不仅可以使用此框架构建自身的健康类应用程序,而且还允许访问健康应用中的数据分析结果。

在Health应用程序中,并没有自动去统计用户的睡眠起始时间等数据,但是Health为我们提供了一套数据写入和分析功能,开发者可以依照特定的数据格式将睡眠数据写入到Health,通过Health分析后,得到数据的分析结果。

简介

HealthKit 框架提供了一种保存数据的加密数据库叫做Health Store,可以使用HKHealthStore类来访问此数据库,而且不仅在iPhone还是Apple Watch上都有自己的Health Store。健康数据可以在iPhone和Apple Watch之间进行同步,不仅如此,Health Store也会定期的清楚老旧的数据,以节省存储空间。需要注意的是HealthKit和Health应用程序均不支持iPad。

如果需要针对健康数据构建一个iOS应用或者watchOS应用,HealthKit是首选的框架工具。HealthKit能够统一管理来自各种数据源的数据,根据用户的喜好自动合并来自不同数据源的数据,并且能够访问到每个数据来源平台的数据,并将数据合并。这样不仅可以对用户的体征进行测量记录,运动健身统计或者饮食营养数据统计,还可以用于针对睡眠数据进行分析等。

在接下来,将使用Healthkit框架访问和保存用户的睡眠数据,了解用户的睡眠情况,同样的方法在watchOS上也是适用的,工程样例和代码使用了Swift 3.0 和Xcode 8 进行构建。

在开始之前,可以下载Starter project,此开始工程中已经创建了用户界面以及一些方法,当运行了此开始工程后,可以看到界面上有一个计时器数据展示标签,按下开始按钮后,计时器读数将会持续变化。

使用HealthKit框架

我们的目标应用程序主要的功能是保存用户的睡眠分析信息和使用开始和停止按钮检索数据。为了使用HealthKit,你必须给予应用程序HealthKit功能程序包,选择工程当前的target -> capabilities,打开HealthKit功能程序包。

开启此功能包以后,根据iOS10最新的权限管理机制,还需要在工程的info.plist文件中配置全新说明,针对HealthKit来说,由于需要进行数据的读写,因此需要配置NSHealthUpdateUsageDescription和NSHealthShareUsageDescription两个字段。

接下来,需要在ViewController类中创建一个HKHealthStore实例:let healthStore = HKHealthStore()

之后将使用HKHealthStore实例访问HealthKit数据库。

如前所述,HealthKit需要用户授权才能够访问健康数据,所以必须首先向用户请求权限许可才能够访问(读/写)睡眠分析数据。因此在ViewController中的viewDidLoad方法中,进行权限的申请:override func viewDidLoad() {

super.viewDidLoad()

// Do any additional setup after loading the view, typically from a nib.

let typestoRead = Set([

HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis)!

])

let typestoShare = Set([

HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis)!

])

self.healthStore.requestAuthorization(toShare: typestoShare, read: typestoRead) { (success, error) -> Void in

if success == false {

NSLog(" Display not allowed")

}

}

}

这段代码将弹出申请权限提示页,用户可以允许和拒绝请求,在回调Block中,可以处理成功或者失败的组中结果,当用户拒绝了权限的申请请求,会有错误的信息提示。

但是为了测试方便,每次权限申请的时候,可以直接选择允许,允许访问设备上的健康数据。

写睡眠分析数据

在写数据之前,如何才能检索睡眠分析数据呢?根据苹果的官方文档,每个睡眠分析样本只能有一个值。为了表示用户是在床上还是睡着了还是醒着,HealthKit使用两个或两个以上的重叠时期样本。通过比较这些样本的开始和结束时间,应用程序可以进行二次计算进行统计分析:用户入睡的时间

在床上的时间占比

用户在床上醒来的次数

在床上和在床上睡着的时间总量

简而言之,可以按照以下的步骤来保存睡眠分析数据到HealthStore:定义两个NSDate对象,分别代表开始时间和结束时间

使用HKCategoryTypeIdentifierSleepAnalysis创建HKObjectType实例

创建一个新的HKCategorySample对象实例,通常情况下使用类别样本记录睡眠数据,个别的样本数据正好代表了用户是在床上还是睡着了,因此需要创建一个在床上的样本对象(inBedSample)和睡着了的样本对象(asleepSample)

最后,使用HKHealthStore的saveObject方法,保存这些对象即可func saveSleepAnalysis() {

if let sleepType = HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis) {

// we create new object we want to push in Health app

let inBedSample = HKCategorySample(type:sleepType, value: HKCategoryValueSleepAnalysis.inBed.rawValue, start: self.alarmTime, end: self.endTime)

// we now push the object to HealthStore

healthStore.save(inBedSample, withCompletion: { (success, error) -> Void in

if error != nil {

// handle the error in your app gracefully

return

}

if success {

print("My new data inBedSample was saved in Healthkit")

} else {

// It was an error again

}

})

let asleepSample = HKCategorySample(type:sleepType, value: HKCategoryValueSleepAnalysis.asleep.rawValue, start: self.alarmTime, end: self.endTime)

healthStore.save(asleepSample, withCompletion: { (success, error) -> Void in

if error != nil {

// handle the error in your app gracefully

return

}

if success {

print("My new data asleepSample was saved in Healthkit")

} else {

// It was an error again

}

})

}

}

这个方法可以在希望保存睡眠分析数据的时候调用。

读取睡眠分析数据

为了读取或者叫检索睡眠分析数据,首先需要创建一个查询,在创建查询之前,定义需要的对象类型,可以使用HKCategoryTypeIdentifierSleepAnalysis中的HKObjectType来定义。或许还需要使用正则式来过滤startDate和endDate之间的数据,可以通过HKQuery的predicateForSamplesWithStartDate来创建一个正则式。为了使得数据能够带有顺序,比如按照时间升序或者降序,可以创建一个sortDescriptor来排序数据。

整个检索数据的代码段如下:func retrieveSleepAnalysis() {

// startDate and endDate are NSDate objects

// ...

// first, we define the object type we want

if let sleepType = HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis) {

// You may want to use a predicate to filter the data... startDate and endDate are NSDate objects corresponding to the time range that you want to retrieve

//let predicate = HKQuery.predicateForSamplesWithStartDate(startDate,endDate: endDate ,options: .None)

// Get the recent data first

let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)

// the block completion to execute

let query = HKSampleQuery(sampleType: sleepType, predicate: nil, limit: 30, sortDescriptors: [sortDescriptor]) { (query, tmpResult, error) -> Void in

if error != nil {

// Handle the error in your app gracefully

return

}

if let result = tmpResult {

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)")

}

}

}

}

healthStore.execute(query)

}

}

这段代码查询了健康应用中的说有数据,然后进行了降序排列。每次查询都打印出了样本的开始时间和结束时间,以及在这个时间段内用户的睡眠状态,例如,在床上或者睡眠。代码中限制了数据条目的数量30条,这样查询会只检索30条数据,然后返回,也可以使用正则式来进行指定时间段数据的检索等。

应用测试

对于Demo应用程序来说,已经设定了一个NSTimer来对睡眠情况的计时。NSDate对象会在用户点击开始按钮后,记录下用户的睡眠开始时间点,点击停止按钮后,记录下睡眠结束的时间点,并最终用于保存睡眠数据的一部分。在结束按钮点击时,需要将记录时间段的数据保存,同时检索更新后的数据,用户界面展示。@IBAction func stop(_ sender: AnyObject) {

endTime = Date()

self.saveSleepAnalysis()

self.retrieveSleepAnalysis()

timer.invalidate()

}

此时运行工程,点击开始按钮,等待一段时间后,点击停止按钮,完整后,打开健康应用,进入睡眠分析,就可以看到相关的数据了。

HealthKit应用的一些建议

HealthKit旨在提供一个公共的平台,应用程序开发人员能够很容易地共享和访问用户的数据,并且避免了可能的重复或者不一致的数据。苹果审核指南非常具体的指明了使用HealthKit和请求读/写数据的权限的要求,如果不满足这些要求,应用程序会被拒绝上架。并且针对用户数据的使用不当,也被会拒绝。这就意味着,不能够写入不合规或者不合理的数据。

获取完整的Demo应用,可以在这里下载使用。

ios睡眠分析 卧床 睡眠_HealthKit睡眠分析相关推荐

  1. 智能睡眠评估系统(包含:睡眠数据特征工程、睡眠评分、睡眠聚类、睡眠可视化分析、睡眠结论存储)

    智能睡眠评估系统(包含:睡眠数据特征工程.睡眠评分.睡眠聚类.睡眠可视化分析.睡眠结论存储) 目录 智能睡眠评估系统(包含:睡眠数据特征工程.睡眠评分.睡眠聚类.睡眠可视化分析.睡眠结论存储)

  2. 软件测试睡眠原理,智能手环检测睡眠质量的原理?

    智能手环的一个重要卖点是"健康监测",例如监测我们的睡眠质量情况. 睡眠质量很重要 睡眠监测是怎么做到的呢? 其内部原理又是什么? 在Jawbone Up 智能手环的官网上写着睡眠 ...

  3. 世界睡眠医学杂志世界睡眠医学杂志杂志社世界睡眠医学杂志编辑部2023年第2期目录

    临床睡眠医学     观察丁苯酞氯化钠注射液联合常规西医方案对急性脑梗死患者疗效及睡眠质量的影响 孙友霞; 225-227     观察盐酸羟考酮缓释片联合盐酸吗啡片滴定治疗中重度癌痛的效果及对睡眠质 ...

  4. 睡眠监测APP开发了解睡眠数据

    现在都市人的生活节奏和生活压力增加,人们的睡眠质量越来越差,改善睡眠问题有助于人们的身体健康,前提是我们要对于数据的了解.睡眠监测APP开发就是对于一些睡眠时间质量等数据监测,让人们对于自己睡眠质量的 ...

  5. 黑苹果睡眠无法唤醒_电脑睡眠后无法唤醒怎么办?

    有过电脑睡眠后不能开机情况的小可爱,请在评论区打卡,S姐好想知道,有多少人跟我一样啊! 作为一个懒癌晚期且不想抢救的人,每天下班电脑是绝对不会选择关机的!我浏览器里那么多资料窗口,文章刚写了一半,表格 ...

  6. 浅析Windows7的睡眠、休眠、混合睡眠、离开模式

    Windows7的睡眠.休眠.混合睡眠.离开模式相信很多人都听说过,大家虽然都在用这些模式,然而对它更深一步的了解或许没多少人感兴趣,因此仅仅是"一知半解""似懂非懂&q ...

  7. 台式计算机睡眠了怎么唤醒,台式电脑睡眠了怎么唤醒

    电脑闲置的时候,除了关机之外,用户还可以考虑将电脑设为休眠或睡眠状态,这样既可以保留原有的东西,也可以省电,那么你知道吗?下面是小编整理的一些关于台式电脑睡眠了唤醒的相关资料,供你参考. 台式电脑睡眠 ...

  8. 睡眠多少分钟一个循环_关于科学睡眠丨90分钟一个睡眠周期,每晚循环3到5次...

    原创:柚子健康网微信号 快速动眼期持续一段时间后,人体又会进入非快速动眼期,如此交替,每个完整的睡眠周期大约持续90分钟,每夜睡眠一般需经过3-5个循环. 人的一生超过1/3的时间是在睡眠中度过的,科 ...

  9. 微信测试睡眠的软件,微信小睡眠小程序使用方法

    小睡眠APP是一款手机上的睡眠质量辅助软件,在小睡眠APP中用户可以掌握自己的睡眠质量哦,其中小睡眠APP在睡眠方面还是很到位的哦,今天小编就整理了小睡眠APP相关的使用教程,有需求的小伙伴不要错过了 ...

  10. 睡眠不好怎么办?提升睡眠质量的小妙招

    随着生活节奏的加快.娱乐生活的丰富,睡眠问题逐渐从"小众困扰"上升为国民级焦点议题,睡眠相关产品也越来越受到消费者重视.从失眠到怎样才能睡的更好,逐渐成为我们日渐关注的问题.下面就 ...

最新文章

  1. 参加海峡两岸城市地理信息系统论坛2010 年会(一张图、规划信息化和空间句法的碎碎念)...
  2. 数据库防护技术对比分析
  3. redis的持久化方式有哪些?
  4. FFmpeg 和自由软件社区的更新
  5. FFT算法的完整DSP实现(转)
  6. 免费设计图标的网站;免费设计的网站;免费设计的网站;
  7. python正则表达式教程_Python中正则表达式的巧妙使用一文包你必掌握正则,
  8. 《HBase权威指南》读书笔记6:第六章 可用客户端
  9. PDF密码强制解除——一键解除
  10. Redis Key 过期事件监听
  11. mysql 少用in_mysql查询条件not in 和 in的区别及原因说明
  12. 书写台灯哪种比较适合儿童?盘点护眼的儿童读写台灯推荐
  13. Day03 数据类型转换
  14. linux 实时监控系统IO状态和IO性能
  15. 大梦谁先觉 --伍立杨
  16. android换手机照片怎么转移,换手机了怎么把照片转移到新手机
  17. MySQL输入密码闪退
  18. php redis中set、setex、setnx、getSet的区别
  19. 用python来创建微信机器人,跟基友网恋聊天(滑稽)
  20. 希利苏斯起始任务_希利苏斯战地任务快速完成方法 大地之击半天入手

热门文章

  1. Gale-Shapley 稳定匹配算法的C++实现
  2. 历年真题软件设计师下午考试题汇分析与技巧
  3. zabbix监控打印机并自动更新监控项
  4. PSpice应用B-4
  5. php新年倒计时源码,2020年-新年倒计时HTML源码
  6. p2p借贷项目面试题
  7. 计算机二级知识普及挑战赛答案,全国计算机二级试题库
  8. 数学分析教程(科大)——5.1笔记+习题
  9. 【应用随机过程】06. 布朗运动
  10. linux下的锐捷客户端