View in English

  • Apple 开发者
    • 入门汇总

    探索“入门汇总”

    • 概览
    • 学习
    • Apple Developer Program

    及时了解最新动态

    • 最新动态
    • 开发者你好
    • 平台

    探索“平台”

    • Apple 平台
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    • App Store

    精选

    • 设计
    • 分发
    • 游戏
    • 配件
    • 网页
    • Home
    • CarPlay 车载
    • 技术

    探索“技术”

    • 概览
    • Xcode
    • Swift
    • SwiftUI

    精选

    • 辅助功能
    • App Intents
    • Apple 智能
    • 游戏
    • 机器学习与 AI
    • 安全性
    • Xcode Cloud
    • 社区

    探索“社区”

    • 概览
    • “与 Apple 会面交流”活动
    • 社区主导的活动
    • 开发者论坛
    • 开源

    精选

    • WWDC
    • Swift Student Challenge
    • 开发者故事
    • App Store 大奖
    • Apple 设计大奖
    • Apple Developer Centers
    • 文档

    探索“文档”

    • 文档库
    • 技术概述
    • 示例代码
    • 《人机界面指南》
    • 视频

    发布说明

    • 精选更新
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • Apple tvOS
    • Xcode
    • 下载

    探索“下载”

    • 所有下载
    • 操作系统
    • 应用程序
    • 设计资源

    精选

    • Xcode
    • TestFlight
    • 字体
    • SF Symbols
    • Icon Composer
    • 支持

    探索“支持”

    • 概览
    • 帮助指南
    • 开发者论坛
    • “反馈助理”
    • 联系我们

    精选

    • 《开发者账户帮助》
    • 《App 审核指南》
    • 《App Store Connect 帮助》
    • 即将实行的要求
    • 协议和准则
    • 系统状态
  • 快速链接

    • 活动
    • 新闻
    • 论坛
    • 示例代码
    • 视频
 

视频

打开菜单 关闭菜单
  • 专题
  • 所有视频
  • 关于

