知识点:

  • 操作:查找健康样本(Find Health Samples)
  • 操作:获取健康样本的详细信息(Get Details of Health Sample)
  • 操作:从列表中获取项目(Get Item from List)
  • 操作:为数字取整(Round Number)
  • 技巧:在捷径中进行时间计算

在捷径发布后,很多人喜好用捷径做的一件事是跟 Siri 说一句「早上好」,然后 Siri 通过捷径设定的内容做出回复。但是大多数人做的这个捷径里,大概唯一有用的内容就是天气这样瞥一眼手机就能获取到的信息。

我很早之前就希望使用 iOS 实现一个 Dashboard(主控面板)的功能:

Gyroscope Dashboard

如图1 所示,在这里我所指的 Dashboard 是一种汇聚信息并且能够将其可视化的方式。我希望通过它可以让我知道我这一天的主要情况,包括:

  • 主要身体健康情况:比如查看睡眠时间
  • 主要任务情况:查看日历和任务管理工具的任务
  • 主要信息处理情况:查看 RSS、Pocket 和 Evernote 中未处理和未阅读的文章数

不幸的是,iOS 没办法很好地实现这一目的,因为没有什么应用可以时时地统计这些信息并针不同的信息做图,并随着它们的变化而动态变化2 。随后我就把这个目标退而求其次地转化到了捷径里,让它能够一次性地把这些信息通过文本的方式显示出来。

在我想要显示的这些信息里,必须依靠 iOS 的就是「睡眠时间」。

制作这个捷径的思路和困难

为什么要量化睡眠以及如何用 iOS 量化睡眠,我很早在《AutoSleep,苹果生态下完全自动统计睡眠的尝试》已经介绍过了,这些年我都在用这个应用。

AutoSleep 会自动帮我们统计睡眠数据,随后导入到「健康」这个应用中。而我们可以通过捷径将这些数据给导出。导出数据之后我们就会发现,我们每天睡眠时间是有零有整的:

我的睡眠数据

上图是我 11 月 30 日到 12 月 1 日之间的睡眠数据。除了晚上的 8 小时之外,下午我还午休了 1 个小时,而且中间好像还被什么事打断了。有可能是我睡眠不稳定,也有可能是上厕所,也有可能是被什么消息干扰了一下随后又睡了。总之,如果我们想获取这一天的睡眠总时长,那么我们必须要把这段时间给合并起来,而这,是制作这个捷径的最大难题。

最终效果图

第一步:获取睡眠数据

在了解到了思路和困难之后,我们开始着手制作这个捷径。首先第一步是获取我们的睡眠时间。这在捷径中要借助「健康」相关的操作——「查找健康样本」:

健康相关的操作

把它拖到操作列表之后,我们会发现它和「查找照片」很像,都是添加过滤条件类型的操作:

「查找健康样本」和「查找照片」

为了获取我们的昨天到今天的睡眠数据,我们要这样填写其中的过滤条件:

填写「查找健康样本」
  • Type(类型)我们选择 Sleep(睡眠)
  • Start Date(开始日期)是最近 1 天
  • 满足接下来的全部条件:
    • Value(值)是 Asleep(睡眠),因为睡眠的值除了睡眠时间还有卧床时间,这里我们要选睡眠时间
    • End Date(结束日期)是今天

这些条件能够保证我们获取的是昨天到今天的睡眠数据,而为了获取睡眠的持续时间,我们还要再接一个操作:「获取健康样本的详细信息」,并选择其中的「持续时间」:

成功从健康样本中获取睡眠时间

运行捷径后就能看到,我们的两次睡眠数据都显示在了结果里,一次是 8 小时 28 分钟,一次是 35 分钟。

第二步:时间计算

接下来,我们要想办法把 8:28:00 和 35:00 这两个时间加起来。

技巧:在捷径中进行时间计算

时间计算的逻辑大家一定都会觉得很容易:小时加小时、分钟加分钟就行。但是这在捷径中却没那么容易实现。

我们想要把 8:28:00 和 35:00 加起来,就是要用 8 + 0 获得小时数,再用 28 + 35 获得分钟数。如果分钟数大于 60,还要除 60,获得商和余数。最后把商和小时数加起来获得最终的小时数,把余数作为最终的分钟数

那么我们观察 8:28:00 和 35:00 这两个数,会发现它们的共同点是冒号 :。如果只有 1 个冒号,那么冒号右边是秒数,左边是分钟数。如果有俩冒号,那么分钟数左边还有个冒号,冒号左边是小时数。

所以如果捷径可以通过冒号来拆分文本(捷径确实可以),再从右往左地取时分秒数就行。逻辑是:倒数第一项是秒数,倒数第二项是分钟数,倒数第三项是小时数。

但是捷径没办法从右往左这样倒过来取,只能从左往右这样正着取。也就是左起第一项是小时数,左起第二项是分钟数,左起第三项是秒数。

