Matrix 精选

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。

文章代表作者个人观点,少数派仅对标题和排版略作修改。


前言

快捷指令,是 Apple 收购 Workflow 后为 iOS 设计的自动化工具。在中文社区另有一个更为人所知的名字:捷径。

在 iOS 12 上 Apple 发布了第三方应用的捷径接口,可以提供自定义的操作。但显然那是一个不成熟的版本:虽然第三方应用可以提供操作,却无法从捷径获取参数,也无法返回结果给下一个操作。

在当时,比较常见的做法是将参数写到剪贴板,第三方应用读取剪贴板,再把结果写回剪贴板,然后捷径再读取剪贴板。这样复杂的操作让第三方应用与捷径的配合成为了鸡肋,没有多少实用价值。

在 iOS 13 上 Apple 终于解决了这个问题,JSBox 为此做了诸多改进,因此我想通过这篇文章来介绍这些改进。

本文的受众是「快捷指令」用户和 JSBox 用户,了解如何更好地将两个软件结合在一起。对于我个人而言,「快捷指令」的强大在于可以快速地组合出一些功能,JSBox 的强大之处在于更灵活、底层、以及能够实现更好的用户交互。

关联阅读

所以,这篇文章就来研究一下 JSBox 和「快捷指令」如何取长补短,而不是互相取代。

JSBox 支持的「快捷指令」操作

目前在 iOS 13 上面,JSBox 为「快捷指令」提供了三个操作:

  • 运行 JavaScript:输入一段 JavaScript 代码,执行 JavaScript,输出一个字符串。
  • 运行 JSBox 脚本:输入脚本名称和一个可选参数,后台运行 JSBox 脚本,输出一个字符串。
  • 显示 JSBox 界面:输入脚本名称和一个可选参数,显示 JSBox 定义的用户界面,不输出结果。

下面,我将使用一些简单的例子介绍这几个动作。

运行 JavaScript

这个操作为「快捷指令」提供了直接运行 JavaScript 脚本的能力,在一些比较「高级」的快捷指令里面,你可能看过为了运行复杂逻辑而将 JavaScript 填写到一个网页,然后获取网页运行结果的做法,像是 这篇文章 里面介绍的那样。

我得承认这个做法的聪明之处,因为在「快捷指令」里面做一些复杂运算是一件很痛苦的事情,尤其是对于一些复杂的数学运算和逻辑运算。「快捷指令」并不能直接运行代码,通过网页来执行是非常巧妙的变通办法。但这个方法操作成本极高,你需要花费巨大的力气,而仅仅是为了在「快捷指令」里面执行一段 JavaScript。

如果通过 JSBox 提供的这个操作则非常容易,你可以直接构造一段 JavaScript 代码传递给 JSBox,然后直接获得运行结果。代码同步执行会直接将最后的值作为「快捷指令」的输出,如果需要异步执行脚本,可以使用 $intents.finish() 函数来将结果输出到下一个快捷指令操作。

通过「快捷指令」提供的模板字符串,我们可以轻松地用变量构造出 JavaScript,并传递给 JSBox 来执行:

运行 JavaScript

由于使用的是 JSBox 内置的 JavaScript 引擎(JavaScriptCore),不仅支持最新的语法,还支持 JSBox 提供的接口(文档)。这样能做到的事情就多了很多,甚至有些功能是「快捷指令」并未提供的,例如获取设备类型、实现递归和复杂的数学计算:

运行 JavaScript

此外,在下一个大版本里面,JSBox 将支持运行 Node.js,这个能力同样也会提供给「快捷指令」。

运行 JSBox 脚本

通过传入脚本名和参数来在后台运行 JSBox 脚本。脚本可以通过代码获取到「快捷指令」输入的参数,进行一顿操作之后,将结果输出给下一个「快捷指令」操作。可选的参数是一个「词典」类型,在「快捷指令」里面表现为一个键值对,而在 JSBox 脚本里面,则可以用 $context.query 获取到一个 JSON 数据:

调用 JSBox

脚本运行结束后,通过上面介绍过的 $intents.finish()  函数将结果字符串传递给下一个操作。

可以在结果里面填入一个 JSON 字符串,然后利用「快捷指令」的数据自动转换功能将其转换成一个词典,例如这样:

数据格式转换

通过这样的参数传递,在 iOS 13 的「快捷指令」里面,我们可以将支持「快捷指令」的第三方应用都串联起来,实现任意应用的互通。

显示 JSBox 界面

JSBox 提供了强大的界面接口,你可以轻松的用 JavaScript 实现出简洁、漂亮的用户界面,而这恰恰是「快捷指令」的一个弱项。

这个操作大体上和运行 JSBox 脚本的动作使用方式一样,也是通过脚本名和可选参数来启动。区别是在于这个操作是用来显示一个用户界面,这个界面是由 JSBox 脚本实现的。

例如下面这个例子,用 JSBox 改进在「快捷指令」和 Siri 页面的显示:

左:快捷指令,右:JSBox
左:快捷指令,右:JSBox

类似这种在 Siri 界面无法提供良好显示的「快捷指令」,通过 JSBox 可以更好地显示:

左:快捷指令,右:JSBox

实现上面两个例子用的代码也十分简单:

实现用的代码

实用案例:本地化

在「快捷指令」里面实际上是不好做本地化的,不方便为一个标签在不同语言下,提供不同的文本,但通过 JSBox 却可以轻易做到:

为「快捷指令」提供本地化文本

