大多数浏览器和
Developer App 均支持流媒体播放。
-
HealthKit 的新功能
将最新的 HealthKit 功能引入你的健康和健身 App。我们将向您展示如何在睡眠阶段捕捉更详细的睡眠数据、利用增强的 Workout API 跟踪游泳/自行车/跑步和间歇性锻炼、以及在保护隐私的同时将视力处方(包括物理处方的照片)直接保存到 HealthKit。
资源
-
下载
♪ 柔和乐器演奏的嘻哈音乐 ♪ ♪ 您好 欢迎来到 WWDC 我是 Karim 一名 HealthKit 工程师 HealthKit 框架为提供 良好的健康体验打下基础 而 Apple Watch 拥有 许多健康和安全功能 为您监测数据 保驾护航 睡眠跟踪是广受欢迎的功能之一 我们升级了睡眠跟踪 以捕捉更细致的睡眠数据 今年 HealthKit 还新增了 许多出色功能 我们优化了 API 使用 Swift async 查询数据 更为便捷 我们提升了体能训练功能 呈现出更多元的体能训练 我们完善了保存 视力处方的方法 其中包括保存纸质处方的数字副本 我很高兴能向您介绍 更多有关升级的信息 以及在您的 App 中运用它们的方法 让我们开始吧 睡眠起着 放松身心的重要作用 我个人喜欢用 Apple Watch 来记录我的睡眠时间 然后获取建议 用以理解和改善睡眠质量 今年我们再次优化睡眠追踪 引入睡眠阶段的分析记录 Apple Watch 会自动追踪 您入睡后的 各个睡眠阶段 这些数据可以在 健康 App 中查看 数据也会存到 HealthKit 里 当然 您的 App 也能够读取 并保存睡眠阶段数据 通过 Apple Watch 或您的 App 存储的睡眠数据 在 HealthKit 中 以 sleepAnalysis 标识符 存储为类别样本 我们将睡眠阶段分成三类 快速眼动睡眠 (REM) 核心睡眠和深度睡眠 将睡眠数据 保存到 HealthKit 时 您应当给 目标睡眠阶段的每一段 持续时间创建样本 这是睡眠样本值枚举的示例 我们添加了三个枚举值 来代表睡眠阶段 第一个是 asleepCore 这对应 美国睡眠医学会 (AASM) 评分模型的第一和第二阶段 然后是 asleepDeep 对应的是 AASM 评分模型第三阶段 最后是 asleepREM 这对应的是快速眼动期 因为添加了睡眠阶段 我们废弃了原 asleep 枚举值 添加了 asleepUnspecified 枚举值 用于表明 睡着但未指定的睡眠阶段 有了更新好的睡眠样本枚举 现在可以保存和读取 HealthKit 里的睡眠阶段数据了 我们添加了一个新谓词 使得读取指定睡眠阶段的样本 更为方便 比如我想读取快速眼动睡眠 阶段 (REM) 的 睡眠样本 首先 我用新的 predicateForSamples 方法 传入 asleepREM 创建一个谓词 现在 我可以开始 创建查询了 我为我的查询创建一个谓词 把 sleepAnalysis 作为样本类型 再传入睡眠阶段的谓词 有了这个查询谓词 我现在可以创建查询了 运行查询就会得到 快速眼动睡眠阶段 (REM) 的睡眠样本数组 但是 如果您想读取 所有睡眠阶段的样本 包括未指定的 请务必更新您的 App 在构建谓词时使用全新的 .allAsleepValues 如果您在去年之后 没有关注过 HealthKit 可能不熟悉这种较短的查询语法 自 iOS 15.4 起 我们就更新了查询 API 以支持 Swift async 查询是 HealthKit 的重要组成部分 有了 Swift async 的支持 查询的语法更简洁 使用更方便 查询能让您从 HealthKit 读取各种数据 使用谓词筛选结果 还能监测到新进来的数据 所有查询都是 HKQuery 的子类 如果我想知道某个时期 消耗的卡路里总额 用 HKStatisticsCollectionQuery 进行查询以获取计算 好的统计数据是个好办法 要想获得初始查询结果 需要设置 initialResultsHandler 闭包 如果想获取之后的更新 另外设置 statisticsUpdateHandler 闭包 开始查询后 闭包会被调用 带有查询结果 有了 Swift async 查询起来更加方便 每个查询都有 相匹配的查询描述符 HKStatisticsCollectionQuery 有 HKStatisticsCollectionQueryDescriptor 要得到初始查询结果 只需调用 async result(for:) 方法 如果您想获取初始查询结果及后续更新 可以调用 results(for:) 方法 得到 AsyncSequence 使用循环来读取结果 HealthKit 很适合跟踪体能训练 以及相关指标 例如消耗的卡路里 要想知道我这周消耗了多少卡路里 我可以使用 统计数据收集查询描述符 首先 我创建查询描述符 传入匹配卡路里样本的谓词 传入 cumulativeSum 选项 因为我想要得到总和 我想知道这周的数据 所以我用 thisSunday 作为 anchorDate 最后 我想要计算一周时间的 卡路里消耗总和 查询描述符创建后 要做的就是调用 result(for:) 方法 传入 healthStore 对象 返回的 statisticsCollection 对象 会给我当前数据的快照 如果想要在卡路里变化时 获取到更新 只要调用 results(for:) 在返回的异步序列中 循环读取结果就可以了 当我不再需要获取更新时 只要跳出循环 就能结束查询 接下来 让我们谈谈体能训练功能 HealthKit 是 保存体能训练数据 及所有相关指标的好地方 无论您是要悠闲地骑个自行车 还是在比赛中挑战突破自身极限 都能很好地记录下来 通常来说 体能训练一般不限于单个活动 您可能会在间歇训练中 重复相同的活动 也有可能参加铁人三项比赛 铁人三项包括游泳自行车和跑步 在 iOS 16 和 watchOS 9 中 我们更新了体能训练 API 能够捕获这类体能训练 以及关联的每个活动的统计数据 这是我最近一次做的 游泳-自行车-跑步 体能训练时间轴 我先游泳 然后花些许时间准备 才开始自行车部分 最后再跑步 每项活动都由一个 HKWorkoutActivity 对象表示 创建每项体能训练活动 都带有各自的体能训练配置 其中涵盖活动类型 一个体能训练活动包含期间 发生的所有事件 您能够读取每一项活动的统计数据 在您只想要 分析某一项活动时 很有帮助 说回我的时间轴 我的三项活动都配置了 对应的活动类型 活动在时间上不能重叠 而且因为每次活动之间 可能会有过渡期 它们不需要紧连在一起 如果我想分析过渡时期 发生了什么 我可以给每一个过渡期创建 HKWorkoutActivity 活动类型是过渡期 所有活动都将存到 HKWorkout 对象下的 workoutActivities 属性中 如果您用 HKWorkoutBuilder 把体能训练添加到 HealthKit 中 添加活动只要创建 HKWorkoutActivity 对象 传入 workoutConfiguration 开始和结束日期 以及 可选的元数据 然后 您只需在体能训练构建器上 调用 addWorkoutActivity 添加即可 在 Apple Watch 上 您可以使用体能训练会话 来跟踪 游泳-自行车-跑步 体能训练 及相关的体能训练构建器 把体能训练保存到 HealthKit 中 我们继续回到体能训练时间轴 要在 Apple Watch 上 跟踪这次体能训练 我需要设置一个 体能训练会话和构建器 我首先创建一个体能训练配置 类型为 swimBikeRun 然后用我的配置创建一个 HKWorkoutSession 在体能训练的起始点 我只是简单地在会话中 调用 startActivity 并在相关的体能训练构建器上 调用 beginCollection 会话和构建器准备就绪后 我可以使用 beginNewActivity 方法 添加我的第一个活动 第一个是游泳体能训练配置 并附上开始日期 每项活动开始前 请确保您更新体能训练 构建器数据源 只收集您想要的数据类型 由于这是个游泳活动 我想收集游泳里程 活动结束后 我调用 endCurrentActivity 加上结束日期 因为我想要分析 游泳和骑行之间的过渡期 我会在游泳结束后马上 开始一个新的过渡活动 然后 由于这也是一个活动的始点 我会更新构建器数据源 来停止游泳里程的收集 因为游泳不再相关了 在骑行开始前 结束过渡活动 跟踪其余的活动 也是用同样的方式 在体能训练结束时 结束会话也会结束 任何进行中的活动 然后我就完成体能训练构建器 这会保存并返回一个 HKWorkout 对象 我可以从返回的体能训练数据 读取一些相关的指标 例如 totalEnergyBurned 和 totalDistance 然后在我的 App 中 显示体能训练总结 但是 这一小部分属性 已经不够用了 totalSwimmingStrokeCount 并不是跟所有体能训练都有关 个别体能训练可能会收集更多指标 为了所以种类的体能训练指标 读取都起来更方便 我们弃用了这些属性 新增了对指定的数量类型 返回统计数据的方法 顺便说下 新方法也可在 HKWorkoutActivity 上使用 这个方法能让您专注于 活动期间发生的数据 这些统计数据会被自动计算 根据体能训练中收集的所有样本 但前提是用了 HKWorkoutBuilder 或 HKLiveWorkoutBuilder 除了更丰富的体能训练 数据呈现以外 我们还新增了一组谓词 在您进行分析或可视化时 用于只查询您感兴趣的 体能训练 举个例子 这是我最近的体能训练 每个活动都带有平均心率 我想找出体能训练中平均心率 高于 150 的高强度活动 首先 我用新的 predicateForWorkoutActivity 方法创建一个谓词 作用于体能训练活动 我要找平均心率 高于每分钟 150 次 接下来 因为我想查询体能训练 所以我把心率谓词放在 体能训练谓词里 然后 我用该谓词创建查询 我调用了查询描述符上的 result(for: healthStore) 方法 以获取符合我谓词的体能训练列表 通过这种方式 我可以只查询我感兴趣的体能训练 我最近的一个体能训练 包含四个跑步区间 用 HKWorkoutActivity 是捕捉这些区间的好方法 您只要确保 间歇性体能训练里的 所有活动的活动类型 跟体能训练的类型相同 因此 就跑步体能训练来说 所有活动要配置 .running 类型 使用体能训练活动来跟踪 间歇性体能训练的好处 是您可以获得每个区间的统计数据 有了这些更新 体能训练更丰富地呈现了 活动以及活动前后的情况 为了提供更丰富的信息 我们引入了新的跑步指标 在 Apple Watch Series 6 SE 及更新机型上 会自动收集 包括跑步步幅 步长 或以瓦特为单位的功率等指标 对于游泳体能训练 我们添加了 SWOLF 分数 SWOLF 通过给定距离下的划水数 和所用时间 来计算 将为在 Apple Watch 上 采集的游泳体能训练数据中的 每一圈和每个分区 都进行计算 虽然这些指标 丰富了您的体能训练数据 并让您更好地了解您的表现 但是记录体能训练结束后的 另一个指标也很重要 那就是心率恢复 该指标是对您运动后 心率降低速度的估计 可以用来了解 心脏负荷后的恢复情况 并揭示可能潜在的健康问题 在 iOS 16 我们引入了一种 新的 Cardio Recovery 数据类型 可在健康 App 访问 您的 App 将能够从 HealthKit 中 读取和保存该数据 心率恢复是数量类型 标识符为 .heartRateRecoveryOneMinute 有关每个心率恢复样本的 附加上下文信息 可以添加为元数据 在我最近的 游泳-自行车-跑步体能训练中 我达到了运动极限 然后观察我的心率恢复速率 我花了大约三个半小时 来完成体能训练 当我跑步时我达到了 每分钟 184 次的 最大心率 体能训练后的一分钟里 我的心率下降了 50 次 在 Apple Watch 上使用 HKLiveWorkoutBuilder 时 心率恢复样本 连同其上下文信息 在体能训练后会 自动保存在 HealthKit 中 除此之外 要保存心率恢复样本 我使用 .heartRateRecoveryOneMinute 类型 创建了一个数量样本 我的心率在体能训练后的一分钟里 下降了 50 次 所以我将其设置为我的样本数量 我还为样本设置了开始和结束日期 然后 我将附加上下文信息添加到了 元数据字典中 以恢复测试类型开始 由于我的体能训练达到了极限 所以测试类型为 .maxExercise 我的体能训练 是 swimBikeRun 所以我将其设置为活动类型 我还可以使用 HeartRateRecoveryActivityDuration 键 添加体能训练持续时间 最后 我添加体能训练期间 观察到的最大心率 为每分钟 184 次 有了这些更新 现在将更加容易 跟踪游泳-自行车-跑步和 间歇性体能训练 此外 新指标的引入 为您的体能训练提供了更全面的信息 以及评估过程的新方法 虽然活动和健身会影响到每一个人 还有其他方面的健康问题会 涉及到我们许多人 比如视觉 实际上 根据美国视力协会表示 美国大约 75% 的成年人 依靠处方眼镜或隐形眼镜 矫正视力 但是 这些处方很容易丢失 而且 在订购处方眼镜或隐形眼镜时 要随身携带处方 显得十分累赘 所以让我们将其放在我们的手机里 从 iOS 16 开始 您的 App 现在可以将 眼镜和隐形眼镜处方 保存到 HealthKit 中 视力处方是一个带有 visionPrescriptionType 类型的样本 样本的开始日期对应 处方的发放日期 而结束日期对应于处方的到期日期 实体处方的数字副本 可以选择性地附在样本上 眼镜或隐形眼镜处方样本 是 HKVisionPrescription 的子类 对于眼镜 您使用 HKGlassesPrescription 子类 对于隐形眼镜 使用 HKContactsPrescription 子类 使用两个眼镜镜片规格对象 创建每个眼镜处方 每只眼睛一个 同样 隐形眼镜处方由 两个隐形眼镜镜片规格对象创建 现在 我们将阅读眼镜处方 保存到 HealthKit 第一步是对每只眼睛创建一个 HKGlassesLensSpecification 像顶点距离和棱镜等参数 是可选的 我可以用同样的方法 创建右眼镜片规格 接下来 我用右眼和左眼的镜片规格 创建了一个眼镜处方样本 该处方是为我的阅读眼镜创建的 所以我在描述中添加了备注 然后 我只需在 healthStore 上 调用保存方法 来保存处方 这样 我的处方已 保存到 HealthKit 中 同时 我给处方拍了张照 想将其附加到我刚刚保存的样本中 文件附件由 HKAttachment 对象表示 使用 HKAttachmentStore 来 保存和读取文件附件 仅静态图像或 PDF 文件 可以附在处方上 要将我图片附在处方样本上 我首先使用 healthStore 创建一个 HKAttachmentStore 对象 然后调用 addAttachment(to:) 传入处方样本 我为附件设置了一个名称 在这里 我附上了 一个 PNG 文件 最后 传递文件的 URL 我刚刚附上的处方包含更多信息 不只是镜头规格 还包括敏感信息 例如我的全名和出生日期 HealthKit 的 核心原则之一 是为了保护您的隐私并确保 您可以始终掌控您分享的数据 因为在分享包含附件的处方时 很容易无心分享出更多的数据 我们为处方引入了一种 新的授权模式 每个处方对象的读取权限 是单独授权的 用户可以授权 App 读取特定的处方 并可随时更新这些授权 对于视力处方对象 我们有新的 API 用于请求授权 就像其他数据类型一样 您可以使用查询来读取 您的 App 有权访问的处方 如果您只对某些处方感兴趣 您可以使用谓词 要请求授权 只需调用 healthStore 的 requestPerObjectRead 授权方法 传入 visionType 这样将始终在您的 App 中显示 处方授权弹出窗口 展示所有与您的谓词 相匹配的处方列表 确保您在适当的环境中请求授权 以确保最佳的用户体验 以上只是我们添加到 HealthKit 的一些新内容 使您的 App 能够提供更好的 健康和健身体验 非常期待看到您接下来的创造 祝您有一个愉快的 WWDC 如果您有任何问题 我们很乐意在 开发者论坛中为您提供帮助 ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。