大多数浏览器和
Developer App 均支持流媒体播放。
-
通过运动衡量健康状态
发现如何使用运动数据将您的 app 的健康监测能力提升到新的水平。认识 iPhone 的步行稳定性和 Apple Watch 的六分钟步行指标:步行稳定性能帮助您的 app 解释个人步行质量和摔倒风险,六分钟步行指标和 HealthKit 估计重新校准 API 能追踪手术等急性事件后的步行耐力变化。我们将向您展示如何支持这些指标,并帮助向您的 app 用户提供可操作的健康数据,帮助改善患者护理和临床试验,尤其是在必须远程提供更多服务时。
资源
- appleWalkingSteadiness
- appleWalkingSteadinessEvent
- CMFallDetectionManager
- Core Motion
- Getting movement disorder symptom data
- HKAppleWalkingSteadinessClassification
- Measuring Walking Quality Through iPhone Mobility Metrics
- Using Apple Watch to Estimate Cardio Fitness with VO2 max
- Using Apple Watch to Estimate Six-Minute Walk Distance
相关视频
WWDC20
-
下载
♪播放重低音音乐♪ ♪ 您好 欢迎来到WWDC 我是艾瑞达 Apple软件团队的科学家 苏恒 一位Motion工程师 会加入我 今天 我们将介绍两个全新功能 将让您更了解步行耐力 与质量 走路是生命征象 一个人走路的方式含有很多信息 关于他们整体健康与福祉 可以用来追踪受伤后的复原情况 评估跌倒风险、监测老化过程 甚至预测死亡 在WWDC2020 我们推出一套 活动能力指标 提供有力的洞见 关于您的走路模式 一整天下来 您可以在去年的会议中学习它们 “计算步数之外” 今天我们很高兴要分享一项更新 那些指标其中之一 六分钟步行指标 可在Apple Watch上使用 通过新的重新校准API 指标将让您能够 更好地捕捉到健康方面的剧烈变化 此外 我们将谈到一项全新指标 步行稳定度功能 可在iPhone上使用 这两个指标有何共通点? 它们都是很好的追踪方式 在走路的重要层面 能提供持续 与客观的测量 以监测改善程度 或捕捉早期警告信号 但它们捕捉不同的东西 六分钟步行指标估计您能走多远 在六分钟内 测量您的走路能力与耐力 步行稳定度捕捉您走路的质量 设计来让您更容易 评估个人跌倒的风险 基于他们的活动能力 无论您追踪这些指标 一周接着一周 以测量变化 对治疗的反应 或一年接着一年 以监测自然老化趋势 两个指标都能提供特殊的机会 了解个人健康 我们先从深入了解 六分钟步行距离指标开始 门诊的六分钟步行测试 是许多领域临床医师的常用测试 以评估心血管和肌肉骨骼健康 这个指标捕捉步行耐力 为低忍耐力的个人 它能帮助辨识哪些人 相比同年龄和同身高者耐力较低 这通常指出健康不良的结果 今年 使用新的重新校准API 这个六分钟步行指标也是很棒的方式 可以追踪步行能力的变化 伴随介入 例如手术 或剧烈事件 例如受伤 我们来看一个情况 重新校准六分钟步行指标 将会有用 想象我们有个病人 杰米 刚动完膝盖手术 我们知道杰米在手术后几乎无法走路 但只看到小小的下跌 在他们的六分钟步行评估 来看一下可能是什么造成的 为了建立对个人容许力的正确评估 六分钟步行距离评估看活动 和行动数据 横跨历史测量窗口 举例来说 这是本次用来评估的测量窗口 要看评估能观察多久以前 您可以使用全新的元数据字段 那会告诉你 数据最早开始使用的窗口 我们可以看到评估范例 使用手术很久以前的数据 现在可以做的事重新校准评估 只用手术后的数据 重新校准后 我们的评估现在捕捉到 杰米活动能力真正的下跌处 紧跟在手术之后 让手术前后的比较更为准确 现在 苏恒为我们示范 如何在您的app中使用这些新功能 谢谢 艾瑞达 重新校准API让您使用您的知识 关于杰米的手术日期 以改进他们的六分钟步行距离评估 如果您想要重新校准 您可以使用全新的 recalibrateEstimates方法 在HKHealthStore 这个新方法有一些要求 你需要的第一个是 可以被重新校准的样本类型 您可以确认一个类型 是否能够重新校准 用.allowsRecalibration ForEstimates属性 到iOS 15为止 sixMinuteWalkType 是唯一的样本类型 可以被重新校准 您需要的第二个是新的权限 您可以自己加这个权限 到您的Xcode项目 最后 您的app会需要授权 以读取与分享样本类型 要促使用户给您的app授权 只需创建一个集 有六分钟步行距离类型的集 接着传递 到healthStore requestAuthorization 这些要求都完成了 我们来重新校准 用HKHealthStore的 recalibrateEstimates方法 并传递手术日期 因为这影响病人的健康数据 屏幕上会出现提示 要求他们允许重新校准 就这样 接下来几个评估 您将看到重新校准日 反映在测量开始日 在健康app中 在EarliestDateUsed ForEstimate 元数据会跟着每个HealthKit样本 而来 几件事需要思考 首先 这个方法不影响 已经在HealthKit里的评估 在使用时 所以尽快重新校准很重要 在手术后 第二 在重新校准后 可能会花上14天 以重建足够的活动历史 以做出有把握的评估 第三 效果是暂时的 当重新校准日过去够久 评估将再度 开始使用它们一般的测量窗口 您可能想要重新校准 在您知道的每次跌倒或手术后 但这些通常不会导致 活动能力或体适能下降 这里有个互偿之处 一般来说 较长的数据窗口 会带来更准确的评估 但对剧烈变化反应较不灵敏 在杰米的例子中 我们知道他们的手术会造成重大变化 对他们的活动能力和体适能 我们想要密切监测那变化 如果他们恢复得不好 我们可以伸出援手提供支持 这个新的重新校准API延伸 Apple六分钟步行距离指标的能力 到全新的使用案例以追踪复原情况 在受伤或手术后 我们希望您会觉得它有用 在更好地监测您病人的健康 及改善结果 现在我想交给艾瑞达 告诉您关于全新指标 步行稳定度 它测量您走路的不同面向 谢谢 苏恒 除了可以追踪 一个人可以走多少或多远 监测行动的质量也很重要 在iOS 15 我们建基于 对于步行质量的基础了解 并延伸到新的指标 Apple步行稳定度指标 这个指标是设计来让您 更了解您的整体步行质量 并能帮助评估跌倒的风险 由于活动能力的限制 在接下来12个月中 您走路的质量被很多因素影响 包括您的肌力 身体耐力、平衡 或外部因素 像是受伤或手术 全都可能改变您跌倒的风险 Apple步行稳定度指标 提供一个统一的方式 追踪导致跌倒风险的活动能力要素 此功能由三个元素构成 第一 我们提供一个分数 可以被持续用来监测 步行稳定度的变化 随着时间过去 新的分数每周会被存在HealthKit 它将代表用户当周的稳定度 这个分数提供您很多层次的细节 分数越高 您的步行质量越好 分数低 您有预估跌倒的风险 由于活动能力之限制 第二 要让稳定度分数更好理解 我们将它们分为三类 好 低 非常低 这些分类提供您简单的方式 以辨识谁跌倒的风险最高 最后 在个人打开步行稳定度功能后 从健康app中 我们启用一个通知 此通知将警告个人 当他们的稳定度下降 到低或非常低 或是他们保持在那些分类好几个月 您可能在想 稳定度看起来怎么样 对一般健康的人 在他们一生中? 我们来看步行稳定度指标 对两个人来说看起来是怎么样的 对这个人来说 他们的步行质量随着年纪增长而下降 这相当常见 我们都看过长辈 可能不如我们走得稳健 但我们也知道有行为上的因素 有助于稳定 举例来说 一个能够维持高水平体适能的人 较可能保持高质量的步行 当他们年纪增长 但我们也知道年纪或好体能 不是影响步行稳定度的唯一因素 急性事件像是脚踝受伤 可以剧烈改变走路质量 导致跌倒风险提高 因此任何人都可能在稳定度分类中 来回跳动 在他们一生中 如我所说 稳定度分类帮您了解 这些变化的重要性 我们深入一点看 在这些分类中的人 是什么情况 “好”的分类是健康 有自信的步行者 他们一般不会有困难 度过一天并做许多 挑战力气和协调性的工作 他们的分数高 由于活动能力相关的健康问题 导致跌倒的风险低 一个“低”分类的个人 活动能力稍微低一点 他们也许一般来说没问题 但在较具挑战性的情况 比如困难的健行 他们可能需要采取预防措施 以免跌倒 他们也许还不会跌倒 但早期意识是有帮助的 最后 “非常低”分类指出 一个人的稳定度明显受损 基于他们的活动能力 这个人跌倒的风险很高 再说一次 他们可能还没跌倒过 但他们的活动能力受损 他们应该采取必要措施 以避免可能跌倒的情况发生 或是 如果可能 改进他们的力量与平衡 通过运动 好了 那就是这个指标能做的 现在你可能问 步行稳定度评估需要什么? 其实并不多 这个指标最有效测量稳定度是 当个人携带他们的iPhone 在最平常的位置 举例来说 裤子或外套口袋 甚至随身携带的包包 一切会正常运作 只要装置紧靠在 身体中间 现在交给苏恒 帮我们解释 如何杠杆步行稳定度指标 在您的app中 谢谢 艾瑞达 对步行稳定度的介绍 我们来应用它 想象您在为物理治疗诊所创建app 最困难的挑战 在物理治疗 与复健中就是追踪进度 现在大部分就诊是虚拟的 远程医疗开始流行 可能变得更加困难 假设您的app的目的 是让病人不断得到更新 并辨识出有高跌倒风险的人 以及稳定度下降的人 那是非常难以测量的事 但步行稳定度有所帮助 如艾瑞达所说 步行稳定度有三个元素 分数、分类、通知 我们来看如何将每一个 整合到您的app 为了物理治疗病人 从分数开始 假设你想展示 一个病人最近的稳定度分数 我们来看怎么做 分数是HealthKit数量类型 名字是 appleWalkingSteadiness 因为它是Apple定义的指标 它是只读 它在HealthKit的单位是百分比 范围从0到1 每周进行编写 虽然评估可能会延迟 如果数据不足以计算出评估值 为了开始 我们先取得授权 我们创建一个集 有appleWalkingSteadiness类型 接着 调用requestAuthorization 要取得最近的稳定度分数 我们构建样本查询 限制为1 用结束日期分类 如果有回复的样本 我们取其值与百分比单位 并更新app中的状态 看起来会是这样 分数用来追踪趋势很棒 但有时候不容易单独解释 45是什么意思? 分类可能是比较适合的粒度 对大多数人来说 我们用它来加入语境 分类的形式是 全新的HealthKit枚举 HKAppleWalkingSteadiness Classification 枚举可以取值.ok、.low 和.veryLow 从我们之前的编程语言 来取得最近的分数 只需要单独一行 就能将分数转变为分类 分类枚举有简易构造函数 那将分数翻译成合适的分类 我们将展示分类 连同分数 好了 那容易看懂多了 现在我们知道这个人在“低”的分类 可能跌倒风险增加 好 现在来处理 这个app的病人监测部分 我们希望能够辨识 并联系有高跌倒风险的病人 步行稳定度通知对这来说很棒 您可以登记被通知 当病人收到稳定度通知 联系他们确认情况 这通知到达HealthKit 作为范畴类型样本 叫做 “appleWalkingSteadinessEvent” 在HealthKit 它也是只读类型 有四种稳定度事件类型 .initialLow和.initialVeryLow 在一个月后被触发 当个人掉到 “低”或“非常低”分类 在这一开始的通知后 .repeatLow或.repeatVeryLow 事件 将提醒个人 大概每三个月一次 如果他们保持在同一个分类 您可以阅读更多关于通知类型 在开发者文件 在与本集有关的链接中 要读取通知 我们需要另一个授权 这次 我们构建一个集 只有appleWalkingSteadinessEvent 类型 并传递到requestAuthorization 方法 我们来看通知 我们这里创建了HKObserverQuery 那将执行处理程序 每次有稳定度事件 储存到HealthKit 意思是用户收到通知 在这个处理程序中 我们提示用户做检查 我们也允许HealthKit 发送事件给我们 在背景中 以确保我们能够响应 通知 在一天内 当我们执行询问 我们的app会开始监听通知 每次用户收到通知 我们可以触发一个提示 以跟诊所安排虚拟检查 太好了 现在您可以联系 有较高跌倒风险的病人了 但还有其他用户 一个物理治疗诊所可能有兴趣的 这个范例的病人一开始 显示出很好的进展 但现在稳定度正在下降 他们不会收到 步行稳定度通知 因为他们还不到较高跌倒风险的分类 但物理治疗诊所 可能会担心这样的趋势 运动是否合适? 是否造成伤害? 病人是否跟不上? 我们想要安排后续追踪 我们来设计自己的通知标准 这是病人的稳定度分数 随着时间推移 计划是询问六周的稳定度分数 并计算最合适的斜率 我们每周都这么做 如果病人的稳定度下降多于 比如说 平均每周5分 我们应该尝试安排检查 我们来创建一个谓词 询问过去六周 并执行HKSampleQuery 为了appleWalkingSteadiness 数量类型 在回调函数中 我们将传递结果到 detectTrends函数 现在 我们只需要计算最合适的斜率 使用我们定义过的定制函数 检查是否比-5少 表示稳定度在下降 以每周超过5分的速率 若是如此 我们可以提示用户做检查 跟之前一样 所以当我们侦测到他们的稳定度下降 他们会收到提示 这就是如何使用三个 步行稳定度的元素 以及如何设计您自己的简单通知标准 执行被动的活动能力监测 从不曾如此容易 但我们先不要太得意 这些都依靠 病人取得步行稳定度分数 这里有四个最佳实践方法 确保他们不会错过任何一个样本 首先 用户能够取得稳定度 只有当他们在健康app中设置身高时 强烈推荐设置体重和年龄 所以第一件事是提示他们 我们推荐直接编写更新样本 通过HealthKit API 第二 我们推荐提示用户 打开Apple的步行稳定度通知 他们可以这么做 在健康app的活动能力中 第三 如艾瑞达所说 对大部分病人来说 把手机放在口袋 当他们进行日常活动时 就足以获取稳定度分数 我们只需鼓励他们把手机带着 当他们在走路时 要确认他们是否满足步行标准 我们可以确认他们是否收到 步行速度评估 在HealthKit中 有两周一致的步行速度样本 表示他们足够常携带装置 做个提醒 步行速度需要iPhone 8或以上 当手机紧靠在 身体中间 走在平坦路上时才会测量 快速看一下健康app 或快速HealthKit询问 可以告诉我们是否需要提示他们 多带着手机走路 就是这样 你拥有所有需要的工具 以创造下个世代的物理治疗app 可以追踪您的病人的步行质量 而不需任何专门设备或评估 现在 交给艾瑞达来谈许多其他方式 您可以使用步行稳定度进行健康监测 谢谢 苏恒 我们刚看到步行稳定度如何 能够做出极大影响 对物理治疗的虚拟照护 而它还能做更多 考虑使用步行稳定度 如果你想要创造一个app 帮助家庭 看年迈的祖父母过得如何 或者也许你可以帮助 有神经疾病 像是多发性硬化症的病人 监测疾病进展 您甚至可以用它来推荐运动 和健行 针对个人的跌倒风险定制 步行稳定度和六分钟步行的新能力 建立于一个丰富的生态系统 使用动作感应以监测健康 在活动能力 与心肺功能的强力连结下 我们鼓励您探索 指标如何与心血管健康有关 在Apple Watch上 以及iPhone上的活动能力 能被用做复健或康复训练用途 以帮助病患为成功的手术 做最好的准备 或者考虑步行稳定度 活动能力指标 以及我们的动作障碍疾病API如何 能结合以监测复杂的 帕金森氏症的运动症状 这些指标的结合 可以为您的app解开非常有力的体验 总结来说 我们希望提供最棒的实践 当收集这数据时 首先 虽然走路不是我们常去思考的 如我们所见 它带着强力的健康征象 如同任何健康信息 确保您的数据收集有强大的隐私权 和安全保障措施 您在HealthKit以外取得的任何数据 应该至少是键码保护并加密的 再来 您应该保持透明 对于您收集的信息以及原因 任何时候您要求读取 某些HealthKit类型 我们将提示用户批准其使用 但在这基本措施以外 我们的共同责任是 只收集最有意义的数据 并保持透明 对于数据将如何被使用 举例来说 对于六分钟步行评估 我们的用户应该了解 重新校准何时是合适的 以及它将如何帮助他们护理 对于步行稳定度指标 要取得评估的要求 应该沟通清楚 与领域专家合作 如内科医师或物理治疗师 将确保您收集最有意义的数据 从这些指标 最后 您的顾客应该拥有 他们数据的控制权 在HealthKit中 个人可以点击显示所有数据 并删除任何或所有 从他们身上收集来的样本 如果您将数据带到HealthKit外 您的顾客应该有简单的方式 查看与删除 关闭数据收集 或其他方式执行控制权 对从他们身上收集来的 不管您在使用步行稳定度 以测量活动质量 六分钟步行指标以评估受伤后的复原 或任何其他健康指标 遵循这些准则将保护我们顾客的数据 推广用户信任 致力于这些原则非常重要 在处理任何健康数据时 好 我们说完了 我们想要感谢您的收看 并参与WWDC21 我们非常期待您接下来的创造 ♪
-
-
0:01 - Grab authorization to read and share sixMinuteWalkTestDistance type
// Grab authorization to read and share sixMinuteWalkTestDistance type let healthStore = HKHealthStore() let types: Set = [ HKObjectType.quantityType(forIdentifier: .sixMinuteWalkTestDistance)! ] healthStore.requestAuthorization(toShare: types, read: types) { _, _ in }
-
0:02 - Recalibrate Six-Minute Walk estimates
// Recalibrate estimate let healthStore = HKHealthStore() let sixMinuteWalkType = HKSampleType.quantityType(forIdentifier: .sixMinuteWalkTestDistance)! if sixMinuteWalkType.allowsRecalibrationForEstimates { healthStore.recalibrateEstimates(sampleType: sixMinuteWalkType, date: surgeryDate) { (success, error) in // Handle error } }
-
0:03 - Get authorized for walkingSteadiness type
// Get authorized let types: Set = [ HKObjectType.quantityType(forIdentifier: .walkingSteadiness)! ] healthKitStore.requestAuthorization(toShare: nil, read: types) { _, _ in }
-
0:04 - Construct a query for most recent walkingSteadiness score
// Construct a query for most recent walkingSteadiness score let steadinessType = HKObjectType.quantityType(forIdentifier: .walkingSteadiness) let sortByEndDate = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false) let query = HKSampleQuery(sampleType: steadinessType, predicate: nil, limit: 1, sortDescriptors: [sortByEndDate]) { (query, samples, error) in if let sample = samples?.first as? HKQuantitySample{ let recentScore = sample.quantity.doubleValue(forUnit: .percentUnit) updateStatus(score: recentScore) } } self.healthStore.execute(query)
-
0:05 - Construct a query for most recent walkingSteadiness classification
// Construct a query for most recent walkingSteadiness classification let steadinessType = HKObjectType.quantityType(forIdentifier: .walkingSteadiness) let query = HKSampleQuery(sampleType: steadinessType, predicate: nil, limit: 1, sortDescriptors: nil) { (query, samples, error) in if let sample = samples?.first as? HKQuantitySample{ let recentScore = sample.quantity.doubleValue(forUnit: .percentUnit) // Use HealthKit API to classify a value as OK, Low, or Very Low let recentClassification = HKAppleWalkingSteadinessClassification(for: walkingSteadiness.quantity) updateStatus(classification: recentClassification, score: recentScore) } } self.healthStore.execute(query)
-
0:06 - Get authorized .walkingSteadinessEvent
// Get authorized let types: Set = [ HKObjectType.categoryType(forIdentifier: .walkingSteadinessEvent)! ] healthKitStore.requestAuthorization(toShare: nil, read: types) { _, _ in }
-
0:07 - Watch for walkingSteadiness notifications
// Watch for walkingSteadiness notifications let notificationType = HKCategoryType.categoryType(forIdentifier: .appleWalkingSteadinessEvent)! let query = HKObserverQuery(sampleType: notificationType, predicate: nil) { (query, completionHandler, errorOrNil) in if let error = errorOrNil { // Properly handle the error. return } promptCheckupForNotification() completionHandler() } self.healthStore.execute(query)
-
0:08 - Query walking steadiness in the past 6 weeks
// Query samples from HealthKit // Look back 6 weeks let end = Date() let start = Calendar.current.date(byAdding: .week, value: -6, to: end) let datePredicate = HKQuery.predicateForSamples(withStart: start, end: end, options: []) // Query walking steadiness let steadinessType = HKObjectType.quantityType(forIdentifier: .walkingSteadiness) let sortByEndDate = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false) let query = HKSampleQuery(sampleType: steadinessType, predicate: sortByEndDate, limit: nil, sortDescriptors:[sortByEndDate]) { (_, samples, _) in detectTrends(samples) } self.healthStore.execute(query)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。