如果说 URL Schemes 是 iOS 自动化的 1.0 时代,让多个 App 串联到一起成为了可能;那么 Workflow 就是 iOS 自动化的 2.0 时代,融入了模块化编程的思想,让不懂代码的用户也能轻松做出属于自己的工作流;或许以后,捷径将会是 iOS 自动化的 3.0 时代,打破 App 的边界,把 iOS 自动化提升到了一个新的高度。

Toolbox Pro 的出现,将《「捷径」解读:iOS 自动化的 3.0 时代》这篇文章里的猜想再推进了一把——iOS 应用的功能被不断模块化,开始有大量的第三方应用主动适配快捷指令;而 Toolbox Pro,是第一款以通用思路去应对这种变化的工具。至此,iOS 自动化 3.0 时代的序幕才正式被拉开。

功能详解

要理解 Toolbox Pro 是什么,得先从快捷指令的组成结构讲起:

  • 首先是「快捷指令应用(Shortcuts App)」,这是内置在 iOS 13 和 iPadOS 系统中的独立应用。后文简称「快捷指令 app」。

    快捷指令 app
  • 然后是「快捷指令(Shortcut)」,快捷指令 app 中每一个可以运行的动作,就叫做快捷指令。后文简称「快捷指令」。

    快捷指令
  • 最后是「快捷指令操作(Shortcut Action)」,每个快捷指令,就是由一个或多个快捷指令操作组成。后文简称「操作」。

    操作

而 Toolbox Pro 的主要功能,就是为快捷指令提供操作,组成快捷指令的基础零部件,我们可以把它看成快捷指令的扩展包。

Toolbox Pro 提供的操作

5 类操作

在第一个版本中,Toolbox Pro 一共提供了 58 个操作(后续还会继续增加),可以分为这么 5 大类:

  1. 增强操作:这一类主要是将快捷指令原有的操作进行强化,让它们提供更丰富的参数或者原先做不到的功能,比如增强了许多跟提醒事项、词典、计算、地点相关的操作。
  2. 简化操作:这一类是将原先需要多个操作、或者需要复杂算法才能实现的功能,简化成一个直观的、容易理解的操作。
  3. 系统 API:通过调用系统 API,获取更丰富的设备信息和新功能,比如离线 OCR、读写 NFC 芯片、获取系统提示音、获取设备内存等功能。
  4. 网络 API:通过调用第三方服务的 API,获取电影、音乐、游戏等信息。
  5. 特色功能:全局变量、图形菜单、图片编辑、美化 JSON 等。

部分操作可以在快捷指令内部直接运行,另一部分拥有自定义界面、或者考虑到内存占用等因素的操作,则需要跳转到 Toolbox Pro 应用运行。

在 Toolbox Pro 应用内可以看到操作的运行场景

实例讲解

接下来,我会从每个类别里挑选一些快捷指令实例,帮助大家理解这 5 类操作的作用。有些例子来自 Toolbox Pro 的官方库,有些则由我自己制作。

1. 增强操作

Toolbox Pro 提供了一批与提醒事项 app 相关的增强操作,有:

  • Create Reminder:创建提醒事项,比原生操作多了「优先级」参数。
  • Create Reminder List:创建提醒事项列表,原生操作没有的功能,并且支持选择颜色。1 
  • Edit Reminder:编辑提醒事项,原生操作没有的功能,支持标记为已完成、删除、更改时间、更改列表、修改备注等参数。
  • Get Reminder Lists:获取提醒事项列表,配合「Edit Reminder」操作使用。
  • Get Reminder UUID:获取提醒事项 UUID,配合「Edit Reminder 」操作使用。

前两个操作都可以看作原生操作的进化版,提供了更多的参数和功能,方便我们批量创建新任务。

提醒事项操作和原生操作的对比

后三个操作则是快捷指令原先做不到的功能,尤其是「Edit Reminder」操作,可以对单个提醒事项实现批量编辑。Toolbox Pro 官方库里刚好提供了一个例子,用后面这几个操作实现了批量推迟任务的功能,我们可以结合这个例子来理解后三项操作。

下载「批量推迟提醒事项」快捷指令

这个快捷指令的操作流程是:选择提醒事项列表 → 选择想要推迟的提醒事项(任务)→ 输入推迟日期和时间(比如「明天晚上 8 点」)→ 运行完成

批量推迟任务

我们主要看一下这个快捷指令的最后一部分:

「批量推迟任务」快捷指令的最后一部分