更多视频

  • 简介
  • 转写文稿
  • 跟踪体能训练的新方式

    健身专家和新手都喜欢通过 Apple Watch 来跟踪体能训练。理解全新的体能锻炼 API 如何简化体能训练的整个生命周期,以及在崩溃后重新开始会话来防止数据丢失的功能。了解如何通过全新的体能锻炼类、类型和查询来快速访问通常需要计算的基准示例数据,同时还不会限制访问您可能偶尔需要的精细示例数据。

    资源

      • 高清视频
      • 标清视频
    • 演示幻灯片 (PDF)

    相关视频

    WWDC23

    • 构建多设备训练 App

    WWDC21

    • 为 Apple Watch 构建体能训练 app

    WWDC18

    • 通过 HealthKit 访问健康记录
  • 搜索此视频…

    [ 音乐 ]

    [ 掌声 ] 早上好 各位 欢迎来到玩转体能训练新方法 我是 Niharika 我是 Apple 健身团队的工程师 来自我们健康团队的同事 工程师 Karim 也将加入我们今天的话题 我们非常兴奋地 与你们分享 一些全新的特性与功能 它们已经随着 iOS 12 和 watchOS 5 加入了 HealthKit

    Apple Watch 发布于 3 年前 从那时起 我们的用户就热衷于 使用它的健康与 健身功能 他们喜欢完成每日任务圆环 及达成各种成就 并乐于和好友彼此分享 但他们最喜欢的还是完成 体能训练

    虽然只是一个开始 但这块手表正在形成一个 充满活力 不断进化的生态系统 其中少不了在座各位 开发人员的贡献

    仅仅 2017 年第四季度 App Store 中 健康健美类别下的 App 下载量超过了 2 亿 这是个惊人的数字 两亿这个数字 实在太酷了 更重要的是 这证明了两件事 其一 它证明了你们各位开发人员的 杰出贡献 为用户带来了绝佳的 产品体验 其二 这意味着人们在这一块 有切实的需求 人们密切关注着这一领域 翘首期盼 你们的新成果

    这一生态系统的核心 是这两个 App 健身记录和健康 健身记录是为你呈现 可视化运动数据的主界面 你可以查看你的体能训练 查看热量消耗和锻炼时常 健康 App 包括更多东西 当然 所有这些的核心 也就是我们今天 齐聚于此的理由 就是 HealthKit

    我们今天有海量激动人心的 事情要讨论 在我们开始那些话题之前 我们要先谈一谈 一件极其重要的事 那就是隐私和授权 由于数据是相当敏感的 尤其是健康数据 因此在设计研发 App 时 确保有一个 完整的隐私政策 至关重要 然后 Karim 会和大家分享 我们全新的训练功能特性 可以使你更加轻松地 打造一款可靠的 体能训练 App 最后 我激动地跟大家分享 我们全新的 Quantity 系列 API 这是一个储存与关联 高频数据的 全新方式

    好 让我们开始吧

    正如我所提到 隐私和授权必须 先行于任何开发过程 我们 Apple 看待隐私 有一条简单的原则 隐私以用户为本 HealthKit 就是以此为基础 设计而成的 HealthKit 的设计使用户 成为数据的主人 用户可以授权访问 也可以随时取消授权 作为开发人员的你们 是这一环里的最后一块拼图 我们想要确保 我们提供给你们的工具

    我们想了几条 简单的规则 第一条是根据你 App 的功能 收集部分数据 意思是说 你应当根据 App 需求 仅收集必要的数据 当然这不是永远 固定的数据 刚开始时 数量可能 不会很多 根据你的实际情况 当你的功能特性增加时 你所需的数据也会更多 但是按照当时的特定需求 来收集必要数据 是非常重要的 第二条是 HealthKit 的授权 是可以更改的 这一条有些微妙 比如说 如果用户重置了 他们的位置与隐私数据 位置与隐私设置 你必须确保尊重 他们的行为 这是你们 应尽的义务 最好的方式 是将 HealthKit 视作真实数据的 唯一来源 因为 HealthKit 会不断更新用户的 授权状态 你必须保证不私藏 任何用户数据 保证你永远只从 HealthKit 获取你所需的数据 这一点尤为重要 这两个想法 可以被提炼成 3 条规则

    当我们涉及隐私与授权时 你应当仅取所需 仅在需要时索取 且每次都要单独索取 在代码实现上 这同样简单 如果我要做一个体能训练 App 开始着手做 理所当然 我需要先从隐私与 授权下手 首先 由于我在创建 一个体能训练 App 我想要 和 HealthKit 共享训练类型 所以我需要明确表明我需要 共享训练类型 接下来 因为我只是在起步阶段 我需要追踪的 数据类型并不多 我想追踪用户的 心率 热量消耗 还有步行与 跑步的路程 现阶段我只需要这些 所以我就是我要请求的 全部数据 最后 在我的 HealthStore 上 我仅请求以上这些数据的授权 我请求要共享的类型 以及要读取的类型 通过以上三个简单的步骤 我们就能切实地确保 我们为尊重用户隐私 完成了必要的步骤 隐私如此重要 越好的 App 越重视隐私 在开发伊始 时刻注意这一点 是至关重要的 现在我们就能访问 用户数据了 我迫不及待地向大家介绍 Karim 他会向大家展示全新的 体能训练的功能特性

    [掌声] 大家好 感谢大家今天参加这个会议 我怀着激动的心情 与你们分享全新的体能训练 API

    如果这是你第一次接触 HealthKit 你会发现它如此简单好用 让你能从零开始 打造一款功能完善的训练 App 另一方面 假如你 在 App Store 已经拥有一款训练 App 你仍然能看到关于这个 API 的 所有全新的功能特性 让你的 App 获益匪浅 让我们深入了解一下 首先我想先谈谈 通常情况下体能训练 App 的 生命周期 假如说我们正在创建一个 训练 App 来追踪用户的活动 首先第一步 是配置你的 App 在这个阶段 我们知道 用户想要做体能训练 训练的具体类型 我们需要确保 我们的 UI 已经就位

    一旦配置完成 我们就能开始体能训练了

    在这个阶段 用户会积极锻炼 当然 过了一会 用户会想要结束 体能训练 在那时 我们可以 在 HealthKit 中保存 这条健身记录以及相关数据

    这就是一款体能训练 App 通常的生命周期 现在让我们观察一下用户 在活跃时都发生么什么 你通过交互界面与用户产生关联 这个过程中你想要 完成的任务之一 就是收集那些 显示在用户界面的 训练数据

    你同时得确保 用户可以掌控 训练过程的状态 随时暂停或是继续训练 如果你熟悉 HealthKit 你可能了解 watchOS 上的 HKWorkoutSession

    HKWorkoutSession 可以处理 生命周期中的某几个步骤 它会使设备的传感器 进入随时准备收集数据的状态 使你能够准确地 收集到训练相关的数据 比如热量消耗 或是心率 它还能让你的 App 在训练进行时 可以在后台运行 你也能够用 HKWorkoutSession 来控制 这次训练的状态

    以及最后 你可以 产生生成类似游泳 圈数的活动 当然 这样还不够 你还需要 收集训练过程中 设备产生的数据 然后将它都保存到 HealthKit 上面 为了实现这一点 我很高兴介绍一个新的类 HKWorkoutBuilder

    这个 workout builder 是你 收集数据并将其保存在 HealthKit 中的 一站式解决方案 所以这个 builder 会创建 并存储一个 HKWorkout 对象 它在 HealthKit 中代表了一次 体能训练

    然后你可以在创建体能训练时 在 builder 中添加样本 活动以及自定义的元数据 并且如果你在 watchOS 上 你可以使用它的子类 HKLiveWorkoutBuilder

    所以它仅限于 watchOS 而且又因为它是 HKWorkoutBuilder 的 子类 它有这个 builder 的 所有优点 但又因为它在 watchOS 上 它和 HKWorkoutSession 紧密合作 它有那些很酷的 功能 比如说自动样本 自动活动收集 我们之后会再说到

    所以让我们回到体能训练的 App 的生命周期 我们会看到 我们如何用新的 workout builder 设置并开始体能训练

    那么首先 我们需要创建一个 workout builder

    我们需要用一个初始化程序 我们需要传入一个 healthStore 对象 一个配置项 包含 体能训练类型 户内或户外 其他有关信息的 最后 一个可选的设备 比如说如果数据来自 一个外部的设备

    一旦我的 builder 被创建 我所需要做的就是 调用 beginCollection 并且传入一个 开始时间

    就是这么简单

    如果你在 watchOS 上 你可以用 HKLiveWorkoutBuilder 首先 你需要创建一个 体能训练 session 传入 healthStore 对象 以及 workoutConfiguration 然后你不要自己创建 builder 你可以直接 从 session 中获取 通过这次调用

    一旦我们有了 session 和 builder 我们可以继续 并开始了 调用 session 上的 startActivity 和 builder 上的 beginCollection 传入一个开始时间 就是这么简单 这就是如何用 builder 设置并创建一个体能训练

    现在 我们来看看我们如何 收集直接展示 在用户界面上的数据 以及如何控制体能训练的状态 当用户需要它的时候

    为了收集数据 如果我们想要添加与体能训练 有关的样本数据 比如卡路里 距离 心率 我们可以调用一个简单的方法 即 builder.add 给它传入一个 HKSample 数组 如果我们有想要添加到 体能训练中的事件 也非常类似

    我们只需调用 builder.addWorkoutEvents

    至于元数据 你们肯定猜到了 有了元数据字典 我们只需调用 builder.addMetadata 然后传入字典即可 但是在 Apple Watch 上 因为设备是在手腕上 而且有众多传感器 你可以产生真实的数据 比如卡路里和距离 那么如果我们可以让 builder 全自动地收集所有数据 岂不是很棒

    从 watchOS 5 开始 我们有了自动数据收集 这一切从 HKLiveWorkoutDataSource 开始 所以这个数据源会 收集与当前体能训练相关的 体能训练相关的样本数据

    不过 你仍然可以选择 你想要收集的类型 你可以添加或移除类型 只需根据你的需求 它的工作方式如下 首先 我们创建一个数据源

    在这 我传入了 healthStore 同时也传入了 workoutConfiguration 由于我传入的配置 包含了活动类型 的有关信息 数据源从而能够 推断针对这次体能训练 应该收集哪些类型的数据 接下来 我只需把 数据源设置在 live workout builder 上面

    以及可选地 你可以增加 或移除正在收集的类型 比如说我想要 添加类型 我可以指明 我想在这里添加的类型 如果我想要进一步 限制被收集的类型 也可以指明一个可选的谓词

    最后 我们只需调用 dataSource .collectStatistics 传入类型 同样还有 optionalPredicate 那么现在数据正在被收集 我们来看看如何可以将其 直接显示在用户界面上 每次 builder 的委托方法 带来新数据 workoutBuilder 的 didCollectDataOfcollectedTypes 会被调用 那么在这里 比如说如果 我对心率类型感兴趣 我会确保它是 被收集的数据类型之一 然后 我只需利用 用 builder 的针对数量类型的 数据方法 它会返回一个 HKStatistics 对象 其中包含了相关信息 在这个例子中 有最小值 最大值 平均值 以及 在此次体能训练中 最近记录的心率数值

    这样 我就可以 更新用户界面了 在体能训练类 App 中 表示时间流逝的计时器 非常常见 所以 当然 我们要在 训练开始时开始 计时 但这并不够 因为暂停或继续事件会 影响训练持续 时间的计算 所以每当新活动 被添加进 builder builder 的委托方法 workoutBuilderDidCollectEvents 就会被调用 这样 你就可以 用 builder 的 elapsedTime 属性 它会告诉你 此体能训练当前已 持续的时间

    就这么简单 接下来 我们看看 如何控制训练的状态

    首先 我想要讨论一下 训练 session 里 所有的不同的状态 第一个是 Not Started 这意味着训练还没有开始 我们还没有 哦不 用户还没有开始体能训练 在这之后 我们会转到 Prepared 状态 Prepared 状态会让系统 处于 Session 模式下 意味着你的 App 会有后台运行能力 传感器也会做好 追踪活动的准备 但是训练还未开始

    比如说 如果你的 App 在训练前有一个倒数秒 你可以在这之前将 session 置为 Prepared 状态 以此来确保 设备已经准备好 开始追踪活动 在这之后 我们可以转到 Running 状态 这时 用户在积极地 进行体能训练 当然 用户也可以 变成 Paused 然后回到 Running 然后在两者之间来回切换 直到训练结束 这时 设备仍然处于 Session 模式下 意味着 你的 App 仍然在后台运行 这就为你争取了 一点额外时间 让你需要的话 可以保存这次体能训练 这之后 我们就可以结束 体能训练了 从这起 系统就会 退出 Session 模式 想要在这些状态之间 切换 你只需 在体能训练 session 上 调用这些

    这就是我们收集 用户界面展示数据 以及控制 session 状态的方式 我们来看看如何 结束体能训练并且将其保存在 HealthKit 中 为了结束体能训练 首先调用 session.end 同时调用 builder.endCollection 传入体能训练的 结束时间 在这一时间点 尚未有 任何有关此体能训练的数据被收集 数据被收集 然后 如果你想把体能训练 保存在 HealthKit 中 你直接调用 builder.finishWorkout

    然后你会在 completion handler 中得到一个 体能训练对象 与它相关的数据已经被 保存在 HealthKit 中了

    这就是现在使用新的 API 创造一个体能训练 App 的方式

    接下来 我想要 用一个样本来演示一遍 我们会在 demo 中创建一个 为 Apple Watch 设计的体能训练 App

    [掌声]

    我目前实际上 正在写一个 让用户记录跑步的 体能训练 App 它是个非常简单的 App 这里有一个大的 “Run” 按钮 当点击它时 我会 显示这样一个界面 其中会显示此次训练的 逝去时间以及一些 其他指标 比如消耗的卡路里 最近心率 还有在这次训练中 已经跑的距离 当然 用户也 可以控制训练的状态 因此 用户可以 暂停 继续 以及结束 体能训练

    实际上我已经提前 写好了这些用户界面 剩下的是 使用新的体能训练 API 让我的 App 可以跑起来 我们要做的第一件事 就是确保 这个项目的设置是正确的 想要做到这个 我准备前往 我的项目设置页面 然后打开 Capabilities 标签页 确保 这里的 HealthKit Capability 处于开启状态

    同时针对你的 WatchKit App 扩展 也需要做相同的事 所以再一次 确保 HealthKit Capability 是开启的 当我完成了这些 我们也应该 把这两个目的字符串添加在 info.plist 文件中 以告知我的用户我为什么需要 访问他们的健康数据

    这里的第一条字符串是 “Health Share Usage Description” 告诉用户我为什么 想要把数据存储在 HealthKit 中 同时帮助更新 用户描述 它会告诉用户为什么我 需要读取 HealthKit 中的数据 完成了这些 现在我可以 开始使用新的体能训练 API 当然 使用 API 的 前提条件是 确保我请求了我需要的 数据的相关授权 当然 每个 App 都是不同的 在这次例子中 如果我们回到 我的 App 我会保存 一个体能训练 所以这是我需要 有权限访问的类型之一 另外 我也需要能够 读取卡路里 心率 还有距离 咱们来做这些

    当然 我们需要确保 当我们真正需要授权的时候 才发起请求 在我的例子中 我需要在每次用户看到这个 UI 时 来请求 这样我可以 确保我获得了 我获得了相关的授权 在开始 体能训练前

    所以这里的这个视图 由 WorkoutStartView 的 WKInterFaceController 控制 那我准备在 didAppear 方法中 来执行授权

    所以首先 我这里的 typesToShare 应该是 workout 因为我希望 在最后可以保存一个 体能训练

    接下来 我希望读取 心率 动态卡路里 同时还有步行 + 跑步距离 一旦设置好了 typesToShare 和 typesToRead 我只需在 healthStore 上调用 requestAuthorization 并且传入这两个类型 那么我们现在来运行 一下这个代码看看会发生什么

    而且因为 Apple Watch 的屏幕 比较小 用户会在 手机上看到一张 授权表单 所以你需要确保 在你的 iPhone App 上也能 处理授权

    那我们继续 先关闭这个视图 那么我们现在打开我的 iPhone App 这里 我看到了一张 授权表单 在这我可以决定 我是否授予这个 App 访问权限 对于现在这个样本 我会把所有类别都打开 并且点击“允许”

    这就是如何给我的 App 授予访问权限

    接下来 我们终于可以开始 用体能训练 API 了 所以当我点击这里的这个按钮 这个视图会被传过来 包含体能训练 相关信息的 workoutConfiguration 对象 在这个例子中 这是个跑步训练 从那里 我可以继续 设置我的体能训练了

    这个视图由 我的体能训练 session WatchKit 界面控制器支持 我会在唤醒方法中 完成设置 那么首先 我会创建 HKWorkoutSession 和 HKLiveWorkoutBuilder

    我们用初始化程序 创建了 session 我们再把体能训练配置对象传给它 然后 我们只需从 session 中 直接获取 builder 如果体能训练配置项无效 创建 session 可能会失败 所以这就是为什么我会 把这段代码放在一个 do-catch 区块中 如果有任何错误 会被忽略 接下来 让我们设置这个 session 和 builder 在这个例子中 我希望我的界面控制器 可以是 session 和 builder 的委托 因为我也想 收集设备产生的采样数据 我需要在这里使用 一个实时的数据源并且传给它 一个体能训练配置项 这样各种类型就会 为我自动推断出来

    最后 我只需 启动 session 和 builder 那么既然我的体能训练已经 开始 我需要做的第一件事 就是启动我的 elapsedTime 计时器 我会在 beingCollectionCall 的 回调中来 完成这个 我这里有一个方法 可以帮我做 当然 因为暂停和 继续事件也会影响 持续时间的计算 我在 builder 的 didCollectEvent 中 也需要调用这个 现在 我们来实现这个方法

    所以在我的 UI 中 我使用了一个 WKInterfaceTimer 如果你对这个对象不熟悉 这个对象需要一个 过去时间 然后从那个时间 开始计时 所以我接下来会 用 builder 的 elapsedTime 属性 来创建我的时间对象

    因为我想要的时间是 过去时间 我需要 确保这里 有一个负号 接下来 我只需在主队列上 调度因为我在做 UI 方面的工作 然后我只用在计时器上 设置时间 我也需要确保 计时器只在 session 运行的时候运行 让我们来做这个 首先 我拿到 session 状态 然后 再一次我 在主队列上调度 如果 session 正在运行 我会启动计时器 如果不在运行 我就停止计时器

    这是你所需要做的 让计时器追踪已用时长的 全部事情 接下来 我们来确保 我们在 UI 上展示的所有指标 也是准确的 所以每次 builder 收集到 新的样本数据 这里的这个方法会被调用 那么这里 我也只需要 重复这里的 collectedTypes

    而且 在我的例子中 所有我需要的 数据都是 数量型样本 所以我要确保我 只处理这些 从这里 我们可以利用 针对数量数据的 builder 的新方法 builder.statistics 它会返回给我一个 HKStatistics 对象 包含了每个数据类型的最小值 最大值 平均值 以及最近值 所以我拿到这个统计对象 从这 我有一个已经实现过的方法 会返回给我 针对特别的数量类型的 用户界面标签

    它会用统计对象 更新我的标签 接下来 我们来确保 当用户需要的时候我们 可以控制状态 所以每当用户轻点 暂停按钮 这个方法 会被调用 这样 我只需 调用 session.pause

    对于继续 也很类似 我会执行 session.resume 以及最后 为了结束体能训练 我会调用 session.end 再调用 builder.endCollection 然后传入体能训练的结束时间

    然后 我们只需 调用 finishWorkout 来真正把这次体能训练 和所有相关数据保存 在 HealthKit 中

    然后 我们只需要无视它 那么我们来运行这段代码 看看现在会发生什么

    那么我来 启动我的体能训练

    如我们所看到的 我的计时器在更新 我的数据由 builder 直接 收集并且在我的 用户界面上展示 当然 我也可以响应 状态变化 所以现在 来暂停这次体能训练 体能训练

    计时器暂停了 数据采集也暂停了 我可以继续 就像这样 只用几行代码 现在我有了一个 全功能的体能训练 App [掌声] 我现在准备停止体能训练 我们来看看我们在 iPhone 的健康 App 中 保存了什么 这就是我刚刚保存的 体能训练 而且现在我们看到 直接保存在 HealthKit 中的体能训练 有非常丰富的 信息展示 我有设备的详细信息 还有相关的所有样本 比如心率 距离 活动能量 还有当我暂停和 继续 session 时 产生的体能训练活动

    现在在 Apple Watch 上创建 一个全功能的体能训练 App 就是这么简单

    [掌声] 不过当然 有时候 事情并不像我们计划的那样 比如说我在跑我的第一个 马拉松 我特别激动 在用我最喜欢的体能训练 App 来追踪这次马拉松 而我在最后才发现 这个 App 在途中的某个时候 居然崩溃了 搞得我失去了所有的数据 好吧 在 watchOS 5 中 我们带来了体能训练恢复 可以帮你解决这个问题

    [掌声] 如果你的 App 恰好 在一次活跃的体能训练中崩溃 我们会自动重启你的 App 给它一个恢复 体能训练的机会

    体能训练 session 和 builder 会以之前的状态恢复 所以你不应该在 builder 上 调用 startActivity 或者 beginCollection 如果你在使用一个 自动收集数据的数据源 你需要重新设置它 下面是它的工作原理 如果你的 App 在一次崩溃后重启 我们会调用 WKExtensionDelegate 方法 handleAcitiveWorkoutRecovery

    这样 你只需创建一个 healthStore 对象 然后调用 recoverActiveWorkoutSession 然后你会在 completion handler 中拿回 一个 session

    就这么简单 这就是我们新的体能训练 API 它让创造优秀的体能训练 App 变得前所未有的简单 我们也有一个新的 数量系列 API 有关这个 我想把麦克风 交还给我的同事 Niharika 她会告诉你们更多有关它的信息

    [掌声] 刚才那些是不是好到难以置信 在不到 10 分钟的时间里 Karim 能够创建一个 全功能的体能训练 App 这非常重要 因为 像我刚才提到的 我们的用户喜爱做 体能训练

    而这些体能训练会带来 相当多的数据 比如说我想要 做一个足球 App 我非常想弄清楚 我的用户到底是如何运动的 而且我想追踪在一次体能训练中 他们在球场上 从一边跑到另一边时 移动的距离 当我们开始体能训练时 样本数据就 开始产生了 我的用户先跑了 2.25 然后 1.6 然后又跑了一点 然后 结束了 从前 这里的每个 距离都会被存储为 一个单独的 HKQuantity 样本 每一个都是独立的 而且会被分开储存 我们考虑一下 如果你可以有 一个追踪累计总数的样本 但同时其背后仍然有那些 独立的数量支持 是不是很棒 这就是为什么我们引入了 HKCumulative QuantitySeriesSample 它是一个 全新的样本类型 让你可以更高效地 存储高频数据 它很棒 有两个原因 原因一 你只需要存储 一个由多个数量支撑的 样本 因此 你可以更高效地存储 那些来自体能训练的 高频数据 第二 你现在 可以知道组成一个样本的 多个数量与样本本身的联系 因此我们新的 QuantitySeriesSample 是 HKQuantitySample 的 子类 你们中也许 有些人已经很熟悉 如果你之前用过 HKQuantitySample 我们新的 样本类型 基本上一样

    那么为什么你想要 用这个呢 比方说你想要 数据可视化 你的 App 需要复杂的 图表或图形 你正努力用 一种漂亮的方式可视化 用户的数据 实际上我们建议 你继续使用我们的 HKStatisticsQuery 或者 HKStatisticsCollectionQuery 这是因为那些类正是 已有的 query 中 做这件事的 你有权访问到 真正详细的丰富的数据 而这些 query 将会 在新的系列样本上 得到详细的数据 所以你无需 做任何额外的工作来获得 那些详细信息

    如果 比方说 你想要做数据分析 你要更进一步 你想要弄清楚 组成一个样本的 实际数据 我们建议你使用我们新的 系列样本 query 最后 如果你和我一样 有一个足球 App 或者任何会高频 收集数据的 App 我们建议你使用我们新的 数量系列样本 builder 它作为一种全新的方式 让你 能够真的创建 那些新的累计的 数量系列样本 并且 以更有效率的方式存储数据

    那么让我们开始 sample query 吧 像我刚提到的 你可以通过这种方式来 看得更深入并且真正理解 组成一个数量系列样本的 独立的 HK 数量

    在代码里 当然 我们 首先想要搞清楚 我们会把这些新的数量 存储在哪里 在我的例子中 我会把它 存在一个数量的数组中 接下来我们初始化 query 我们用我们感兴趣的样本 来初始化它 我们的完成处理器 正是这部分工作 进行的地方 在我的例子中 我有一个 叫做 analyzeQuantity 的方法 会来完成我想要对数量 做的事情 就是把它添加到 刚才我声明的 数量数组中 最后 我们来执行 query 就是如此简单 你们中有人熟悉我们的 其他的一些 query 这里的表现非常相似

    接下来 我们有 QuantitySeriesSampleBuilder 如我刚才提到的 对于那些会产生 高频数据的 App 非常有用 因为用这种方式 存储数据效率更高 而且还允许你 创建它们之间的联系 那么首先 当然 我们从创建样本 builder 开始 我们用 HealthStore 配合我们感兴趣的 quantityType 来初始化 接下来 无论你希望用 什么样的频率来插入 样本 你只管做 那么以我这个足球 App 为例 我非常需要 我的用户移动的 实际距离 所以我要 声明这个测量单位 是我想要的数量 并且把它插入在 seriesBuilder 中 最后 我在我的系列上 调用结束 然后我们实际上 会得到新的数量系列样本 并且能够来储存它 用一种 更有效的方式 因此 我们真的真的 为你们感到激动 你们可以开始在新的 Quantity series API 上实现你们的 App 了 因为这种全新的方式存储 数据更高效 而它将数据关联在一起的 能力让一些有趣的分析 成为了可能

    那么我们已经讨论了很多 有意思的事情 我们认为考虑这些事情最好的方式 应该是用更完整的角度来看待 因为这些东西整合在一起 真的可以让你 从开始到结束都 更加重视你的用户的体验 当然 我们必须开始 尊重用户的隐私 我们的用户在把他们 最敏感的数据给予我们 而确保我们怀着它 赢得的尊重 来处理这些数据 尤其重要 接下来 有了 Karim 介绍的 全新的体能训练特性 我们得以创造无缝的 用户体验 有了像体能训练崩溃恢复的东西 我们能够呈现给 用户真正期望的 用户体验 最后 通过使用新的 Quantity series API 你能够遵守设备的 能力并且真正确保 从开始到结束 你都在给你的用户提供 能力范围内的最佳体验 由于健康和健身类 和体能训练 App 持续 增长 而且用户 用得越来越多 我们很高兴看到这些东西 组合在一起能够创造 真正难以置信的用户体验

    更多信息 请参见 我们的开发人员文档 但实际上如果今天能和你们当面 聊聊 会更好 今天下午 1 点到 3 点 我们会有一个实验室 今天晚上 还有健康 健身和搜索聚会 我们很乐意回答你们的 任何问题 听听你们的 故事 与你们面对面 另外 我想说 在 HealthKit 中我们有一些全新特性 我们很乐意你们都去 看看他们的会议 用 HealthKit 访问 健康数据

    非常感谢各位 我们期待看到你们 用这些做的东西 谢谢

    [ 掌声 ]

Developer Footer

  • 视频
  • WWDC18
  • 跟踪体能训练的新方式
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • Apple 智能
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习与 AI
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • Mini Apps Partner Program
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    阅读最近新闻。
    获取 Apple Developer App。
    版权所有 © 2026 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则