大多数浏览器和
Developer App 均支持流媒体播放。
-
探索 HealthKit 中的新数据表示法
探索 HealthKit 如何丰富和扩充您的 app 可向用户提供的健康数据类型。了解高频健康数据类型的现代储存、如何访问详细的心率数据,以及如何通过新的听力健康支持为您向用户提供的健康信息加上一个全新维度。
资源
相关视频
WWDC19
-
下载
(在HealthKit中 探究新数据表达)
下午好 我是Luke Spicer 今天我和我的同事Divya 要与大家分享HealthKit 如何在iOS 13中扩展数据表达
有许多人已经知道 HealthKit针对健康和健身 数据提供集中式数据存储 并且还为健康和健身app和体验 提供互操作性
如果你还不了解 HealthKit的使用 让我来提醒你一下 在App Store的 健康与健身类中 有七万多个app 并且它们均可 从HealthKit所提供的 互操作性和功能性中受益
今天我要讲一些 与HealthKit中的 数据表达相关的信息 从回顾HealthKit 数据模型开始 (HealthKit数据模型) 然后我要讲一些 主要应用于量化数据的特定API
稍后Divya会上台 来讲每搏测量、 心率事件 和有关听力健康的全新的API
让我们从HealthKit 数据模型开始讲
在HealthKit中 我们表达数据…
在HealthKit中 我们用样本表达数据 样本是在特定时间所进行的测量 有一定的时间跨度
绝大多数测量都是简单测量 比如通过 Apple Watch测量的心率
或通过已连接的Bluetooth 进行的身体质量测量
其它测量更加丰富和复杂 比如锻炼或临床病例 可直接下载到iPhone上
所有这些丰富的、复杂的数据表达 都共享一个通用结构 最高层级的样本 以一些专业数据表达为支撑
比如…
血压测量可以表达为一个相关样本 过敏资源来自病例 健身路线来自一系列样本 这些都是专业样本类型的示例 都有各自独特的备份数据格式
比如血压相关样本 是一组血压测量 过敏资源依赖于文件资源
健身路线是CL位置数据的一个数组 正因为HealthKit 对这些特殊的测量类型 提供这些专业数据表达 我们也针对最常见的测量类型 对数据表达进行了扩展 适用于量化数据 我们继续讲一下量化数据 (新的量化系列API)
快速回顾一下 HealthKit中的量化数据 适用于一些很常见的测量概念
比如步行距离、 身体质量和心率 我们把所有这些概念 都看作是量化类型 它们的测量看起来类似这样
每个测量都包含一个量化数据 它是一个值 和一个单位 以及一个时间区间 那表明测量所发生的时间区间 我们把每一个这样的测量 都叫做量化样本
根据这个描述 我们要讲 量化类型和量化样本 特别是如何有效地表达 大量的量化数据 但如果你想了解 关于这些概念的更多介绍 请参看我们2014年的演讲 关于HealthKit的介绍
为了继续推进我们对量化数据的讨论 我想描述一个情境 如果可以 请你想象一下 我们正在做一个全新的app 这个app连接了一个 以前从未见过的心率传感器 它被嵌入了一个视频游戏控制器中
我们的任务是 从这个心率传感器获取测量数据 并把它们保存到 HealthKit中 从而用户可以了解他们的心率是多少 当他们玩任意一款游戏时
我们从传感器中收到的心率 看起来就像这样 一系列测量数据 会随时间进入我们的app 当用户玩游戏时 我们需要决定如何表达这个数据 我们可以把它 保存到HealthKit中
我们可以采用的一种方法是 使用单一量化样本 看起来就像这样
这个单一量化样本 跨越了整个测量间隔 就是游戏的整个时长 并通过单一量化来表达 我们从传感器中接收的全部测量数据 也许是平均值
这个表达为我们提供了一个对象 来表达我们所获取的测量数据 即这个游戏过程中的心率 但如果稍后我们想了解 游戏结束后心率的变化 我们就没办法通过这种表达来实现
我们可以采取的另一种表达是 使用多个量化样本 看起来就像这样 每一个测量都表达不同的量化样本
这种表达允许我们保留 由传感器测量的全部数据 但这种数据表达并没有那么有效率 因为我们有冗余数据 全部这些量化样本 都有相同的元数据和设备信息 我们不再拥有那个便利的单一对象了 就是那个表达我们实际上 所获取的测量数据的单一对象 在游戏过程中是心率
谢天谢地 我们可以采用第三种方法 我们把它叫做量化系列
量化系列表达看起来像这样
单一量化样本 跨越了整个测量时间 但在这种情况下 我们不获取单一量化数据 而是多个量化数据
这种表达利用了以上两种方法的优点 用单一对象表达测量数据 会保留从传感器中获取的 全部测量数据
请注意我们移除了 之前存在于 单个量化样本上的冗余信息 因此我们在量化系列样本层级 我们只存储单一副本 我们都想尊重用户的设备存储 和设备性能 这种表达就可以让我们实现这个目的
因为量化系列样本是一种量化样本 我们需要一种方式来表达 有单一值的量化数据的顺序 并且在HealthKit中 我们通过一种叫做聚合的技术来实现
我们有两个主要的聚合类型: 积累和离散 积累聚合类型 适用于一些很常见的量化类型 比如距离、 卡路里和步数 全部这些量化类型 都被用户持续地累积 他们走更多的步数 燃烧更多的卡路里 和移动更远的距离
执行累积的最自然的方式— 针对这些类型 聚合多个量化数据的最自然的方式 是用合计
另一方面 我们还有一些其它常见的量化类型 不适用合计 比如心率、身体质量和身高
如果合计在一起没有任何意义 如果你一天量好几次心率 并把它们加在一起 你会得到一个荒谬的值 像这样聚合量化类型会更自然 取平均值 也许是其它聚合统计 比如最小值、最大值和最新值
再一次 我们可以看到 一系列的累积量化数据 可以通过合计来表达和聚合 而一系列的离散量化数据比如心率 将被聚合来产生一些统计数据 比如最小值、最大值、 平均值和最新值
在HealthKit中 我们使用量化聚合类型 来提供指定量化类型的聚合类型 并且在iOS 13中 我们决定不使用离散聚合类型 而使用一种新的离散算法聚合类型 我们之所以这样做是为了明确 根据这种聚合类型 所计算出来的平均值 是简单的算数平均数
我们还引入了一些新的聚合类型 让我们从 discreteTemporallyWeighted开始讲 它是一种特殊的聚合类型 使用时间加权平均值 应用于当我们聚合心率量化数据时
我们还添加了 discreteEquivalent ContinuousLevel 它是一种特殊的聚合类型 适用于音频暴露量化数据 Divya稍后会具体讲音频暴露
现在我们了解了如何聚合 多个量化数据 来生产统计数据 我们需要一个地方来存储 量化样本上的这个信息
我们在iOS 13中 实现了这个功能 通过引入两个新量化样本子类实现 从累积量化样本开始 它有一个合计属性 并且离散量化样本 它有 平均值、最小值、最大值 和最新值量化属性
我们还把量化样本作为抽象基类 意思是从现在起 你所交互的量化样本的全部实体 都将是这两个量化样本子类中的一个 取决于量化类型的聚合类型
并且我还想提醒一下 全部量化样本都可以被看作是 量化系列 只不过其中有些恰好只有一个 量化样本
我们还为这两个新样本类型 引入了相应的 Predicate键径
你可以查询这两种样本的相应属性
返回到我们的量化系列样本例子中 我们可以看到量化系列样本 可以通过我们的聚合统计进行合计 平均值、最小值、最大值和最新值
现在我要讲如何创建这种量化系列
(创建量化系列) 我们要从测量开始时 讲量化系列 在这个情境中是指游戏开始
然后我们将收到 来自传感器的测量数据 我们可以把它们插入到 这个量化系列中 我们继续从传感器中获取测量数据 并继续把它们插入到量化系列中 一直到游戏结束
最后当我们完成测量后 我们就可以结束量化系列 并返回合计的量化系列样本
现在让我们看看代码
所有HealthKit交互的 第一步 都是请求 计划要读取的数据类型的授权 在这个例子中我们要请求心率的授权 一旦我们请求了授权
我们就可以通过healthStore 创建量化系列样本创建器 数据类型 开始测量的时间和可选的HK设备
然后 只要我们收到 来自传感器的测量数据 我们就可以把它们插入到 量化系列样本创建器中 最后在游戏结束时 我们可以完成量化系列样本创建器 通过可选的元数据和测量结束时间
现在我们已经了解 如何有效率地表达量化数据 并把它作为量化系列 保存到HealthKit中 我们还可以思考通过数据 可以给app带来哪些体验 一旦数据被保存到 HealthKit中
也许我们想让app能记录 除心率以外的卡路里信息 因此我们可以给用户显示在某个时间 间隔内他们总共燃烧了多少卡路里 或只呈现一些很漂亮的图表 突显数据并帮助他们将数据可视化 (量化数据的查询 所燃烧的卡路里总量) 或者我们想指出平均值 是在某一个时间段内记录的平均值 (图表的数据 每天所燃烧的平均卡路里数) (最小和最大心率) 或帮助用户了解 他们在某个特定游戏中 所达到的最小和最大心率值
或我们只想保持UI活跃并在收到 来自传感器的数据时 更新所记录的新数据 (最新心率) 我们可以实现这个功能并做得更好 通过单一HealthKit查询
HKStatisticsCollectionQuery
很多人已经熟悉 StatisticsCollectionQuery了 它非常棒 因此我只想重申它的功能
StatisticsCollectionQuery 可以帮助你计算多个统计 可以通过资料来源分隔开 并且只要有新数据 保存到HealthKit中 你就可以收到那些统计的更新数据 (生产多个统计 每个源可用的统计) 如果那还不够 我们还更新了 StatisticsCollectionQuery 用于支持新的聚合类型 并自动包含 存储在量化系列样本中的 (支持全部聚合类型) 全部备份量化数据 (自动包含量化系列数据) 如果你想获得关于 StatisticsCollectionQuery 和HKStatistics的 更多信息 你可以参考关于 HealthKit的介绍
虽然StatisticsCollectionQuery 应该是我们的首选工具 用于有效率地 与保存在HealthKit中的 量化数据进行交互
有时我们真的想枚举 存储在量化系列中的 每一个单一量化数据 比如 如果我们想做一些比如绘制 用户玩游戏时 通过我们的app测量的每一个心率
我们可以通过 QuantitySeriesSampleQuery实现
在iOS 13中我们改进了 QuantitySeriesSampleQuery 通过把NSPredicate中的 量化样本参数 替换为量化类型
现在不再简单地枚举 单一量化样本的量化数据 而是枚举多个量化样本 及其全部备份量化数据
我们还把时间参数升级为时间间隔 从而你可以在每个单一量化数据 被枚举时 获得它的完整时间间隔 我们还有一个可选的量化样本参数 可以提供当前被枚举的量化系列样本
这个查询通过可视化数据 做出了最好的表达 因此我要给你们展示一下 在这里我们有两个量化系列样本 第一个量化系列样本 包含由嵌入到 我们的视频游戏控制器中的 心率传感器测量的量化数据
第二个量化系列包含 由Apple Watch测量的量化数据 因为我们的用户恰好同时 使用这两个设备 这两个量化系列适时地相互重叠
默认情况下 QuantitySeriesSampleQuery 将以量化数据的开始时间为顺序 枚举来自这两个量化系列的 全部量化数据 就像这样 请注意在量化系列的末端
完成参数被设为真
如果你需要获取 量化系列样本自身的参数 比如设备信息、来源、版本号 或元数据 你可以在执行查询之前 把包含样本设置为真 请注意 在这个例子中 当枚举这些量化系列时 你可以在量化数据处理器中 获取相应的量化系列样本
现在我们已经了解如何使用量化系列 与量化数据进行有效地交互 我想告诉你们在游戏中添加 我们在本场演讲中所讲到的这种支持 有多么简单 跟着我一起进入Xcode 我会给你做一个简短的演示
这是游戏现在的形式
我实际上没有 嵌入到视频游戏控制器中的 心率传感器 但如果有人想做一个 稍后请给我打电话
但我有另一个外部心率传感器 我可以用来获取信息 请记住量化系列 可适用于任意量化类型 而不只是心率 并且数据可以来自于外部传感器、 外部数据库、磁盘上的文件 或由app直接输入
这个游戏有两个标签
第一个是Play标签 它会提出 PlayViewController 我们可以开始游戏 第二个标签是上一次游戏标签 它会提出 ResultsViewController 显示在上一次玩游戏时 所测量的心率
我要继续并切换回 PlayViewController 给你演示一局游戏该怎么玩
在这个游戏中我要击中热狗 而放过西兰花 也许对于健康类app来说 有点落伍了 但是我只有这个
每收获一个热狗就增加一分 当我玩游戏时 我的心率会增加
如果我切换回上一次游戏标签 我可以看到我还没有收到 在玩刚才的游戏时 所测量的任何心率数据 现在我们想给app添加那个支持
我们的第一步是… 让app请求授权 就像我们在PPT中所看到的那样 因为app总是会在用户玩游戏时 读写心率数据 我希望只要app启动完毕
就请求授权 那么我要在app中添加这个 在app委托中添加 didFinishLaunchingWithOptions
在这里我正在请求… 我正在创建一组专用于心率的 量化类型 我可以在 HK healthStore内 请求这些样本类型的授权
请求授权后 我们会获取来自传感器的测量数据 并把那个数据保存到量化系列中
我已经创建了一个类 用于压缩对外部传感器的连接 并且如果你想了解它是如何运作的 请参考与本场演讲相关联的示例项目
我现在要转到 PlayViewController 因为我们想添加连接 用于记录用户玩游戏时的心率 我要打开项目导航器 转到 PlayViewController
在PlayViewController中 有一个startNewGame函数 每当按下app中的开始游戏按钮时 就调用它 这里正适合我们创建 对外部心率传感器的连接 并开始量化系列… 量化系列样本创建器 首先我要创建对传感器的连接
HeartSensorSession 是我刚才提到过的那个类 它会压缩对传感器的连接 我把PlayViewController自身 作为HeartSensorSession的委托
现在我可以开始 心率的量化系列样本创建器了
在这里我创建了一个 量化系列样本创建器 healthStore 存储心率类型 测量的开始时间为当前时间 我要从HeartSensorSession中 获取HK设备信息
HeartSensorSession 通过它的委托协议 与PlayViewController通讯 HeartSensorSessionDelegate 有以下两个方法: sessionDidReceiveHeartRate 和sessionDidEnd
通过sessionDidEnd… DidReceiveHeartRate HeartSensorSession 给它的委托提供心率测量数据 这正是我们获取测量数据的好地方 并且把它们插入到 量化系列样本创建器中
在这里我把从HeartSensorSession中 接收的心率 和时间间隔插入到 量化系列样本创建器中
最后当游戏结束时 HeartSensorSession结束时 由HeartSensorSession调用 sessionDidEnd 这是我们结束量化系列样本创建器的 完美场所 从而存留我们插入到HealthKit中的 心率量化数据 我们还可以关联 用元数据所创建的量化系列 在这个例子中 我要使用元数据 把这些心率与我们刚刚玩的 游戏会话关联起来 从而在ResultsViewController中 我们可以查询 与上一次游戏所关联的心率
在这里我要使用MetadataKey ExternalUUID创建元数据词典 我在心率传感器的UUID字符串中 设置了MetadataKeyExternalUUID 我终于完成了量化系列 通过元数据 和从HeartSensorSession中 接收的结束测量的时间
现在我们已经把心率数据 保存到HealthKit中 我们想… 我们想在ResultsViewController中 给用户显示数据 那么让我们现在转到 ResultsViewController
在ResultsViewController viewDidLoad函数中 我有一个应用函数 loadHeartRateQuanitites 它会查询 与上一次游戏会话相关联的心率数据 并在表视图中生成一个 可以显示出来的 每个量化数据的字符串表达
让我们继续并从添加量化系列样本 使其查询 与上一次游戏相关联的心率开始 如果玩过游戏的话
在这里要防范 没有玩过游戏的情况
如果我们有一个游戏识别器 我们可以继续并使用游戏识别器 为MetadataExternalKeyUUID 创建一个查询谓词 请记住 我们使用了这个元数据 从而稍后可以进行查询 与上一次游戏相关联的心率数据
然后我可以创建量化系列样本 使用我们上边创建的谓词 查询心率类型
在查询处理器内 我要枚举 与这个上一次游戏相关联的 量化数据和时间间隔
并且我要为每一个 都创建一个字符串表达 让我们继续并创建一组字符串 用于存储这些结果字符串
然后我们可以把它用在查询处理器中
首先我要防范枚举过程中 可能会返回的错误 如果没有任何错误 我就可以继续并使用 所枚举的量化数据 和时间间隔创建一个 heartRateDetailsStrings 并且我要把这些详情字符串分配给 heartRateStrings 数组
最后当枚举完成后 完成参数将被设为真 这正是取回主队列的好地方 从而重新加载ResultsViewController 以显示这些字符串
现在我想重新运行app 让你看看它现在看起来怎么样 现在我们已经添加了 对读写心率数据的支持
请记住 当app启动时 我们看到的第一件事 将是请求授权
我要继续并打开授权 从而读写心率数据
现在我要再玩一局游戏
请记住 我要击中热狗而放过西兰花 哦 零分 再来一局
哦 两分 但我仍可以看到心率如何 好了 我们拥有了一些心率数据 是在刚玩的那局游戏中测量的
(演示 读写量化系列) 刚才我们了解的是 如何通过量化系列样本创建器 有效率地保存量化数据 以及如何使用QuantitySeries SampleQuery对其进行查询 现在我要邀请我的同事 Divya上台来 她会讲HealthKit 如何在心率方面 对表达进行了扩展 以及我们如何迁入到 全新的听力健康的健康域 谢谢大家
那么我的同事Luke刚给你们讲了 在iOS 13中存储HK 量化数据的有效率的新方式 并且HealthKit 越来越多地成为了一个 保存用户每日健康数据的仓库 除了存储越来越多的数据 我们还存储各种各样的数据 今年 我们在现有的支持中 添加了听力健康 并对听力健康添加了新支持 (新的健康类型 心脏和听力健康) 我们的用户自iOS 8起 就与心脏相关的功能进行交互 他们可以从 Apple Watch获取心率 或从由你们开发人员创建的 连接到传感器的app中获取心率 并在健康app中浏览全部数据
HealthKit一直支持心率 因此如果你的心率读数是这个 你可以决定在五秒内 平均心率是每分钟68次
并且在HealthKit中 你可以把它作为HK量化样本保存
在iOS 11中 我们引入了心率变量SDNN (心率变量SDNN) 心率变量是心跳和心跳之间 在时间间隔内的测量的变化 并且SDNN代表的是 正常心跳间隔的标准差 因此Apple Watch 可以获取同样的心率读数 并获取每次心跳之间的时间间隔 来计算一个标准差 并把它作为量化样本 保存到HealthKit中
心率和心率变量 对于心血管健康来说 都是非常重要的度量 并且用户们也喜欢看一眼 就能了解这些信息 在日常工作生活中或更具体地 比如当他们健身时
那么让我们再看一次 这同一个心率读数 目前 我描述了我们可以总结 这个心率数据的方式 但有时候你想获得真实的底层数据 那么假如我想获得时间… 了解每次心跳所发生的时间 返回到我们的情境中 假如我们的游戏控制器有一个传感器 可以在用户在玩游戏时 有新的心跳进入时告诉我们 那么在这里 第一次心跳发生在 从数据收集开始的起始点 之后的0.5秒 第二次发生在第1.49秒 并且我们可以得到—— 我们可以继续获得 自数据收集开始起 这些心跳发生的其余的时间点
那么你可以注意到 每次心跳都发生在一定的时间点 把它们放在一起就组成了 一系列的心跳 要把这个数据 保存到HealthKit中 我们有一个 HKHeartbeatSeriesSample 它会按照心跳发生的时间戳 来保存一系列的心跳
现在你可能注意到 这与Luke之前讲过的系列API 感觉很相似 但有一个重点需要注意 即心跳系列样本 压缩衍生自HealthKit中 其它样本类型的数据类型 没有值或单位 比如HK量化数据 它是量化系列背后的底层数据 因此我们可以更有效地 保存一系列时间戳 来表达一个心跳系列 (健康系列VS量化系列 没有值或单位 比如HK量化数据) (一系列时间戳) 但因为我们仍然存储一系列数据 那可能会非常大 我们有… 我们设计了API来熟悉量化系列 因此我们配备了这个 HeartbeatSeriesSample 有它自己的创建器和自定义查询
与量化系列样本一样 心跳系列样本也是由创建器所创建 并当你完成保存数据后结束 那么让我们用代码来创建一个
第一步一如既往 是请求恰当的授权 对于这个例子 你需要请求新的心跳系列类型 以及我们从iOS 11中 重新引入的量化类型 heartRateVariabilitySDNN 你需要请求 这两种类型的授权 因为心率变量是一个 可直接衍生自心跳系列的度量 这样你的用户就清楚地了解 他们到底与你分享了哪种数据
一旦我们请求了授权 我们可通过heathStore、 gameDevice 和gameStartDate 初始化一个心跳系列创建器 那会表明何时开始数据收集
当游戏正在进行时 并且当用户正在玩游戏时 我们将向创建器中添加 带有时间间隔的心跳 自系列开始的时间起
但你可能会遇到这样的情况 传感器当掉了 在这里有一个数据收集的缺口 在第二秒和第三秒之间
现在看起来 在第二个和第三个心跳之间 有一个1.99秒的缺口 那会导致 对用户的心跳数据的错误翻译
考虑到这个问题 我们要把 precededByGap设为是 你可以对你所添加的每一个心跳 进行设置 如果你注意到数据收集中 由于传感器当掉而存在缺口的话
现在我可以在创建器中添加元数据 与其它HK样本中的操作一样
当我完成数据保存之后 我会结束系列 那将把心跳系列样本 保存到HealthKit中
现在我已经在游戏中添加了 对逐拍测量的支持 并且我们已经准备好开始查询 底层心跳测量数据了
跟Luke之前讲过的一样 我们可以与标准的HK查询进行交互 以获取高层及样本 然后使用自定义查询 与更精细的数据进行交互
那么我的第一步就是 运行一个标准的HK样本查询 以获取我感兴趣的心跳系列样本
一旦完成 我将用那个样本初始化心跳系列查询 那会让我随时间枚举每一次心跳
最后我要执行查询
心跳系列对HealthKit来说 是个新添加的强大功能 但这并不是我们拥有的 与心脏相关的全部功能
自iOS 12起 Apple Watch 就开始通过心脏警告通知用户
当Apple Watch 检测到心率 低于指定BPM临界值时 会发出低心率警告 (心率事件) 当心率高于指定BPM临界值时 发出高心率警告
当Apple Watch检测到 可能象征房颤的节律时 发出心律不齐警告
嗯 在HealthKit中 这些警告的形式是三个新的类别类型 当Apple Watch检测到警告时 将被保存到HealthKit中
除了全部这些强大的心脏支持 我们在iOS 13中 还披露了这个新区域 我非常激动地与你们一起分享 听力健康在HealthKit中 找到了一席之地 (听力健康) 在你生命中的某个时间点 你可能记得做过听力测试 戴上耳机 并听一系列的声音 当某个声音大到你能听到它时 就举起手 嗯 这是纯音听力测试的一个例子 纯音是指一个具有单一频率的声音
纯音测试可以帮助识别 在一组频率不同的声音中 你所能听到的最轻的声音 (纯音测试) 并且它可以提供你可能具有的 听觉障碍或听力丧失的评估
纯音测试的结果 最常见的是显示在一个叫做 听力图的图表上
这是一个有轻微听觉障碍的人的 听力图的示例 让我们放大这个图表 更清楚地了解 听力图中所储存的数据
那么在这里你可以看到两条线 一条对应于左耳的纯音测试结果 另一条对应的是右耳 让我们先来看看 位于125赫兹线上的前两个数据值
这表示对于这个用户来说 要听到125赫兹频率的声音 他们的左耳需要大概 11分贝听力单位 而右耳需要31分贝 分贝听力单位测量的是 相对于一个年轻、健康的个体 所能听到的最轻的声音 所能听到的声音的密度
因此我们可以获得 与这个听力图相关联的其余数据值 为了把这个数据存储到 HealthKit中 我们引入了 它会存储一组 与听力测试相关联的听力敏度值 那么让我们创建听力图样本和代码
第一步是创建 HKAudiogramSensitivityPoint 压缩双耳所能听到的 指定频率的声音的密度
那么我要用新的HK单位赫兹单位 来创建频率量化数据 并用新的分贝听力单位来创建 左耳和右耳敏度量化数据
现在我已经准备好 创建听力图敏度值了 一旦你创建好一组听力图敏度值 你就可以把它保存到 audiogramSample中 现在一定要确保敏度值 都是唯一的并且是按顺序排列的 因为这是你稍后在分析或图表中 与这个数据进行交互的方式
最后我已经准备好把那个数据 存储到HealthKit中了
开始创建听力图样本 以及用HealthKit创建 听力健康app 就是这么简单
但听力图样本只代表 当你做听力测试时的指定时间点的 耳朵的健康程度
一天中的绝大多数时间 我们都暴露在各种声音之中 这些声音来自耳机 或来自我们在路上行走时的周围环境 那都会影响我们的听力健康
为了保持追踪来自耳机的音频暴露 我们有一个读写量化类型 headphoneAudioExposure
在一天中剩下的时间 当我们走在充斥着建筑工作声音 或交通声音的路上时 Apple Watch可以捕捉 环境中的音频暴露数据 并把它保存到HealthKit中 为此我们有一个类似的读写量化类型 environmentalAudioExposure
如果环境中的音频暴露太高 Apple Watch会生成一个 音频暴露警告 以确保你了解 那可能对你的耳朵健康 所产生的可能的影响 并且它会使用新audioExposureEvent 类别类型识别器 把这个保存为类别样本
那么我们讲了许多 在HealthKit和 iOS 13中可用的新的数据表达 从新的、有效率的系列表达 到对听力健康的新支持
现在你可以正式存储 大量的HK量化数据了 大多数冗余数据 保存在HealthKit中 (总结) 并且你可以表达更丰富的 关于心脏和听力健康的数据的表达 (有效率地存储大量HK量化数据) 要获取更多信息以及你在这里 所看到的示例代码项目 你可以访问我们的演讲链接 或在本场演讲结束后 与我们在健康与 健身技术实验室中沟通
谢谢大家 祝你们WWDC过得愉快
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。