所以我们只能为没有小时数的那一项 35:00 之前加上小时数 0,让它变成 0:35:00。而这对于大家来说应该不是什么难题。不过要注意,我们每天的睡眠时间,可能会很复杂,比如可能有 6 条数据,第 1、3、5 条数据是带有小时数的,第 2、4、6 条数据是不带小时数的。这时候我们必须让捷径能够判断出给谁加上小时数,不给谁加小时数。这一步对已经学会条件和重复的各位来说,也不应该是什么困难:

在分钟数前添加 0 的操作组合
  • 首先「重复」,因为我们要处理的是多条睡眠时间的数据
  • 使用「拆分文本」,以 : 为分隔符,把时分秒拆开
  • 使用「计数」,来看看上一步获取的是 3 项还是 2 项
  • 使用「如果」进行条件判断,如果「计数」的结果是 2 项,说明现在重复的这个睡眠时间没有小时数
  • 所有我们就在「文本」中为它加上小时数
  • 「否则」我们就直接获取正在重复的这项睡眠时间

我们来看下运行结果:

成功将 35:00 变成 0:35:00

接下来,我们就能够按小时加小时、分钟加分钟的思路,来计算时间了。

那么首先,我们来获取小时数的和:

获取总小时数的操作组合

截图的最上方是为刚才的结果设定变量,这是因为这些数据我们之后在计算总分钟数的时候还会用到,所以先设定变量方便后面调用。接下来是就算小时数的步骤:

  • 首先是对每个睡眠时间的数据进行「重复」
  • 重复中的每一项,我们使用「拆分文本」,并且把分隔符改为「自定」,填入 :
  • 接下来我们用「从列表中获取项目」获取上一步拆分后结果的第一项,因为第一项就是小时数
  • 随后结束重复,并使用「计算统计数据」计算每条睡眠时间数据的小时数相加的「总和」
  • 最后将这个数字设定变量

接下来我们来获取分钟数:

获取睡眠时间的分钟数

获取分钟数的操作步骤和获取小时数的步骤基本一样,只是「从列表中获取项目」这个操作中,我们要选择「索引处的项目」,也就是自己输入选择第几项结果。我们知道,第一项是小时数,第二项是分钟数,第三项是秒数。所以这里我们填入 2,也就是选择第二项,分钟数。

在获取分钟数之后,我们就会发现,分钟数的和有很大几率超过 60,这时候我们就要把分钟换算为小时和分钟,再把由分钟转化的小时数加到之前获得的小时数的和上。

这时候,我们的操作组合应该是:

分钟转小时的操作组合

我们直接在之前设定的分钟数变量后,加上「计算」这个操作,使它除以 60。由于可能会出现小数,所以使用「为数字取整」这个操作,并且把取整的方式设为「始终向下取整」(即哪怕是 6.9,也会取 6 这个数字)。这样我们就可以获得分钟数转化的小时数,随后我们要为它也设一个变量。

接下来,我们要获取剩下的分钟数,也就是之前的分钟数转化为小时数后余下的分钟数:

计算最终分钟数的操作组合

我们先把刚才由分钟转化的小时数重新使用「计算」这个操作乘上 60。因为我们刚才取整的时候使用的是「向下取整」,所以乘过 60 后的数字一定是小于等于之前的分钟数的。我们为这个计算结果设定一个变量。

随后我们再用之前的分钟数,减去这个计算结果,就可以获得所有数据计算后,最终的分钟数。

接着我们要获得的是最终的小时数,这很容易,用之前的到的小时数,加上同样已经求出的分钟数转出来的小时数即可:

计算最终小时数的操作组合

我们先获取小时数的变量,再用「计算」让它加上分钟转小时的数字,就的到了最终小时数。

最后我们把结果放到「显示结果」里,就能够让 Siri 告诉你昨天睡了多久了。

最终效果图

另外,熟悉捷径的玩家也许知道,捷径中也有一个现成的时间计算操作「获取日期之间的时长」,但是它只能获取日期之间的时间差,在时分秒的加减这个场景上用不上。以后我们会在用到它的时候再为大家详细说明它的用法。

小结

制作这个捷径的目的是为了制作我个人版本的「早上好」,让捷径每天能够告诉我前一天休息了多久,我好对今天的精力有一个预期。这也说明这个捷径本身,将会成为另一个大捷径的一部分。

同样,时间计算这一系列的操作,它们其实可以独立出来,单独做成一个捷径。每当你有需要进行时间计算的捷径时,直接在捷径中运行这个时间计算的捷径,会省去你很多制作捷径的时间。

要注意所有这样的操作组合,特别是这种又复杂、适应性又广的,应该把它们都单独制成捷径,然后再用到它们时直接使用「运行捷径」这个操作调用它们。

捷径下载:获取昨天的睡眠时间

  • 1图片来自 Gyroscope 博文:https://blog.gyrosco.pe/2017-in-review–9b72c93648b5
  • 2过去 Panic 有一款软件叫做 Status Board 是比较接近的,但是已经下架。现在有一款替代品 Numerics,一是价格过高,二是仍不能完全达到我的要求。