大多数浏览器和
Developer App 均支持流媒体播放。
-
重新构思的 ResearchKit 和 CareKit
ResearchKit 和 CareKit 框架是为研究和患者护理领域提供强大原生 iOS app 的最快途径。了解最新的音频和语音活跃任务、经过彻底重新设计的用户体验,以及旨在针对任何用例轻松创建护理计划 app 的模块化架构。
资源
- CareKit
- CareKit Open Source Website
- CareKit Repository
- ResearchKit Open Source Website
- ResearchKit Overview
- ResearchKit Repository
- 演示幻灯片 (PDF)
相关视频
WWDC19
-
下载
(ResearchKit 和CareKit新概念)
大家好 欢迎参加ResearchKit 和CareKit新概念演讲 我是Srinath 我是援助团队的一名软件工程师 今天我们要讲许多方面的内容 让我们直接来看内容 首先看今天的整体流程
跟以往一样 我们要从社区更新开始讲 然后我们讲一下 ResearchKit框架的更新 然后我们有一些非常激动人心的消息 我们想分享一下CareKit框架
关于社区更新 我们主要想讲一下去年发布或更新的 利用了ResearchKit和 CareKit框架的一些app 其中一个例子就是 FocalView app 它是由Novartis发布的 它的主要功能是 在数字平台上进行眼科临床试验
另一个值得一提的例子是FDA MyStudies app 这个app面向患者 它是兼容平台的一部分 用于临床试验 或现实证据研究 FDA继续开放 MyStudies app源代码 供其它组织重新包装、发布和使用
今年除了讲app之外 我们还想讲一下发布 对于情境 ResearchKit 和CareKit框架 已经发布了大约三到四年 我们达到了一种地步 我们开始看到 涌入了许多发布 这些发布均源自过去几年 所进行的研究
绝大部分发布都在谈 基于移动设备的研究设计 在某些事情方面有多么成功 比如参与者注册 招募不同参与者的能力 从地理和人口的角度来看 以及随着更多参与者的注册 每个参与者的成本的整体降低
现在让我们看一下其中一些发布
Pride Study 讲述了他们在 招募和接洽大量被忽视的参与者 进行临床研究方面有多么成功
Healthy Pregnancy 讲了低消耗率 以及如何让参与者定期填写 基于移动设备的研究和问卷
Personal Touch 的发布很有意思 因为它的发布发生在2019年五月 我们大约在一周前才开始了解它 其中一个作者在GitHub上 提交了一份民意调查请求 提出他们为此次发布 所做的一些现行任务 以便社区中的其他人也可以利用它
关于这一点 我们所有的健康框架… ResearchKit、 CareKit和HealthKit 都是为了让开发人员 能够创建一些很优秀的 研究和护理app
另外 我们还有一些很强大的设备 配有传感器 从加速度计和陀螺仪 一直到可以让你的用户 做心电图检查的电极
继续下去你会震惊于… 我们社区中的开发人员、研究人员 和健康专家 能够利用我们的产品和平台 所完成的工作
但每年 我们仍收到大量邮件 提出各种各样的问题 如“什么是ResearchKit 和CareKit?” 或“我该如何创建一个 研究或护理app?” 我们还收到了来自科研机构的提案 关于设备授权请求
这也就是为什么今年 我们目前正在开发一些 新计划的原因 现在我想让你们简单地预览 其中一些新计划
第一个是调查员支持计划 我们正在对它进行试验 我们正在开发这个计划 并将于今年下半年发布它 这将是仅限于 Apple Watch的计划 它的提案提交过程非常简单明了 (调查员支持试验 简单的提交过程) 我们将优先考虑研究… 通过独特地利用我们的生态系统 研究推进科学进步 并帮助人们过更健康的生活…
我们想让你们预览的第二个计划 是一个重新设计的网站 (重新设计的网站) 这个网站将包含关于ResearchKit 和CareKit框架的明确信息 每个想要了解这两个框架的 更多信息的人都可以访问这个网站 你还可以获得来自利用这些框架的 其他研究员和开发人员的深刻见解 从而创建优秀的研究和护理app 这个网站将包含 关于调查员支持计划的大量信息 网站和调查员支持计划本身 此计划将于2019年秋季上线 我们对此感到非常激动
现在让我们换个话题 谈谈我们对ResearchKit 框架所做出的更新 我们主要讲两个话题 UI更新和现行任务
让我们从UI更新开始讲
今年我们的主要重点围绕 改善用户体验 围绕回答调查问卷 因为我们意识到 有些经过验证的医学问卷 和入职培训流程可能会非常长
你在这里可以看到我们已更新了 卡片样式 从而使你可以为用户 提供更多的情境信息 这包含步骤内进度指示器 以及一个了解更多按钮 这个按钮可用于 当提问或答案选项包含 并不完全一目了然的术语时 因此在这个例子中 如果你的用户没有意识到 嗜睡症到底是什么意思 他们只需要轻触了解更多按钮 拉出一个表单 就可以获得 有关提问和答案选项自身的更多信息
现在你会注意到我们已经添加了 顶部内容图像视图 该样式在ResearchKit上 自始至终保持一致 因此我们的所有步骤现在都可以 通过顶部内容图像视图 显示丰富的媒体内容
如果你接着向下滚动 我们还添加了一个 类型主体项的新对象 用于编写列表 列表会自动应用格式
现在让我们看一下如何把这些变更 合并到你现有的app中
你要做的第一件事就是创建一个 带有唯一标识符的 ORK learnMoreStep实例
现在我们所有的步骤 都有这个图像属性 它将作为顶部内容图像视图显示 你还可以自定义其它属性 比如标题和文本
你需要做的另一件事就是 创建ORKBodyItem实例 它接受以下参数 比如文本、详情文本 以及样式 你可以在项目符号图像 和纯文本之间进行选择 现在我们所有的步骤都接受 许多主体项 让我们把这个主体项分配给 learnMoreStep
接下来你要做的就是创建 learnMoreItem实例 并绕过步骤 因此这个对象实质上是创建 屏幕上的详情披露按钮的对象 我们还有另一个初始化程序 它接受文本 因此其中一个将作为超链接 在步骤中显示
我们还向ORK表单项中 添加了另一个初始化程序 以便帮助你自定义分段标题 这会让你在同一个分段内 归类多个表单项 这个初始化工具接受这样的属性 比如sectionTitle、detailText、 learnMoreItem 以及表明你是否希望 显示步骤内进度指示器的切换开关
现在你已经把这些变更 合并到了你的app中 你的用户可以在回答 你的任何提问之前做出知情决策
现在让我们继续讲现行任务 与去年类似 今年我们主要关注 健康的三个主要方面: 视力、听力和语音
当测量视力健康时 有两个关键指标被认为是金标准
视敏度和对比敏感度
视敏度主要是区分 和识别物体及其特征的能力
它有两种刺激 一个是Landolt C 另一个是Snellen 或Tumbling E 现在我们在视敏度方面的第一个 现行任务 是由Novartis从他们的 FocalView app中提出 这个app请求用户 把外刻度盘对准字母C的开口处
Landolt C刺激 保持固定对比度 但持续递减尺寸 并向随机方向弹出
一旦用户完成这个任务 开发者将收到该用户的视敏度评分
要向你的app中合并这个功能 你要创建一个 附带唯一标识符的 ORKLandoltCStep实例 然后把testType设为敏度 然后跟以往一样 你可以创建一个排序任务 通过传递一些步骤 然后传递任务以创建 TaskViewController实现 你可以在你的app内呈现 TaskViewController
我们在视敏度方面的第二个现行任务 以Tumbling E作为刺激
现在作为这个任务的一部分 用户要滑动到 字母E开口一侧的方向 类似于Landolt C Tumbling E 将保持固定对比度 但会递减尺寸并从随机方向弹出 但有意思的是测试距离 和刺激大小都由原深感摄像头控制
一旦用户完成这个任务 你将接收多得多的值 其中MAR代表最小分辨角
要向你的app中合并这个功能 你要创建一个带有唯一标识符的 ORKTumblingEStep实例 你还要针对你的试验 指定最小和最大观察距离
与以往一样 你要创建一个 OrderedTask 把它传给 ViewController并呈现它
现在让我们继续下一个大类 对比敏感度 这实际上是指从物体背景中 区分出物体的能力 并且它有… 也有两个最常用的 测试这个特定对比敏感度的刺激 一个是Landolt C 另一个是Gabor Patch (对比敏感度- Landolt C Novartis FocalView的贡献) 对比敏感度的第一个现行任务 还是由Navartis从他们的 FocalView app中提出 这与视敏度任务非常一致 但主要不同点是Landolt C 保持固定尺寸 但随着在随机方向的呈现 递减对比度
一旦用户完成这个任务 你将收到该用户的视敏度评分
要把这个功能添加到你的app中 与视敏度任务的添加方式一样 只有一个关键的不同点 就是要把测试类型修改为对比敏感度
(对比敏感度功能 Gabor Patch) 作为我们下一个任务的一部分 我们将尝试为用户生成… 对比敏感度功能 通过为他们呈现一种被称为 Gabor Patch刺激来实现 这就是Gabor Patch刺激 你会注意到刺激上有一些线条 向右倾斜 特别是顶部倾转 在另一个刺激中 你会注意到顶部倾转或向上的倾转 是向左倾斜 你的用户要识别 倾转的倾斜方向 并选择适当的方向作为任务的一部分
现在Gabor Patch刺激 由程序使用适应性算法生成 使空间频率不同
现在Gabor Patch 将在屏幕内以随机方向 在不同位置显示
再一次 测试距离和刺激尺寸 由原深感摄像头实时控制
一旦用户完成这个任务 开发人员将使用结果为该用户生成 一条敏感度VS空间频率曲线
要在你的app中合并这个功能 你要创建一个 带有唯一标识符的 ORKCSFStep实例 你要针对你的试验 设置最小和最大观察距离
你要创建OrderedTask 把它传给 TaskViewController 并在你的app内呈现它
现在对比敏感度功能 和Tumbling E现行任务 利用了原深感摄像头 这两个功能很快将通过 Apple示例代码许可证 发布到 developer.apple.com上
现在让我们继续下一个类 听力 去年我们发布了 关于听力健康的三个新现行任务 我们有调测听力、语音和噪音 以及声压计
今年我们全面增强了 它们的算法 更棒的是你现在可以直接 把这些现行任务的结果 写到HealthKit中了
要了解关于新数据类型的更多信息 我建议你参加 HealthKit演讲 时间是今天下午2点 (听力任务更新)
现在让我们继续讲语音 去年我们引入了一个 语音识别现行任务 当用户完成这个任务后 你会收到一堆信息 其中包含原生音频文件、转录 以及一个 SFTranscription对象 由语音识别框架进行渲染 今年语音识别团队 向SF转录对象中添加了更多功能 因此你可以提取信息 比如讲话频率 和平均暂停时长 另外还有一个叫做 SFVoiceAnalytics的新对象 要了解更多相关信息 请查看“语音识别的改进”演讲
这些就是我们对现行任务扩展库的 全部更新和添加
现在你可能注意到了其中有些任务 在底层利用了一些系统框架
我们想提醒你一下 我们的SDK中 有许多其它强大的iOS系统框架 我们非常鼓励开发人员 利用这些框架真正的潜力 若你考虑向ResearchKit中 添加新现行任务 或甚至考虑添加 与健康有关的新颖体验的话
接下来 让我们转向CareKit的更新
CareKit框架于2016年 作为开源框架被重新引入 我们希望开发人员 执行三件主要的事情: 轻松地把药方数字化;
向用户提供有意义的数据和动态; 并让用户与他们的护理机构 轻松地取得联系
通过过去几年的努力 我们一直对框架进行递增更新
今年 我很高兴地向大家发布 CareKit 2.0 这就是CareKit 2.0 你可以看到我们完全颠覆了 这个框架的UI
但更好的是 我们从根本上完全使用Swift 重新架构和重写了框架
那意味着CareKit在底层 可以利用某些最强大的 Swift语言功能 包括新发布的合并框架
现在让我们具体看一些细节 现在CareKit框架在底层 由两个其它框架组成 CareKit UI 和CareKit Store
CareKit UI是CareKit 存储库中的一个独立对象 你可以把它作为独立框架 进行编译和暴露
CareKit UI就是 预包装好的UI视图子类 那实际上意味着 你在屏幕上所看到的每一个视图 你都可以在你的app中 通过CareKit UI使用
我们把它们分成了三大类 或三个组成部分 我们把它们叫做任务、图表和联系人 这些名称反映出了 每个视图所提供的功能
我提到过 CareKit UI中的所有视图 都只是简单的UI视图 本质上是UI视图的子类
因此我想从任务中 所有可用的视图开始讲 今天我们想强调其中五个
在这里 你可以看到我们有一个视图 因为它只是UI视图的一个子类 你可以在你的app内的任意位置 对它进行约束 通过把它添加为子视图实现
要创建这个视图 你所要做的就是 导入CareKit UI 创建OCKSimpleTaskView实例 并设置这个对象上可用的一些参数
就是那么简单 现在让我们看一下我们说过的 在这个任务的组成部分内可用的 其余四个UI
我们要讲的下一个…
是OCKInstructionsTaskView 当你创建这种类型的对象时 你会得到一个 看起来跟这个有点像的视图 你所要做的就是添加一个额外的参数 用于查看正确的值
顺着同一条线 我要讲的下一个视图是 OCKGridTaskView 看起来跟这个有点像 这个视图很有意思 因为你在这里看到的所有钩号和按钮 都是药物视图的标准元素 作为这个视图的一部分 我们实质上是 直接给你暴露了 collectionView 因此你可以选择把自己作为委托 并传递任何你想要传递给 collectionView视图 因此你可以选择使用OCK按钮 或你甚至可以提供任意自定义UI 它的自定义程度也很高
我们的下一个视图类型 是OCKChecklistTaskView 看起来跟这个有点像
你在屏幕上看到的所有按钮 现在都在堆栈视图中生成 因此通过简单地调用一个 appendItem方法 你就可以向你的勾选列表中 添加一个新角色作为新的一项
最后一个视图类型 是OCKSimpleLogTaskView 它看起来跟这个有点像 它可用于记录随机事件 比如头痛或恶心 每次用户轻触记录按钮时 我们都为他们显示一个他们记录 最后一个事件的时间的时间戳 并且再一次 时间戳在堆栈视图内生成 通过简单地调用 appendItem方法 你可以根据由按钮生成的行动 附加更多记录
现在让我们转到下一个组成部分 图表
要在CareKit UI中 创建一个图表 你只需要简单地导入 CareKit UI 你要创建一个 OCKCartesianChartCardView实例 并制定一个类型 然后你就可以继续设置标题、文本 甚至是值 作为部分数据序列 通过切换类型
你可以轻松地在同一组数据点的 不同图表类型之间切换
我们今天要讲的最后一个组成部分 是联系人
你可以创建一个 OCKContactCardView实例 并填充内容 我们将确保正确应用 所有约束
这就是我们对CareKit UI 所做出的全部更新 我们的真正目的是 继续向每个组成部分中添加更多视图 同时扩展我们所拥有的组件库
我们认为这对用户来说 是一个非常强大的工具 CareKit 2.0 框架高度可定制 因为我们给你提供了所有的 新视图类型 并替你处理所有约束
现在让我们谈谈 CareKit Store CareKit Store与 CareKit UI类似 是它自己在CareKit 框架内的项目
因此你可以把它作为一个独立框架 在你的app中对它进行编译并导出 并以一种完全不相关的方式使用它 CareKit Store 实质上是核心数据的包装器 允许你坚持Care Plans 并在本地设备上 在你的app约束内做出反应 因为它实际上是个数据库 我们为你提供了一种 Cookie Cutter机制 让我们看看这种机制
对于任何护理app来说 最基本的实体是患者
现在让我们看看如何初始化 CareKit Store
如何创建患者对象并把患者对象 插入CareKit Store
从把CareKitStore 作为独立框架导入开始讲 然后你要创建一个带有唯一标识符 的OCKStore实例 以在你的app容器内 创建核心数据数据库
然后继续创建患者对象 通过使用其中一个便利的 初始化程序实现 这个初始化程序接受一些基本参数
然后你要在Store上调用 addPatientMethod 这将异步接受对象并把它 插入到数据库中 一旦完成后 你将得到一个完成回调 这将返回一个可以打开的 Swift结果类型
现在我们护理计划中 第二个关键的实体 是护理计划自身 每位患者可以有多个 相关联的护理计划 现在让我们看看 如何创建新的护理计划 并把它与特定患者相关联
那么跟以往一样 你要创建对Store的引用 有一件事要注意 就是如果你提供已经可用的标识符 我们将采用带有该标识符的 现有Store 并把它返回给你
然后如果你没有对患者对象的引用 你要做的第一件事 就是从Store中查询患者对象
一旦完成异步查询 你会得到一个回调 在回调内 你可以继续创建护理计划 通过给它提供参数实现 比如标识符 护理计划的名称 以及最重要的患者ID 这样会帮助你创建患者… 护理计划与患者自身之间的关联 然后你可以调用 addCarePlan方法 把这个新护理计划 插入到你的数据库中
每个护理计划都可以有与之相关联的 一组联系人 这些可以是与这个护理计划相关联的 私人护理机构的联系人
这里还有另外一件有意思的事 就是任务的概念 现在任务实体实质上是 用户每天请求实施的动作 这些动作是他们的护理计划的一部分 每个任务都有与之相关联的 时间表对象 现在时间表决定用户何时 预计实施某个特定任务
现在让我们看一下 如何给用户开某种特定的药物 以及如何把它插入到你的 Care Store中
那么在这里 我们创建了一个时间表 表明你每天早上7:00服药 我们创建了另一个时间表元素 表明你要在隔天中午12:00 服用同一种药物 我们把前边那个时间表叫做早餐剂量 把后边这个叫做午餐剂量 你可以简单地把多个时间表 组合到一起 创建一个统一的时间表 然后再传给任务
那么OCKTaskObject 接受诸如标识符这样的参数 这里的标题是一种多西拉敏药物 你可以给它提供时间表对象 并且你可以直接向 CareKit Store中添加这个任务
每次用户完成特定任务后 我们都生成一个结果 并且每个结果 都有一个与之相关联的值
现在让我们看一下 如何在数据库中查询 所有的结果 从而创建可以呈现给用户的 有意义的数据和动态
那么在这里我们创建了一个综合查询 它会查询过去七天 数据库中的所有元素
然后我们在任务上调用 fetchInsights方法 并且我们给它传递特定任务的标识符 就是包含你所感兴趣的事件的 特定任务 那么在这个例子中 我只对为多西拉敏药物任务 生成的事件感兴趣 现在这个API 有两个部分非常有意思 第一个是每日聚合部分 可被多次调用 每一次你都会得到那一天的一组事件 可以用于计算高阶度量
然后你会得到完成部分 只能被调用一次 它会为你提供一组经过计算的值 可以用于进一步分析或用于图表
CareKit Store中的 每一个实体 都可以有一个与之相关联的注释对象 注释对象实际上就是元数据 比如 如果护理机构 出于某些原因决定更新护理计划 并且他们为你提供自由文本 你可以把那段自由文本 添加到注释对象中去
另一件有意思的事 是有些关键实体现在版本可控了
因此当你更新药物任务时 或当你升级时间表时 我们会在CareKit Store中 进行存留 你可以在它们之间来回切换
那么这就是我们对 CareKit Store的更新 CareKit Store框架中 还有许多强大的API可用 我们建议你们了解一下
现在让我们关注一下 CareKit框架自身 CareKit其实就是 自始至终引入同步 从UI层级到底层数据库 我们的实现方式是 通过使用一个同步器对象 现在这个对象 在底层大量使用合并框架 从而在UI层和数据存储层之间 传播事件
现在CareKit的 另一个主要功能 是它的模块性和可定制性 我的意思是这里的数据库 既可以是 CareKit Store 还可以是你所偏好的任意数据库 只要它遵守 我们的OCKStore协议即可 OCKStore协议 会使同步器与它进行无缝交互
你在这里看到的UI元素 可以来自CareKit UI 或甚至可以来自你的自定义UI视图 只要你告诉我们如何把视图 绑定到特定对象上即可
现在让我们看一下 当用户在屏幕上与UI元素 进行交互时会发生什么 对于这个例子 让我们主要关注左上角的 多西拉敏药物 当用户轻触这个按钮时 会向同步器传播一个事件
然后同步器把这个信息 转发到底层的数据存储中 一旦数据库 确认成功接收这个对象 同步器会充当发布器的角色 它把数据流传播给 订阅了那个数据流的所有UI元素 在这个例子中 只有三张卡 订阅了来自药物任务的更新 一旦数据流抵达这三张卡 它们就可以各自进行自我更新
这非常令人激动 因为UI视图 相互独立 并且它们还以一种异步方式进行更新 那会在你的护理app内打造一种 非常强大的体验
现在让我们看一下 如何在代码中把CareKit 端对端合并到你的app 那么你要做的第一件事就是 导入CareKit 这样做会自动导入 CareKit UI 和CareKit Store框架
接下来跟以往一样 你要创建OKCStore实例
然后继续创建 OCKSynchronizedStoreManager实例 并把它传给Store 这将使同步器在数据库周围 进行自我包装
最后你可以选择使用 我们预先包装好的 其中一个独立的视图控制器 在这个例子中 我们展示的是 OCKTaskListView控制器 它接受storeManager资产参数
这样实质上会建立管线 从UI层一直到 底层的数据库 在此之后你所要做的就是 根据你为Store所提供的数据 呈现视图控制器 你可以看到一个类似这个的UI
类似地 你还可以利用我们的一些 预先打包好的视图控制器 从而创建动态视图和联系人视图
你可以在这里看到 CareKit 2.0 让框架的使用变得非常简单
但那还并不是全部 因此我想邀请Erik上台 来做一个演示 我们会演示如何使用CareKit 2.0 创建自定义护理app
好的 太棒了 谢谢Srinath
大家下午好 我是Erik 我是CareKit团队的 一名软件工程师 今天我有幸能带大家 看一个示例app 这个app会演示 有关CareKit 2.0的 一些很棒的新功能 我们今天要一起创建一个app 完全从头开始创建 它有一个虚构的患者
是一位怀孕的准妈妈 她每天早晨都会发生严重的孕吐反应 也就是恶心 我们为她做的这个app 会让她追踪她的服药情况
并记录她何时感到恶心
并且我们会给她显示一个图表 让她了解 她坚持服药和她的症状之间的相关性 最后我们要让她快速与联系人 取得联系 从而在有突发情况时 获得去办公室的路线 或给她的医生打电话
当我们开发 CareKit app时 有两个重要的步骤 第一个是我们需要创建Store 我们需要给它填充数据 这是我们要处理的第一件事 之后我们需要创建UI 并告诉CareKit 我们希望如何显示数据 我们将在下半场讲这个
让我们开始吧
哎呀
好的
你可以在这里看到 我们有一个空app 这是我们的起点 当你使用CareKit时 你要做的第一件事就是导入它 如果你不这样做 你不会成功的
一旦成功导入 我们要做的下一件事 就是创建Store 更确切地说 是SynchronizedStoreManager 它会替我们实施同步 当我们创建Store时 我们要从创建OCKStore开始 然后我们把它传递到 SynchronizedStoreManager中 我想在这里暂停一会 我想强调一些关于 CareKit 2.0很重要的事
在这里我们使用了OCKStore 它是核心数据的包装器 但是… OCKSynchronizedStoreManager 可以与实施我们的OCKStore 协议的任意对象相连接 那意味着你可以包装web服务器、
第三方数据库 或甚至是简单的JSON文件 并把它们作为你的数据库使用
为了达成我们今天的目的 我们坚持使用核心数据
我们要做的下一件事是 在Store中填充一些数据 我们只需要写一个便利的扩展 来替我们实现 在实际情况中 你可以 从网络服务器上把数据扒下来 或从app捆绑中加载数据 但今天我们要用代码实现
我们要创建两个任务 一个用于获取药物 一个用于检查 或一个用于记录何时感觉恶心 为此 我们需要创建一个时间表
我们要创建一些日期 不要太担心这些 重要的部分在下边 就是创建时间表 我们通过把元素组合起来 创建时间表 我们已经有一个每天重复的早餐元素 那么每天 我们都要在早餐时服药 然后在午餐时再服一次 然后隔天的晚餐时服第三次药 你实际上很可能不会像这样安排服药 但CareKit允许我们实现 非常灵活的时间表 我们只想稍微炫耀一下
有了时间表 我们现在可以 创建我们的任务了
为此 我们需要指定一个唯一标识符 我们要使用多西拉敏 这是一种治疗恶心的常用药物
当然 我们会添加到时间表上 我们会提供一些说明 从而让虚拟患者了解具体该如何做
让我们再创建一个任务 这次是针对恶心 在这个例子中 我们要创建一个更简单的时间表 这个时间表每天运行 全天运行 因为你可能感到恶心的时间不固定 我们希望你在任何时候 都能记录下来
最后我们要给它创建任务 与我们之前所做的方式非常相似 主要不同点是这个任务的 影响黏附属性为假 你会注意到 在绝大多数 CareKit app顶部 你会看到一大堆… 比如周日历 其中有一些表示完成的圆圈 通过把这个标志设为假 我们会排除这个恶心任务 使其不影响那些表示完成的圆圈
现在我们有两个任务对象 我们需要把它们添加到Store中 非常直截了当 我们已经做了这么多了 我们有了服药任务 有了恶心任务 我们还想添加一些联系人 从而当患者需要帮助时 可以联系这些联系人
联系人的创建与其它 CareKit实体的创建方式相同 你必须赋予它们一个唯一标识符 你可以在联系人上设置许多属性 在这例子中 我们要设置一张图片、 一个标题和一个角色
然后我们还可以提供…
联系信息 在这里我们提供一个电子邮箱地址、 一个电话号码 和一个消息
最后我们要附加一个地址 患者可以根据这个地址 从Maps上查看路线 如果他们需要去护理机构办公室的话
我们再添加一个联系人…
跟添加第一个联系人的方式基本相同
最后我们要把两个联系人 添加到Store中
好的 Store中 已经有两个任务了 我们在Store中有两个联系人 那把我们带到了第一步的终点 我们创建了一个Store 我们也在Store中添加了数据 那意味着第二步是生成UI 我们得写代码告诉CareKit 我们希望如何显示这些
我们的实现方式是 写一个 ViewController
那么在这里 我们要创建我们的 careViewController 我们马上就会讲到这个 但你要注意 我传入了storeManager 它将用于同步处理
最后我们要把ViewController 设置为我们的根视图 因此当我们运行app时 这就是我们要开始的地方 让我们具体看一下 看看我们有什么
这个目前是一个空类 你可以看到它继承自 OCKDailyPageViewController 如果你正在创建一个 CareKit app 并且你想获得一些强大的定制能力 OCKDailyPageViewController 是一个非常不错的起点
当你从这个类中继承时 你将获得…
一个viewController 它顶部有日历 其中含有标记完成的圆圈 用户可以进行翻阅 并选择他们喜欢的日期 在它下边是第二个 pageViewController 每次用户通过滑动或轻触 修改日期后 你都会得到一个回调
这个回调 事实上 在这个函数内 你将收到这两个参数 listViewController 和日期 这个日期就是用户刚才所选择的日期 listViewController 是一个空页面 作为开发人员 你的工作就是 针对用户所选择的日期 填充你希望用户看到的内容
实现方式非常直截了当
在这里我们要创建一个 OCKChecklistTaskViewController 我们可以把它附加到 listViewController上 那会把它添加到所选日期的内容中
让我们快速看一下这个类 OCKChecklistTaskViewController 现在你会注意到 根据Srinath刚才所讲的内容 有CareKit UI 和CareKit 在CareKit UI中 我们有任务视图 有四个或五个视图 嗯 在CareKit中 有同等数量的视图 并且其中每个视图 都有与之相匹配的视图控制器
主要不同点是CareKit UI 中的视图是本地的 并且不是同步的 而CareKit中的视图控制器 会自动更新
当我们实例化这个时 我们需要把它传给Store 我们需要告诉它 我们想让哪个任务显示数据 最后我们要提供一个事件查询 指定它应该只显示今天的事件
那么这就是我们的药物卡 它会要求患者服用多西拉敏 我们要再添加一个
SimpleLogTaskViewController 获取完全相同的参数 它会要求用户记录何时感觉恶心
我们写了许多代码 但我们终于已经准备好运行app 并看看它看起来怎么样了
好的 让我们运行一下 这就是我们目前实现的东西 你可以看到我们有添加的两个任务
用户可以在日历上的日期之间 来回滑动
他们可以像这样回到今天
你还要注意在某些日期上 我们有两个事件 在其它日期上 我们有三个事件 这是由于我们给任务所安排的时间表 不同
当用户核对任务时 会自动填充表示完成的圆圈
任务之间的这种同步 任务是指 TaskViewController 和顶部的 CalendarViewController 刚好是自动发生的 通过Store同步器实现
你还要注意当我们记录恶心事件时 它们不会出现在表示完成的圆圈中 因为当我们创建任务时 我们已经明确地把那些影响黏附属性 设为假
在我们继续之前 我想指出两个可以非常简便地自定义 CareKit app的地方 我认为你们一定会非常喜欢
第一个 如果我们… 跳回我们的app委托…
我们可以在窗口上设置一种着色 这个着色将在我们的 整个app中传播 这样可以非常简单地应用样式 或给你的app打品牌
第二个是换掉我们正在使用的那种 任务视图 因此请记住 CareKit UI中的任务 有许多不同的视图 我们可以切换到一个不同的视图…
只需要切换 我们所使用的 ViewController即可 它们的初始化程序都相同
我们要重新运行一下app 看看发生了哪些变化
非常棒 你可以看到颜色不一样了 还有完全不同的任务卡 现在对于这张卡 非常有意思的是 它显示了用户应该服用药物的时间 但当我们核对其中一个时 它所显示的时间… 改为了用户轻触按钮的时间 这非常有用 因为它允许患者 查看她最后一次服药的时间
好的 我认为我们可以继续 创建一些图表了 我认为我们要做的是 在我们的两张卡之间创建一个图表 也许是一个条形图 让我们假定它要显示 患者的服药次数VS 她感到恶心的次数
我们把图表放在我们已经创建好的 两张卡之间 我们需要创建两个数据序列
一个是服药数据序列 一个是恶心数据序列 我们要从创建恶心的数据序列开始 当我们创建这个数据序列时 我们必须给它赋予一个标识符 我想显示这个任务的数据 我们可以给它一个图例标题 用于绘图的一对颜色 以及标记大小 在这个例子中 是指条形图的宽度 还有事件聚合器 事件聚合器决定y轴值 在这个例子中 我们只计算 患者感到恶心的次数
我们再做一次同样的操作 这次是服药数据序列
操作基本相同
有了这两个数据序列 我们就可以创建 OCKCartesianChartViewController
初始化程序获取 storeManager 再一次 这是为了提供同步 同步是CareKit中很棒的功能 我们还传入数据序列 每个数据序列都是我们想在图表上 显示的数据序列
我们还传入日期 我们想显示的数据的日期 以及绘图类型 在这里我们要使用条形图 但你可以简便地使用散点图或折线图
最后在我们再一次运行app之前 我们要测试一些标签 以便患者可以理解 我们对她显示的数据
让我们再次运行app 并看一下图表
非常棒 你可以在这里看到 我们有图表了 图表上有数据显示 但关于这个图表 非常奇妙的是 当我们核对数据时 它通过漂亮的动画进行实时更新
也许第一天 我们的用户没有服药
她感到非常不舒服
第二天 她开始服药 她感到稍微好点了
第三天… 她服用了所有该服用的药物 今天她也服用了所有该服用的药物 她一点也没感到不舒服
因此你可以看到我们已经得到了 非常好的患者体验 但我们还可以利用另一个功能 我认为你们一定非常喜欢
现在你可以在CareKit的 这个listViewController中的 任意位置添加任意内容 让我来演示一下如何实现
让我们回到最顶部 我认为我们想添加一个横幅
我们可以通过创建 这个tipView实现
我们要在tipView上 设置一些文本 我们还要给它附加一张图片 但重点是 我们把它作为视图附加
现在我想让你注意的是 这个tipView不是 CareKit的一部分
我们只是为这个演示创建了它 它可以是来自你app的视图 或来自第三方库的视图
当我们现在运行app时 你会看到顶部有漂亮的横幅 那会鼓励患者 了解锻炼和健康怀孕之间的关系
你可以想象得到这个功能 有大量的用途 你可以根据患者的 护理计划商店中的已有内容 填充这个数据 你可以把它从服务器上扒下来 或你可以根据日期对它进行设置 真的有无限可能
在我结束演示之前 我要做的最后一件事 是让我们的用户可以快速访问 她的联系人 我认为我们要做的就是 在这里添加一个护理团队按钮 显示模态呈现 其中包含她所有的联系人 CareKit让这个过程 变得非常简单
在顶部 我们要创建我们的UI栏按钮项 我们要让它调用这里的这个函数
我们要在这个函数内 创建 OCKContactsListViewController实例 这是我们为你提供的一个 非常便利的类 你所需要做的就是 把它传给Store管理员 它将自动查询 你Store中的所有联系人 并显示出来
让我们最后再运行一次app 看它看起来怎么样
好了 那么轻触这个会显示我们的联系人 如果患者需要 去护理机构办公室的路线 她只需要轻触一下Maps即可
看起来有4.9英里
还不算太远 好的 我们得到了联系人 并且我们的app看起来很不错 我想我要在这里结束演示了 我们就到此为止 但在我把舞台 交还给Srinath之前 我想总结一下我们做了什么
我们大概花了15分钟 写了大约200行代码 我们完成了一个漂亮的 患者护理app 还带有华丽的动画
但对于这个app最重要的是 它非常模块化 每个视图之间彼此没有关系
所有的viewControllers 完全不挂钩 没有任何委托把它们绑到一起 随着用户需求的发展 这个app的更新和修改非常简单
我们认为CareKit 2.0 有无限可能性 我们非常期待看到我们的开发人员们 用它创造出很棒的app
好的 舞台交还给你Srinath
哇哦 谢谢Erik的演示 特别棒
现在总结一下整场演讲
CareKit是对框架的 基本重写和重构 它仍然保存了它的核心价值 但现在它是一个非常强大的工具 可以为你的用户 创建非常棒的护理app体验
我们提到了ResearchKit 我们讲了我们通过框架对UI 所做出的更新 以及在现有现行任务库上新添加的 现行任务 最后我们还讲了对社区的更新 包括两个主要计划: 调查员支持计划; 和即将于今年秋季上线的 重新设计的网站计划
(在GitHub上可用!) 一如既往 ResearchKit 和CareKit都是开源框架 你现在就可以在GitHub上使用
在接下来的几个月里 我们会非常努力地 向这些框架中添加更多功能 我们将支持暗黑模式 我们将添加可访问性、地理位置 以及更多的文档支持 在我们继续改善和扩展 我们的框架过程中 我们非常鼓励 我们社区中的所有开发人员 为我们提供反馈和建议 (请提出你们的建议!) 要获取更多关于本场演讲的信息 请访问这个链接 我们明天中午会举办一场 ResearchKit 和CareKit演讲 我们会在那里回答你的所有疑问
感谢你们来参加我们的演讲 祝你们度过一个愉快的WWDC
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。