Matrix 精选
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
前言
快捷指令,是 Apple 收购 Workflow 后为 iOS 设计的自动化工具。在中文社区另有一个更为人所知的名字:捷径。
在 iOS 12 上 Apple 发布了第三方应用的捷径接口,可以提供自定义的操作。但显然那是一个不成熟的版本:虽然第三方应用可以提供操作,却无法从捷径获取参数,也无法返回结果给下一个操作。
在当时,比较常见的做法是将参数写到剪贴板,第三方应用读取剪贴板,再把结果写回剪贴板,然后捷径再读取剪贴板。这样复杂的操作让第三方应用与捷径的配合成为了鸡肋,没有多少实用价值。
在 iOS 13 上 Apple 终于解决了这个问题,JSBox 为此做了诸多改进,因此我想通过这篇文章来介绍这些改进。
本文的受众是「快捷指令」用户和 JSBox 用户,了解如何更好地将两个软件结合在一起。对于我个人而言,「快捷指令」的强大在于可以快速地组合出一些功能,JSBox 的强大之处在于更灵活、底层、以及能够实现更好的用户交互。
关联阅读
- Pin 开发者新作,一款让你创造工具的效率工具:JSBox
- 无论编程新手还是工程师,希望他们都能用 JSBox 创造自己的工具丨幕后
- 「捷径」解读:iOS 自动化的 3.0 时代
- iOS 效率神器 Workflow 怎么用?跟着这篇入门指南从零开始
JSBox 支持的「快捷指令」操作
目前在 iOS 13 上面,JSBox 为「快捷指令」提供了三个操作:
- 运行 JavaScript:输入一段 JavaScript 代码,执行 JavaScript,输出一个字符串。
- 运行 JSBox 脚本:输入脚本名称和一个可选参数,后台运行 JSBox 脚本,输出一个字符串。
- 显示 JSBox 界面:输入脚本名称和一个可选参数,显示 JSBox 定义的用户界面,不输出结果。
下面,我将使用一些简单的例子介绍这几个动作。
运行 JavaScript
这个操作为「快捷指令」提供了直接运行 JavaScript 脚本的能力,在一些比较「高级」的快捷指令里面,你可能看过为了运行复杂逻辑而将 JavaScript 填写到一个网页,然后获取网页运行结果的做法,像是 这篇文章 里面介绍的那样。
我得承认这个做法的聪明之处,因为在「快捷指令」里面做一些复杂运算是一件很痛苦的事情,尤其是对于一些复杂的数学运算和逻辑运算。「快捷指令」并不能直接运行代码,通过网页来执行是非常巧妙的变通办法。但这个方法操作成本极高,你需要花费巨大的力气,而仅仅是为了在「快捷指令」里面执行一段 JavaScript。
如果通过 JSBox 提供的这个操作则非常容易,你可以直接构造一段 JavaScript 代码传递给 JSBox,然后直接获得运行结果。代码同步执行会直接将最后的值作为「快捷指令」的输出,如果需要异步执行脚本,可以使用 $intents.finish()
函数来将结果输出到下一个快捷指令操作。
通过「快捷指令」提供的模板字符串,我们可以轻松地用变量构造出 JavaScript,并传递给 JSBox 来执行:
由于使用的是 JSBox 内置的 JavaScript 引擎(JavaScriptCore),不仅支持最新的语法,还支持 JSBox 提供的接口(文档)。这样能做到的事情就多了很多,甚至有些功能是「快捷指令」并未提供的,例如获取设备类型、实现递归和复杂的数学计算:
此外,在下一个大版本里面,JSBox 将支持运行 Node.js,这个能力同样也会提供给「快捷指令」。
运行 JSBox 脚本
通过传入脚本名和参数来在后台运行 JSBox 脚本。脚本可以通过代码获取到「快捷指令」输入的参数,进行一顿操作之后,将结果输出给下一个「快捷指令」操作。可选的参数是一个「词典」类型,在「快捷指令」里面表现为一个键值对,而在 JSBox 脚本里面,则可以用 $context.query
获取到一个 JSON 数据:
脚本运行结束后,通过上面介绍过的 $intents.finish()
函数将结果字符串传递给下一个操作。
可以在结果里面填入一个 JSON 字符串,然后利用「快捷指令」的数据自动转换功能将其转换成一个词典,例如这样:
通过这样的参数传递,在 iOS 13 的「快捷指令」里面,我们可以将支持「快捷指令」的第三方应用都串联起来,实现任意应用的互通。
显示 JSBox 界面
JSBox 提供了强大的界面接口,你可以轻松的用 JavaScript 实现出简洁、漂亮的用户界面,而这恰恰是「快捷指令」的一个弱项。
这个操作大体上和运行 JSBox 脚本的动作使用方式一样,也是通过脚本名和可选参数来启动。区别是在于这个操作是用来显示一个用户界面,这个界面是由 JSBox 脚本实现的。
例如下面这个例子,用 JSBox 改进在「快捷指令」和 Siri 页面的显示:
类似这种在 Siri 界面无法提供良好显示的「快捷指令」,通过 JSBox 可以更好地显示:
实现上面两个例子用的代码也十分简单:
实用案例:本地化
在「快捷指令」里面实际上是不好做本地化的,不方便为一个标签在不同语言下,提供不同的文本,但通过 JSBox 却可以轻易做到:
JSBox 通过判断当前设备的语言,返回给「快捷指令」不同的词典,然后「快捷指令」就可以通过键来读取本地化后的文本,从而实现「快捷指令」的本地化。
实用案例:数据库
「快捷指令」没有提供良好的持久化方案,目前常见的做法是将内容编码成文本后存在 iCloud 云盘,但通过 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 在内的很多应用都提供了将某个功能添加到 iOS 主屏幕的功能,支付宝小程序也有类似的设计。这个功能的技术原理是添加一个网页书签到桌面,然后通过 URL Scheme 在网页上跳转到原生应用。
很不幸的是,在 iOS 13 上面这个功能坏掉了,所有类似的方案都不能正确地跳转(第一次打开书签能正常跳转,但是之后的跳转都不会成功)。
目前我还没有想到比较好的办法来为 JSBox 用户修复这个问题,这里先提供一个变通办法:
- 在「快捷指令」内使用 URL scheme 跳转到 JSBox
- 将这个快捷指令添加到桌面
由于 iOS 13 上面「快捷指令」的桌面图标功能使用起来非常快,不需要通过网页跳转(毕竟是「亲儿子」),所以这个做法实际上并没有比 iOS 12 效率低,只是添加过程稍微麻烦了一点。
总结
我个人认为,去年的「快捷指令」尚不能真正发挥多个应用整合的威力,而从今年开始,输入输出参数的支持让应用互通这件事变得更方便,我们也一定会看到更多有趣的实现。
JSBox 作为面向效率而生的应用,在之后也会提供更多与「快捷指令」互通的可能性,例如文件操作接口、打开应用执行等等。
希望这篇文章对「快捷指令」用户和 JSBox 用户能有一定的帮助,如果你有任何的看法或是建议,请通过下方的留言让我知道,感谢。
送码
在评论区说说你对于 JSBox 的建议和看法,你对于「快捷指令」+ JSBox 的搭配有没有不一样的玩法?开发者会在评论区选择 5 位读者送出 JSBox 兑换码一枚。
> 下载少数派 客户端、关注 少数派公众号 ,发现更多新酷应用 🆒
> 特惠、好用的硬件产品,尽在 少数派 sspai 官方店铺 🛒