「Edit Reminder」操作默认只能对单个提醒事项进行编辑,为了实现批量编辑,这里用到了「重复」操作,对开头选中的每个提醒事项进行重复。然后,再通过开头第一步「Get Reminder Lists」操作获取的提醒事项列表名称(是的,原生操作居然不支持获取列表名称)、以及结尾「Get Reminder UUID」操作获取的 UUID(通用唯一识别码),实现批量推迟任务。如果你是提醒事项 app 的重度用户,相信 Toolbox Pro 的这些配套操作将会帮助你在任务管理自动化中更进一步。

除了提醒事项相关的增强操作,Toolbox Pro 还提供了一些其它的增强操作。比如「Perform Calculation 」就是一个支持多步骤计算的操作,原生的「计算」操作只能计算一步:

「Perform Calculation」操作和原生操作对比

「Get Dictionary Values 」操作比原生的「获取词典值」多了过滤选项,「Edit Dictionary 」操作则提供了删除、合并词典的功能。

「Get Dictionary Values 」操作、「Edit Dictionary 」操作、原生「获取词典值」操作

2. 简化操作

快捷指令虽然已经足够简单,但有些功能实现起来还是略显麻烦。比如匹配文本的时候,经常要用到正则表达式;又比如获得一个列表,要去掉里面重复的数据,也不是一两步操作就能搞定的事。Toolbox Pro 对快捷指令操作的简化,主要就体现在这两方面:算法简化逻辑简化

我们来看例子,先是算法简化类:我写作时经常会参考过往的 Power+ 文章——尤其是奏折,这是一个宝贵的资料库——当我回过头去看这些文章时,常常会觉得某段话有更优的写法,或者发现里面的一些小错误,因此需要从少数派后台打开这篇文章修改。

传统的做法是:从后台长长的文章列表里,找到这篇文章。如果文章不在列表顶部的话,这种方法会很低效。

稍微聪明一点的做法是:选中浏览器地址栏,复制文章的数字 ID,到后台随便打开一篇文章,然后替换掉这篇文章的数字 ID,就能跳转到想要编辑的文章。不过,通过我的文字描述你应该也能感受到,这种方法操作起来也略显繁琐。

自动化的做法是:做一个快捷指令,自动匹配链接中的数字 ID,然后改成少数派后台的链接格式,再自动打开。

下载「sspai 后台」快捷指令

打开少数派后台的快捷指令

到这一步,整个操作流程其实已经足够简单了,我只需要点一下 Safari 的共享表单,选中这个快捷指令,剩下的事交给快捷指令自己去解决就行。但是,这种方法有一个障碍——需要会用正则表达式。虽然我一直强调正则表达式很简单,需要用到的时候再去网上查语法就好,但作为一种看起来就很像代码的算法,难免会让一些不愿「折腾」的用户产生抵触情绪。

用于匹配数字 ID 的正则表达式

而 Toolbox Pro ,则再度简化了这个流程:

用「Quick Match Text」操作实现的版本

上面这张图的是通过「Quick Match Text」操作实现的版本,它的意思是:匹配 post/ 之后的字符。可以看出它的实现方法很接近自然语言,除了「after」参数之外,还有「before」和「between」参数可以选择。

下载「sspai 后台(简化版)」快捷指令

类似的算法简化操作还有:

  • Trim Text:删减首尾文字。
  • Get Detail From Text:提取人名、地名、文本语言等内容(不支持中文)。
  • Remove Emoji:去除文本中的 emoji。

逻辑简化类的操作,我们则以「去重」作为例子。在 Hum 的捷径教程群中,曾有读者提出过这么一个问题:

想请教下,如何合并重复数值?

比如:有「1,2,2,3,4,4」,想要匹配「1,2,3,4」,该如何做?

需求虽然简单,但在快捷指令里实现起来却没那么容易。而且,一旦我们实现了这个需求,还能将它的核心思路——去重——用到其它类似的场景上,比如我们可能经常会遇到,比如摘抄时匹配到重复的文本、筛选日历时匹配到重复的事件、扒网页时匹配到重复的链接……

Hum 针对这位读者的需求,做了一个带有逻辑讲解的去重快捷指令:下载「去重」快捷指令

这个快捷指令一共有 16 步(其中包括 5 步注释讲解)。方法很进阶,用到了「空变量」「拆分」「重复」「判断」等逻辑的嵌套。如果没有里面的注释讲解,可能一般读者都不能立刻明白每个操作的作用。

「去重」快捷指令的完整逻辑

现在,我们再对比一下用 Toolbox Pro 实现的版本:下载「去重(Toolbox Pro)」快捷指令

Toolbox Pro 实现的「去重」快捷指令

