RescueTime iOS原生版本的问题

我派的用户应该非常熟悉 RescueTime这个App,它是一个用于记录和跟踪多平台多设备使用情况的工具。电脑端和Android端的RescueTime你可以获得每一个 App的详细使用时长。但由于 iOS的安全机制限制, RescueTime在 iOS上基本上是一个「战五渣」:它只能记录手机的总使用时间,而不能详细到具体的App。

iOS原生版的RescueTime只能记录手机总使用时间

iOS自带的 ScreenTime可以满足这一要求,但无法导出数据,当然也无法与 RescueTime集成。这篇文章秉承着「授人以鱼不如授人以渔」的原则,详细讲述了我的解决方案。时间匆忙的小伙伴们可以直接从这里下载,并直接跳到「App打开/关闭时自动运行捷径的自动化设置」章节。

解决思路

RescueTime有一项特性,称为离线时间(Offline Time)。

RescueTime网页版的添加离线时间功能

这一功能可以让你记录下离开电脑时所做的事情,例如吃饭、运动、上下班等。此功能是你可以通过 RescueTime API写入的唯一数据。好消息是离线时间记录和RescueTime「原生」的App记录一样,也可以为其设置分类、标注其属于Productive或者Distracting。这就是说,如果我们能通过Offline Time的API从 iOS设备上写入「微信10:30 AM-11:15 AM」,我们就能得到和追踪 App使用时间一样的效果。

在 iOS设备上调用 RescueTime API是非常简单的,捷径里本身就自带这个功能:

iOS捷径里调用任意API的动作

接下来的问题是,我们如何记录App的使用时间。为了获得使用时间,必须记录你打开这个 App以及关闭时的时间。

记录App何时打开

此问题可扩展为:

  1. 打开App时自动运行一条捷径指令
  2. 运行该捷径指令时,记录当时的时间

事实上, 第一点已经可以通过iOS的捷径自动化实现了。
第二点的困难之处在于,我们需要一种方法来在iOS设备上储存这个App打开的时间。这样在 App关闭然后我们需要 call RescueTime API的时候我们可以拿到这个变量。我以前也尝试过一些「曲线救国」的方法,比如写入备忘录或者提醒事项等灯,都不太稳定,也不容易使用。直到有一天我发现了这样一个叫 Data Jar的 App:

 

简而言之,这就是一个支持捷径的 App,它可以让你轻松地写入和读取任何键值映射(比如JSON格式)。

记录 App何时关闭

类似于记录 App何时打开,我们需要:

  1. App关闭时自动运行一条捷径指令
  2. 当捷径指令执行时:
    1. 从 Data Jar取出之前保存的这个 App的「打开时间」
    2. 记下当时的时间,也就是App的「关闭时间」
    3. 用这两项时间数据调用RescueTime API

实战

App打开时间记录的自动化

记录App打开时间的捷径

记录App打开时间的捷径

此捷径非常简单,只有一个步骤,即在 Data Jar中写入当前时间。请注意作者将键值设置成 RescueTime.Shortcut Input,这样我们就可以为不同的App记录自己的数据,避免它们彼此冲突。例如,你可以使用 RescueTime.微信和 RescueTime.少数派。Shortcut Input是运行此捷径所需的变量,我们将在下面设置自动化时使用它。

App打开时自动运行捷径的自动化设置

App打开时自动运行捷径的自动化设置

这一则自动化很好理解:当微信打开时,自动执行上述的捷径指令。请注意,我们关闭了「运行前询问」选项,以便这一自动化能够在背景中自动运行。
我们点开这则自动化的「Do」:

为记录App打开时间的捷径提供输入变量

这里可以看到,我们设置了一个文本变量,它的值就是「WeChat」。然后我们将其作为捷径指令的输入变量,即前面提到的 Shortcut Input

App关闭时间记录的自动化

记录App关闭时间的捷径

记录App关闭时间的捷径

这个捷径稍微有点复杂,我们拆解看看:

  1. 首先,我们仍然需要一个 Shortcut Input的变量。这使我们能够通过 RescueTime.Shortcut Input 的键值从Data Jar中提取该 App的打开时间。
  2. 我们询问 Data Jar是否具有与此键值对应的数据。如果存在,我们将继续
  3. 我们从Data Jar中获取App的打开时间
  4. 我们计算当前时间(即 App的关闭时间)与开始时间之间的差值
  5. 显示通知「XXXApp记录了 XXX分钟」
  6. 调用RescueTime API后删除对应于该键值的数据
调用RescueTime API的设置

App关闭时自动运行捷径的自动化设置

App打开时的设置基本一致,不再赘述。

App关闭时自动运行捷径的自动化设置

实际效果

记录App使用时间的展示

改进

上述设置在实际使用过程中,笔者发现了一些小问题,以下加以说明。

关闭快捷方式运行通知

最大的问题是捷径运行时会弹出一个通知。攒多了以后你的锁屏就被其攻占了:

积压在一起的捷径运行通知

关闭通知的方法竟然是个「偏方」:

  1. 在设置中打开 Screen Time
  2. 点开 See All Activity
  3. 向下滑动到通知栏,可以看到捷径应该位于前面
  4. 如果你的手机在这一屏「捷径」的右边有>标识,恭喜你,点击它,然后关掉 Allow Notification。或者也可以在 Alert那里选Banners (在屏幕上方出现片刻后自动消失)
  5. 如果在捷径的右边没有看到>,下面是见证奇迹的时刻!此时,在屏幕上方的 This Week中点击<去 Last Week,然后再点>返回 This Week,您就会看到「捷径」的右边神奇地出现了>的标识!
关闭捷径通知的小偏方

同时记录多个 App

该方法还有一个缺点,即您必须为每一个App都设置一套自动化。这显然是要累死个人。一个解决方案是,我们就可以把一些同类别的App合并到一起统一记录。例如爱优腾、B站、YouTube、Apple TV都可以被记录为 Watch Video。在自动化设置里可以选择多个App:

在自动化设置里可以选择多个App作为触发条件

缺陷

虽然笔者用这套系统基本满足了日常的记录需求,但是现阶段仍有一些缺陷:

  1. 每次 iOS设备重新启动时,关闭捷径通知的方法都会被重置,需要重新设置一遍。
  2. Data Jar不知什么原因一定要先和iCloud同步再保存数据。这就造成了如果网络不稳定,数据可能丢失。

未来展望

iOS会不会哪一天开放App对Screen Time数据的访问权限?笔者认为像Apple这样注重隐私的公司,短时间之内可能不会。笔者也非常希望被打脸,这样RescueTime就可以原生地支持App使用时间的记录了。