折腾 文章

为Apple快捷指令融入「修饰键」的思路

快捷指令是苹果开发的低代码程序构建工具,用于帮助没有计算语言基础的用户完成重复的日常工作。

快捷指令自推出解决了很多我的个人需求,不过作为低代码编程工具的一类,它仍然有很多不足,例如不能对应用程序的UI和流程进行精心的设计,为了照顾到尽可能完整的需求,我们可能会把一些大多数时候用不到的步骤微调作为选项加入到其中,导致每一次使用都要去多点击一些选项使得指令变得繁琐。

在我看来,从快捷指令的设计出发点来说,这些徒增的步骤本身就是最初的问题所在。

如果为微调的步骤再制作额外的快捷指令,对于重度用户来说,随着快捷指令库中的数量增长,诸多的指令难以管理不说,相似的指令在修改和维护的时候要逐个修改,更麻烦的是在某些不常用的指令真正要用到的时候却已经忘记它是否存在……

某一天晚上我突然想到了「修饰键」这一做法。在macOS中,某些应用程序或者右键菜单项在用户按住Option的时候会发生变化,比如系统界面左上角的Apple选项中的第一项「关于本机」在按住Option时会变成「系统信息…」,这种神秘的功能设计当然是桌面平台之所以能够优秀效率的一个关键特性。

那么如果在快捷指令中也能利用修饰键来引导到其他的程序分支呢?

因为是躺在床上想到的,所以先在iOS上尝试,本文会提到macOS的部分。

iOS怎么做?

在iOS中,实体按键只有那么几个,而且其实都蛮重要的,所以并不能把任何的实体按键作为快捷指令的「修饰键」。

传言iPhone 15开始会有额外的实体按键,但是苹果一开始肯定不会提供「查询按键状态」这样的快捷指令。这一推断的依据在本文后面会提到。

因此,我们只能使用其他的可查询的系统状态来作为「类修饰键」的一种操作作为一个替代方案,比如说轻敲背部三下启动一个快捷指令,其功能为修改手机中的某一个特定文件的内容,然后用另一个需要修饰功能的快捷指令在运行时第一个步骤就是查询该文件的状态,如果文件内容表现为已经受到前者快捷指令的修改,那么就将后者快捷指令引导向「修饰」分支,另外要在该快捷指令的结尾将前面提到的这个文件内容修改回初始状态作为一个「类修饰键」的状态重置。

建议这里的「修饰」指令中要加一个手机振动反馈作为触发成功的提示,并且还要加一个再次点击进行还原的操作,作为区分,在还原的时候最好能提供一个不同的反馈方式,比如说3次振动。
作为参考,这里提供一个快捷指令可以直接搬走用。
先用这个快捷指令来创建一个状态查询文件:建立状态查询文件
你可以在上一个指令运行时直接根据提示来安装开关指令,当然你可以手动安装:修饰键开关
随后,你可以在 「设置」App ➡️ 「辅助功能」 ➡️ 「触控」 ➡️ 「轻点背面」中设置该指令的触发条件,我的方案是振动一次代表状态切换为了1,振动两次代表切换为了0,当然你可以直接在每一个快捷指令的结尾调用它来反转状态。
可以根据下载如下指令作为零件在其他快捷指令中快速调用,结果会返回数字1或者0(这里注意不是布尔值)。修饰键状态

除此之外,还有一个方法是使用手机的陀螺仪朝向来作为「类修饰键」的状态触发条件。

这里需要一个App,在国区的AppStore中没有(有为x86和arm的macOS提供):

「Actions」 – AppStore

Actions是一个快捷指令的函数功能扩展,它可以为快捷指令补足一些实用的功能。其中有一个功能就是获取当前手机设备的朝向。

它具有两个和手机朝向有关的模块,一个是Is Device Orientation,需要预先设定你目标的朝向,并输出一个布尔,另一个则是直接输出你当前的朝向,以文本形式表现。如果使用这个方案,建议多尝试几种朝向在不同应用场景下的表现,我个人有每天起床前都会在床上看一会儿手机的坏习惯,所以除了PortraitUpside Down这一种状态,其他非正常朝向都有在躺着用手机的时候触发的可能性。并且众多App中只有「语音备忘录」支持在PortraitUpside Down朝向状态下的UI旋转适配。

「语音备忘录」之所以支持,是因为在PortraitUpside Down状态下,麦克风位于握持者视角中的所谓的手机顶部,便于对面向的人进行录制工作。

小结一下

根据我个人的理解,修饰键仅适用于对快捷指令有一定依赖性的重度需求,且对程序分支的需求属于较为偶然的情况下才会使用的,如果不满足上述两者条件,也许自己用菜单来进行程序分支的决策会更合适。

  • 对于非重度用户来说,未必能记得住自己的快捷指令的具体步骤,因此修饰键的使用可能会直接遗忘。
  • 对于使用率频率接近50%的分支,没有使用修饰键的必要。

另外,对于iPadOS用户来说各种使用方向都是有可能存在的,并且调转屏幕方向远比可单手握持的手机更麻烦,所以使用重力感应来实现「类修饰键」,显然是不可靠的。如果你有一台iPad,那么最好使用「获取设备详细信息」中的「设备型号」配合分支条件来调整一下跨平台使用的快捷指令中的修饰键判断条件。

好了,那Mac咋办?

macOS版「快捷指令」是在iOS版本推出后数年才推出的,在此之前的替代者是「自动操作」App,为了让曾经的「自动操作」用户可以无缝的迁移到「快捷指令」,macOS版「快捷指令」更是做到了向下兼容,因此在Mac中还提供了一些iOS无法使用的曾属于「自动操作」的操作模块。

此外,macOS版「快捷指令」相比iOS版本还提供了将快捷指令固定到菜单栏的功能设计,进一步的便于被启用。

而那些从「自动操作」中继承的这些模块在iOS版本的快捷指令中不能被搜索到,但在iCloud同步的快捷指令中是可以被看到的,会显示为「此操作只能在Mac上运行」,其中之典型就是「运行Apple Script」操作。

说回修饰键,「修饰键」是桌面平台的术语,所以最理想的方式当然是直接使用键盘上的修饰键来触发。但尽管macOS拥有远超iOS的硬件生态和系统功能自由度,强如Apple也没有直接提供查询键盘点击状态的模块(所以我相信iPhone15出现了新的实体按键后也不会提供这一判断操作模块)。因此我们不得已需要接触到「代码」,虽然我们不是专业的代码用户,但是我们可以拷贝他人的代码来使用,这里需要用到的正是前面提到的「运行Apple Script」操作。

关于Apple Script脚本,可以看看少数派的一些文章了解。

在macOS上的快捷指令中,会看到该操作模块的内容是一个文本块,可以直接输入Apple Script脚本。

假设我们需要获取的状态是option是否被按住,如果被按住,则会引导快捷指令走向另一个程序分支。做到这一步,我们需要使用如下代码:

use framework "Cocoa"
use scripting additions
set res to false
global ca
set ca to current application
to isModifierPressed(modifier)
    ((ca's NSEvent's modifierFlags()) / modifier as integer) mod 2 is equal to 1
end isModifierPressed
if isModifierPressed(ca's NSEventModifierFlagOption) then
    set res to true
end if
return res

如果希望使用的是control键或者command键,则修改第八行中的NSEventModifierFlagOption这一部分把「Option」换成Shift、Command、Control即可。

尝试运行,会看到这个指令只会返回布尔值,这样你就方便了。

要注意,在某些地方按住修饰键并点击快捷指令的时候,也许会触发某些系统功能而直接不会运行快捷指令。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注