是不是非常简单!去掉 Hum 添加的 5 步注释,整个快捷指令从 11 步精简到了 4 步。如果你在一些比较大型的快捷指令中用到去重逻辑,那么 Toolbox Pro 的这个操作就可以帮你节省大量的步骤,编辑起来也更轻松。

类似的逻辑算法操作还有:

  • Edit List:用图形化的界面对列表进行手动排序和删减。
  • Filter List:对列表进行过滤。
  • Reverse List Order:颠倒列表排序。
  • Sort List:让列表按照正序或反序排列。

3. 系统 API

快捷指令的更新模式之一,就是将 iOS 系统提供的 API 封装成一个个的操作,然后交给用户去组装。每年 iOS 系统出了什么新的 API,快捷指令直接往里面加就好了,曾经我是这么想当然的。但后来我发现,快捷指令并没有把所有的系统 API 都加到应用里,可能他们没注意到用户在这方面的需求,又或者他们不认为所有 API 都对用户有用……但不管怎样,当我们在制作快捷指令时发现某个系统功能不提供时,难免会受挫。

Toolbox Pro 的第 3 类操作,则是对系统 API 进行查漏补缺——把快捷指令没用到的系统 API,做成操作。

这类操作,有一大批都是跟设备/系统信息相关的:

  • 检测设备/系统状态:

    • Get Battery Status:检测电池是否在充电、是否处于低电量模式。
    • Get Connection Status:检测设备是否联网。
    • Is Audio Playing:检测是否有音频播放。
    • Is Dark Mode On:检测是否开启深色模式。
  • 获取设备/系统信息:

    • Get Device Details (Extended):获取设备内存、屏幕尺寸、屏幕像素、屏幕比例等信息。
    • Get Device Languages:获取系统语言。
    • Get Device Storage:获取设备剩余、已使用、总储存空间。
    • Get Device Motion:获取当前运动状态。

其中,检测设备/系统状态的操作可以作为场景辅助判断,比如我在《用 NFC 标签配合快捷指令实现场景自动化》这篇文章里写过一个「汽车模式」的例子,当我用手机扫描汽车内的 NFC 标签、或者连接到车载蓝牙时,就自动播放播客,然后打开地图应用。由于深圳常常堵车,所以驾驶时间会比较长,再加上手机处于导航 + 音频播放状态,耗电速度也会加快。因此我们可以在这个场景中,加入一个「手机是否在充电」的判断,提醒自己为手机充电。

下载「汽车模式(充电判断)」快捷指令

充电判断

获取设备/系统信息的操作,Toolbox Pro 则给我们提供了一个很全面的例子,疯狂读取设备/系统的各种信息,然后生成一份设备报告:

下载「设备报告」快捷指令

设备报告

设备/系统信息之外,则是一些比较独立的新功能。我挑了几个比较实用的作为例子跟大家讲解:

  • Get Sound:获取系统提示音。可以在运行快捷指令时播放不同的声音,运行成功时播放一种声音,运行失败时播放一种声音。下载「成功/失败提示音」快捷指令

    「成功/失败提示音」快捷指令
  • Get Text From Images:Minja 曾在第 41 期奏折第 43 期奏折报道过 Notability 和 GoodNotes 使用系统 API 实现离线 OCR 的功能。果然 Toolbox Pro 也提供了相应的功能,可以离线扫描照片,并提取文字放到剪贴板中。不过需要注意的是,Toolbox Pro 中的 OCR 功能并不支持中文,但系统 OCR API 确实是支持中文的,我猜可能是开发者勾漏了某个选项 😂。下载「Scan Text」快捷指令

    「Scan Text」快捷指令
  • Scan NFC:这个操作可用于读写 NFC 标签,写入功能目前仅支持文本信息。下载「NFC Scanner」快捷指令

    「NFC Scanner」快捷指令
  • Filter Images:批量给照片添加模糊、黑白、像素化、褪色等滤镜效果。下载「批量滤镜」快捷指令

    「批量滤镜」快捷指令
  • 其它:用机器学习做人脸识别(Detect Faces)、物体识别(Recognise Objects in Image)、生成热点图(Create Interest Heatmap);调用 SF Symbols 创建图标(Create Icon);获取更详细的地点信息(Get Details Of Locations (Extended))等。

4. 网络 API

网络 API,如果快捷指令没有帮我们内置的话,应该是最难搞定的一类操作。比如我们平时在用的 Toggl API、Trello API、Airtable API 等,它需要你懂点 HTTP 知识,还需要你会看 API 文档,最后还需要知道如何调用。

调用网络 API 的过程