JSBox 通过判断当前设备的语言,返回给「快捷指令」不同的词典,然后「快捷指令」就可以通过键来读取本地化后的文本,从而实现「快捷指令」的本地化。

实用案例:数据库

「快捷指令」没有提供良好的持久化方案,目前常见的做法是将内容编码成文本后存在 iCloud 云盘,但通过 JSBox 你却可以在「快捷指令」里面使用数据库:

写入数据库
读取数据库

JSBox 的代码实现也很简单,甚至提供了可视化的数据库查看工具:

JSBox 代码和数据库浏览工具

考虑到篇幅限制,这个案例只展示了如何插入和查询一个简单的数据,但实际上 JSBox 对 SQLite 进行了完整的封装,能做的事情远不止于此。

使用「快捷指令」增强 JSBox

上面的话题基本上是围绕如何用 JSBox 增强「快捷指令」,而下面我们要讨论一个相反的话题:如何用「快捷指令」增强 JSBox。「快捷指令」作为第一方内置的应用,有很多第三方应用无法获得的超级入口,作为第三方应用,JSBox 尽可能地利用了这些接口,从而让以使用 JSBox 为主的用户可以更方便。

「快捷指令」自动化

其实在很久以前,JSBox 也提供了类似「快捷指令」自动化的功能,不过受限于第三方应用的限制,JSBox 只支持了:定时、定位、打开应用等几个简单的场景。在触发之后,JSBox 会发一个通知给用户,点击之后可以运行脚本。

虽然流程极为类似,但「快捷指令」拥有很多第三方应用无法实现的触发器。这里我就以我个人在使用的一个自动化操作为例,连接到 CarPlay 的时候,自动打开 JSBox 执行一个脚本(使用 JSBox 的 URL scheme):

「快捷指令」自动化

我在 CarPlay 的脚本里面实现了大量的逻辑,这些逻辑在「快捷指令」里面并非不能实现,只是实现起来极为复杂。目前我用的场景还不是很多,但我相信在之后的版本里面,「快捷指令」会提供更多触发选项,让自动化更实用。

辅助触控

在 iOS 系统设置里的「辅助功能 - 触控 - 辅助触控」选项里面,你可以设置 iPhone 屏幕上的辅助触控按钮(通俗讲法叫「小圆点」)。我们不在这里讨论这个辅助触控的设计意图是什么,仅聊聊辅助触控选项可以设置为「快捷指令」这件事。

是的,在 iOS 13 里面,辅助触控的选项不仅可以换成固定的那几个,还可以设置成任意的一个「快捷指令」:

辅助触控按钮

这样的话你就得到了屏幕漂浮起来的一个按钮,点击之后就可以运行一个「快捷指令」。如果希望更快,甚至可以将顶层菜单的内容删到只剩下一个,或者是将 3D Touch 的操作设置成一个「快捷指令」。

如果希望运行的是 JSBox 脚本呢?当然是利用上面提到的方法将 JSBox 的「快捷指令」操作塞进去啦,类似这样:

使用辅助触控

这个方案提供了一种极为有趣的交互方式,让小圆点的功能从理论上变成了无限可能。

共享表单

英文原文是 Share Sheet,「快捷指令」里面翻译成共享表单,指的是 iOS 系统提供的分享界面。可能很多人已经注意到了,在 iOS 13 上一个具体的「快捷指令」可以直接成为共享表单的一级选项:

共享表单选项

类似 JSBox 的第三方应用只能把自己的选项纳入应用图标下的二级选项,意味着要多一次点击。我们可以故技重施,利用「快捷指令」来调用 JSBox 从而把脚本变成一级选项:

在共享表单使用 JSBox

添加到主屏幕

包括 JSBox 在内的很多应用都提供了将某个功能添加到 iOS 主屏幕的功能,支付宝小程序也有类似的设计。这个功能的技术原理是添加一个网页书签到桌面,然后通过 URL Scheme 在网页上跳转到原生应用。

很不幸的是,在 iOS 13 上面这个功能坏掉了,所有类似的方案都不能正确地跳转(第一次打开书签能正常跳转,但是之后的跳转都不会成功)。

目前我还没有想到比较好的办法来为 JSBox 用户修复这个问题,这里先提供一个变通办法:

  • 在「快捷指令」内使用 URL scheme 跳转到 JSBox
  • 将这个快捷指令添加到桌面
添加 JSBox 脚本到桌面

由于 iOS 13 上面「快捷指令」的桌面图标功能使用起来非常快,不需要通过网页跳转(毕竟是「亲儿子」),所以这个做法实际上并没有比 iOS 12 效率低,只是添加过程稍微麻烦了一点。

总结

我个人认为,去年的「快捷指令」尚不能真正发挥多个应用整合的威力,而从今年开始,输入输出参数的支持让应用互通这件事变得更方便,我们也一定会看到更多有趣的实现。

JSBox 作为面向效率而生的应用,在之后也会提供更多与「快捷指令」互通的可能性,例如文件操作接口、打开应用执行等等。

希望这篇文章对「快捷指令」用户和 JSBox 用户能有一定的帮助,如果你有任何的看法或是建议,请通过下方的留言让我知道,感谢。

送码

在评论区说说你对于 JSBox 的建议和看法,你对于「快捷指令」+ JSBox 的搭配有没有不一样的玩法?开发者会在评论区选择 5 位读者送出 JSBox 兑换码一枚。



> 下载少数派 客户端、关注 少数派公众号 ,发现更多新酷应用 🆒

> 特惠、好用的硬件产品,尽在 少数派 sspai 官方店铺 🛒