如果快捷指令帮我们内置好了网络 API,那么使用起来就非常简单。比如 App Store 和 Apple Music 相关的操作,就是由快捷指令打包好的。我们的操作流程完全不需要涉及到 URL,也不需要查阅 API 文档,直接通过图形界面调用就行。

快捷指令内置的网络 API 操作

Toolbox Pro 也为我们带来了几个新的第三方网络 API,包括音乐链接分享服务 SongLink、影视数据库网站 TMDb、游戏数据库 IGDB 等。

官方库中有一个示例动作「Share Music Link」,可以用于获取专辑封面,或者转换成其它音乐服务的链接,比如从 Apple Music 转换成 Spotify、Tidal、YouTube 等。

下载「Share Music Link」快捷指令

「Share Music Link」快捷指令

「Find Movies」和「Get Movie Details」这两个操作则可以配合获取电影的封面、摘要、上映日期、评分等信息(仅支持英文)。

下载「电影封面」快捷指令

不过 Toolbox Pro 在这两个操作的简介页里注明了使用的 TMDb API 是未经过验证的,我在用过几次后也发现自己的 IP 被 TMDb 屏蔽了,后来再也没有运行成功过。

「获取电影封面」快捷指令(API 似乎被屏蔽)

游戏相关的操作也是类似的,可以通过游戏数据库 IGDB 获取游戏封面、截图、简介、评分、发布日期、平台等信息。

5. 特色功能

最后一类操作,是 Toolbox Pro 的特色功能,有全局变量、图形菜单、图片编辑、美化 JSON 等。

我们先来看全局变量(Global Variables),变量在 Toolbox Pro 应用底部就有一个显眼的入口:

Toolbox 的变量功能

快捷指令原生就有变量功能,但快捷指令的变量是临时的,只会在运行的过程中保存,等动作运行结束后,变量里的数据就会被系统删掉。相比之下,Toolbox Pro 提供的是全局变量,变量里的数据会被加密保存在 Toolbox Pro 应用内,除非你主动删除,否则变量里的数据不会消失。

那 Toolbox Pro 的全局变量可以用来做什么呢?我举两个实例给大家参考:

第一个例子是用来判断状态。比如在《快捷指令的全局启动器:辅助触控》这篇文章里,我提到一个用快捷指令来开启 Toggl 计时器的流程(根据 Hum 提供的快捷指令修改的)。当我准备开始阅读 RSS 时,就运行这个快捷指令,它会通过 Toggl 的 API 打开「读 RSS」计时器,然后再跳转到 RSS 应用里阅读。但是我在运行这个快捷指令之前,很可能后台正运行着其它的计时器,所以我需要一步「检查 Toggl 运行情况」的步骤。因此,我用 Toolbox Pro 的全局变量做了一个判断的步骤。

首先到 Toolbox Pro 应用内,创建一个名为「Toggl Status」的变量,并将数据填为「0」,表示没有正在运行的计时器:

创建「Toggl Status」变量

然后,到「读 RSS」快捷指令的开头,添加「Global Variables」操作,并获取刚才创建的「Toggl Status」变量的值。接着,判断这个值是否为「1」,如果是「1」,则弹出「有 ⏲ 正在运行,是否继续?」的通知,并停止运行快捷指令;如果不是,则将它的值设为「1」,表示有计时器正在运行,再继续运行快捷指令。

阅读 RSS 前的判断步骤

当我阅读结束后,再运行「Stop Toggl」这个快捷指令,结尾处同样添加「Global Variables」操作,将「Toggl Status」变量的值设为「0」,表示没有正在运行的计时器。

阅读 RSS 结束后再修改变量值

第二个例子是用来管理剪贴板。首先到 Toolbox Pro 应用里创建一个名为「Clipboard+」的变量,并将内容清空。

创建「Clipboard+」变量

然后制作三个快捷指令:

  • 一个是保存剪贴板,将剪贴板内容以 "剪贴板": "当前日期" 的格式存进「Clipboard+」变量。下载「+剪贴板」快捷指令

    保存剪贴板
  • 一个是获取剪贴板历史,从「Clipboard+」变量里将数据拿出来,并以词典的格式呈现,让你选择要复制哪一项。下载「剪贴板历史」快捷指令

    获取剪贴板历史
  • 最后一个是清空剪贴板历史,当你觉得「Clipboard+」变量里储存的数据太多时,可以用这个操作将它清空,避免运行时占用过多内存。下载「清空剪贴板历史」快捷指令

    清空剪贴板历史

到此,一个简单的剪贴板管理工具就制作完成了。需要注意的是,Toolbox Pro 的变量目前只能储存文本、数字、布尔值、JSON,如果需要保存图片的话可以通过「Base64编码」操作将图片编码后再存进去。


说完了全局变量,我们再来看图形菜单、图片编辑、美化 JSON 这几项特色功能。

图形菜单:「Create Menu Item」操作可以用来创建更好看的菜单,带有图标、颜色、副标题等元素,相比之下快捷指令自带的菜单操作只能创建纯文字。

图形菜单和原生菜单对比

不过我觉得图形菜单的创建过程太过繁琐,需要反复添加操作,反而会让整个快捷指令变得更臃肿。而且在 iOS 13.2.3 中,快捷指令存在一个无法修改变量类型的 bug,而「Create Menu Item」操作需要我们将变量类型改为「联系人」,才能输出图标等元素。因此我觉得这项操作的实用性还不是很高。

图片编辑:Toolbox Pro 带了好几个和图片编辑相关的操作。比如「Manually Crop Image」可以打开一个图形化的编辑工具,用来剪裁和旋转照片。

「Crop Image Manually」操作

「Get Colours From Image」操作是用来从照片上获取颜色,「Create Solid Matte」操作是用来创建纯色图片,这两个操作结合到一起,可以用来给照片添加纯色底的边框:

下载「照片加框」快捷指令

结合「Get Colours From Image」和「Create Solid Matte」操作给照片加框

美化 JSON:如果你经常制作网络 API 相关的快捷指令,肯定碰到过缩成一团的 JSON 文本。「Pretty Print Dictionaries」这个操作则可以用来美化 JSON,让 JSON 更易读一些:

用「Pretty Print Dictionaries」操作美化 JSON

类似的推荐还有网页工具 JSONFormatter、以及显示效果更好的 iOS 应用 Jayson

Toolbox Pro 的意义

Toolbox Pro 之所以能打入快捷指令内部,成为一款「插件式」的工具,是因为它利用了快捷指令可以调用其它应用功能的新特性。

iOS 13 之前,当时快捷指令还叫「捷径」,它只能运行、显示 app 的部分功能,但不能对其进行输入输出。比如过去用 Drafts 只能显示预设的草稿内容,不能临时对内容进行修改,或者发送到其它应用里。

但是 iOS 13 之后的快捷指令,已经可以让 app 的操作在快捷指令里输入输出了。也就是说,可以临时输入一段文字,添加到 Drafts 的草稿里——比如「旅行打包清单」——然后再将修改后的草稿内容发送给朋友。

下载「旅行打包清单」快捷指令

可以输入和输出数据

当这个改变发生以后,大多数有专向功能的应用,比如 DraftsUlyssesFantasticalMindNodePCalcCARROT Weather 等都对其进行了适配。但是因为它们都是专向功能的应用(Drafts 是笔记本、Ulysses 是写作、Fantastical 是日历、MindNode 是思维导图、PCalc 是计算器、CARROT Weather 是天气),它们的操作也都是专向功能的操作。

Toolbox 是第一个以通用思路对待这个变化的工具。它再一次成为了典型的自动化工具——自己什么功能也没有(或并不起眼),但当它利用系统特性,并和其它工具结合,便产生无法替代的作用,做到此前没有任何一个工具单独可以做到的事。

快捷指令融入系统之后将 iOS 的自动化带入了一个新的领域——模块化的领域,而 Toolbox 是第一款将模块化的可能性通用化的应用。

期待

Toolbox Pro 并不是一锤子买卖(即使是一锤子买卖也已经比较划算了,内购 40 元解锁所有功能),作者在应用简介页承诺了还有大量功能正在开发,后续我们可以期待看到更多的用法出现。比如打包更多的第三方 API(Toggl、Todoist、Trello 等)提供给快捷指令,毕竟谁也不愿意总是翻看这些写得密密麻麻的 API 文档,有图形化界面可以直接操作还是更舒服。

Toolbox Pro 的出现也让我看到了快捷指令的变化——从一款提供功能的工具,变成了一个提供工具的平台,大家都可以围绕着快捷指令开发第三方操作,和快捷指令一起组成一套强大、灵活的自动化工具。Toolbox Pro 既展现了自己的潜力,也为我们展现了快捷指令,乃至 iOS 自动化的潜力。

致谢

感谢 Hum 提供了本文的写作思路,包括对 Toolbox Pro 操作进行分类的结构,以及对「Toolbox Pro 是通用思路」这一观点的指出。

本文的题图也致敬了 Hum 在《捷径教程》中用到的机器人形象。