URL Scheme 精华
复杂 URL Schemes
掌握复杂 URL Schemes 你才算初步有了打造适应自己使用情境的自动化流程的能力。
具体来看,复杂 URL Schemes 有两种:
一种是直接打开某个应用的某个功能,
另一种是打开某个功能后直接填写预设的字符。
这同网页网址的原理也是类似的:
比如 Google Image 搜索的网址是:https://image.google.com
这就是在它的主网址(Google.com)的基础上做了修改的子网页的网址。而如果我们搜索一个词条,网址实际上是:http://images.google.com/images?q=关键字
iOS 上的 URL Schemes 同样遵循这个规则,比如你要打开 Fantastical 这个应用,这是一个基本 URL Schemes:Fantastical:
然后你想使用 URL Schemes 打开它的某个功能界面,比如直接打开 Fantastical 添加新事件的界面,那就需要这个界面的 URL Schemes:fantastical2://parse?sentence
如果你想事先填好事件是什么,定在什么时候进行,只要在原有的 URL 的基础上再加上事件的描述:fantastical2://parse?sentence=事件描述
就成为了一个更加实用的 URL Schemes,因为它不光直接让你进入了某个你需要的功能界面,还直接帮你填好了你需要的内容,而跳转到 Fantastical 以后,你需要的只是按一下完成。
有了这样的 URL Schemes,应用之间才可以互相地协作。比如说,当我们在 Mr. Reader 上看到一篇文章里面写了一个不错的软件的时候,我们可以利用 OmniFocus 的 URL Schemes 将文章名保存到任务名的部分,把链接保存到备注的部分。在 iOS 8 的 Share Sheet 出现之前,这是唯一在 App 间传输信息的方式。
复杂 URL Schemes 有一个特殊的用例是 Jumpback,字典类 App 用它的很多,比如欧路词典。传统的使用欧陆字典查询单词的 URL Schemes 是:eudic://dict/
想查的单词
在这个基础上,加上一句 Jumpback:eudic://dict/想查的单词?jumpback=指定
URL
就能够做到查完单词以后,按左上角或左下角的返回按钮,回到你想要回到的 App。我们用下面这个 URL Schemes 来详细说明这个用例:
eudic://dict/[clipboard]?jumpback=launch:
这段 URL,做到的是:先复制你不会的单词,然后打开 Launch Center Pro 启动这个动作,跳转到欧陆词典的该单词的释义页面,当你确定了意思以后,按返回按钮,回到 Launch Center Pro。
变形URL Schemes
变形 URL Schemes 是指一些应用利用了 URL Schemes 的规则和 iOS 系统的一些内置功能,来拓充复杂 URL Schemes,并使其中需要输入字符或参数的部分可以预设或输入后再跳转,进一步减少步骤。
单纯使用 URL Schemes 是无法利用 iOS 内的一些基本功能的,比如说,输入和剪切板,你用一下 iLauncher 这类的 App 你就知道,即便是复杂 URL Schemes,在跳转具体功能界面以外也是乏力的,因为你就算知道规则,也没办法每次都灵活地输入和调用剪切板,也就是无法应付任何变量,只能使用死的 URL。
所以有的应用就在 URL Schemes 的基础上,使用了一些方法来调用剪切板或给你一个输入框,做到先输入内容,然后 URL 的相应部分。
我们这里用 Launch Center Pro 来举几个简单的例子:
比如用 OmniFocus 的添加任务的复杂 URL Schemes:
OmniFocus:///add?name=
任务名
¬e=
备注
你看这里有两个变量——任务名和备注。如果你不能自己每次都做到输入这两个变量,那这条 URL 实际上没有意义,它只是会给你生成一个任务,任务名就叫做「任务名」这三个字,备注里填的就是「备注」这两个字。所以我们需要能够输入任务名和备注的内容,然后填写到 URL 的相应位置。
在 Launch Center Pro 里,输入框表示为[prompt],你只要在变量部分填入这个输入框的表述方式,就会在运行动作时出现输入框让你输入内容,所以我们可以把上面那个 URL 改为:
OmniFocus:///add?name=[prompt]¬e=[prompt]
这样在运行这个动作后,会先后出现两个输入框,第一个填进去的就是任务名,第二个填进去的就是备注。这样这个 URL 才对于使用者有了实际使用上的意义。
在 Launch Center Pro 里最后一条复制了的文本内容表示为[clipboard],当你想用欧陆词典直接搜索你刚才复制好了的不知道意思的单词的时候,就可以在 Launch Center Pro 里添加一个这样的动作:
eudic://dict/[clipboard]
这样每次打开这个动作就会直接跳转到那个单词的解释页面去。
Launch Center Pro 对复杂 URL 贡献比较大的一个思路是使用 list(列表)。在 iOS 这样只靠触控屏交互的图形界面上,「选择」比「输入」速度更快也更省事,尤其是对于那些你经常会输入的内容来说,从一个列表里选择它们要比每次都输入它们来得有效。比如说我们在使用 1Password 的时候,搜索某一些服务(如邮箱、Evernote、Dropbox 等)的频率要明显地比另一些更高,这时候,把我们搜索频率较高的服务列一个列表就比每次都输入它们更有效率,在 Launch Center Pro 中,在 1Password 里建立一个列表的 URL 是这样:
onepassword://search/[list|Google=Google|Dropbox=Dropbox|Weibo=Weibo|输入=[prompt]]
在这里简单说明一下这个 URL 的 List 部分:
[list|Google=Google|Dropbox=Dropbox|微博=Weibo|输入=[prompt]]
首先有一个中括号[],然后括号的最左边是 list 和一个分隔符 |,这三样元素声明了这是一个列表。然后是 Google=Google、微博=Weibo 等常用服务,等号左边,是显示在列表上的名称,而右边是填入 URL 的字符。最后一个 输入=[prompt],左边同样是列表上的名称,右边是前面提到的输入框。最后这一部分是列表中没有你想要搜索的项目的时候手动输入用的。
Launch Center Pro 的用法还有很多,对变形 URL Schemes 也有其它的贡献,包括文中提到的这些说明有些并不完整。除了 Launch Center Pro 以外,Drafts 等应用对变形 URL Schemes 也有自己的贡献,比如把 Drafts 中的一篇笔记的某一行或几行作为 URL 的元素安插在 URL 之中,也就是 [[line|n]] 这个 Tag 的用法等。但这篇文章的目的不是让大家完全掌握 Launch Center Pro 和 Drafts,而是全面了解 URL Schemes 的各种用法,所以在这里对这些效率应用的介绍都是点到为止。
x-callback-URL
第一次拓展 iOS 的自动化边界的创举,让你可以跳出去再跳回来,真正的可以串联多个步骤。
回到上一个操作的应用这件事对我们来说不新鲜,Windows 上同时按下 Alt + Tab 这个快捷键你大概不知道做了多少次了。iOS 9 也加入了这个功能:
从一个应用的界面跳转到了另一个应用后,就会在左上角看到回到上一个应用的字样,轻触就能返回到上一个应用。这样的事情我们在打造自己的自动化操作的时候毫无疑问也会想要做到,前面说过的 Jumpback 是一个选择,除此之外还有更强力的代替者——x-callback-URL,它还有 iOS 9 上「返回上个应用」这一功能不能代替的地方。但是不可否认的是,x-callback-URL 的使用情境比较少,使用难度却又比较高。
有了 x-callback-URL,我们就可以结合 Drafts 和 Fantastical 这样的应用里一次性添加多个事件;我们还可以结合 Due 跟墨客这样的应用做到提醒我们发微博,并直接把微博内容储存好,以便到时候可以一键发出去。
我们前面谈到的 URL Schemes 都只有一个目的,不管结果是什么,跳转完成后就会停留在跳转后的应用的界面。但在使用 URL Schemes 的时候,运行结果有时候可能成功(大多时候都成功啦,不然你做它干吗),有时候可能失败(比如你用墨客的 URL 搜索一个不存在的联系人),有时候我们也会手动将其取消(比如本来要添加个任务结果想想还是不添加了)。
如果我们还想让应用根据不同的结果有对应的反应,就要用到 x-callback-URL。比如当上一个 URL Schemes 运行成功以后,我是要回到跳转前的应用?还是要接另一个动作(接上另一段 URL Schemes,打开另一个应用的某个功能)?无论是跳转回上个应用还是打开另一个动作,只要你在运行完一个 URL Schemes 后还想再利用一段新的 URL Schemes 做下一件事,就要靠 x-callback-URL,它的固定语法是:
在一个 URL Schemes 后面接&x-success,表示前一个 URL 成功以后下一步做什么;
在一个 URL Schemes 后面接&x-error,表示前一个 URL 失败以后下一步做什么;
在一个 URL Schemes 后面接&x-cancel,表示取消前一个 URL 的操作结果后下一步做什么;
还有一个 &x-source 我们遇到了再说。
现在来举刚才提到的例子,x-callback-URL 的例子其实都非常复杂,做好心理准备:
用 Drafts 给 Fantastical 一次性添加多个事件
先回顾一下添加一个事件的复杂 URL Schemes:
Fantastical 支持自然语言识别,可以从一句话里提取事件的名称和时间,自动添加到默认日历中,这非常适合使用 URL Schemes 来把任务发送过去,因为你只要输入一句「我什么时候办啥事儿」(事件日期要照顾下英文语法,事件名称可以用中文),它就能帮你添加到默认的日历里:
fantastical2://parse?sentence=去银座换 iPhone on this sunday at 15
你可以把上一个 URL 通过 Launch Center Pro 激活,也可以把空格全都替换成%20以后直接填入 Safari 的地址栏:
fantastical2://parse?sentence=去银座换%20iPhone%20on%20this%20sunday%20at%2015
跳转以后 Fantastical 里就会生成一个任务——去银座换 iPhone,时间是本周日下午三点:
目前为止,实际上用的实际上还都是复杂 URL,具体到 Fantastical 这里,就是只能添加一个事件。但我们有时候并不只是加一个事件。比如,大学生在考试的时候时间不统一,每节课每个老师都会在自己的课上来公布自己这么课的考试时间,那么你可以把这些考试和时间先都记录在 Drafts 里,然后一并同时发到 Fantastical。
这个过程实际上是把多个发送事件到 Fantastical 的 URL 绑在了一起,做到一个运行成功以后运行下一个,直到运行完,实现这样的 URL 就只有 x-callback-URL 才可以,具体的 URL 可以说很复杂,是这样的:
fantastical2://x-callback-url/parse?sentence=[[line|1]]&add=1&x-success={{drafts4://x-callback-url/runAction?text=[[line|2..]]&allowEmpty=NO&action=Events%20in%20Fantastical-Quick}}&x-cancel={{drafts4://}}
不要被吓到,我们来逐条分析这段 URL 就能轻松读懂它:
fantastical2://x-callback-url/parse?sentence= 这一句,你会发现比我们刚才用的 fantastical2://parse?sentence= 多了一截儿 x-callback-url/,原因是,当一个 App 的 URL 里使用了多出来的这一段儿 x-callback-url/,就是在声明,「各单位注意,我下面的 URL 要用到 x-callback-URL 了。」
紧接着是 [[line|1]],这一段是 Drafts 的变形 URL,意味取文本中第一行的值。在这个动作中,我们看上面的截图,第一行是微积分考试那一条,那么就是把微积分这条先发到 Fantastical 里。
接下来我们要做的事是,把剩下几行也自动发到 Fantastical,并且在没有东西的时候自动停止动作。
所以我们接着来看下一个小部分add=1,这是 Fantastical 的语法,再加一项任务。
下一句的 &x-success= 就是 x-callback-URL 的标准声明了,即当上一步成功后,下一步做什么。
然后你会看到双层花括号{{ }}的出现。在 x-callback-URL 中[2],出现在 x-success 这些固定语法之后的双层花括号意味着花括号之中应当是一个完整的动作,这个动作在上一个动作成功/取消/错误后进行。
.....
URL Schemes 的衰败
苹果的各项改进一点点蚕蚀了 URL Schemes 的领域,但目前宣告 URL Schemes 死刑还为时尚早。
6s 之后的设备大概都会支持 3D Touch,它的特征之一就是从 Homescreen 的 App 图标上直接进入该 App 的具体某个功能了。这个功能也让很多人兴奋了一把,虽说会用 URL Schemes 的人早就做到类似的事了。不过,既然官方已经有了这样的功能,为什么还要用 URL Schemes?
同样,在 iOS 9 中,我们还可以用 Siri 建立关于 App 的提醒事项,来做到以前只有用 Launch Center Pro 和 Due 这样的 App 才能做到的定时打开 App。而且 iPhone 6s 还可以做到不在充电状态下使用 Hi, Siri 这样我们要建立一个提醒事项或者闹铃也无比简单,只要说一声「Hi, Siri. 半小时以后叫我。」就能定一个计时器。在这种比较之下 Due 这样的 App 的作用显然是被大大地削弱了。除此之外还有通知中心部件,Sharesheet 的出现都在一定程度上代替了 URL Schemes 的作用,削弱了其价值。 但按照目前的状态,充其量只能说 URL Schemes 在衰败,还远不能宣判其死刑。
3D Touch 和 URL Schemes 重复的地方只有一部分复杂 URL Schemes 的功能:一些复杂 URL Schemes 的功能 3D Touch 没有涵盖,反过来 3D Touch 也有一些可以做到的事通过复杂 URL Schemes 做不到。但在复杂 URL Schemes 之上的变形 URL Schemes 跟 x-callback-URL 都是 3D Touch 无法做到的。
Siri 确实非常好用,我每天都用它很多次。所以我知道,如果不戴耳机,它是通过扬声器跟你交流的,这种时候它听错了你说错了,都得来回矫情半天,周围有人的话场面会变得很尴尬。所以很多场合,通过 Due 的 URL Schemes,直接从 Dock 中的 Launch Center Pro 里找到一个 Timer 或添加一个提醒其实更舒服。
我承认 URL Schemes 如今已无往日辉煌,但它在 iOS 上的效率方面的作用能不能被完全替代,目前也未可知。
结语
用原生 iOS 的人分两种,懂 URL Schemes 的和不懂的。前者是魔法师,后者是麻瓜。
URL Schemes 目前仍是使用 iOS 设备提高效率的必要工具。效率有两件核心:减少时间浪费和在工作的时间集中注意力。通过 URL Schemes 完成的自动化动作同时做到了这两点:它减少操作步骤,从而减少时间浪费;避免在桌面和 App 内的层层寻找,直达功能,从而减少了干扰。
我最后想以一个故事结尾:
我有个朋友,他有节课,老师讲的快,板书来不及记,他就拍下来,下课抄下来整理。我有一次见他誊板书,发现他隔一会儿就碰一下屏幕。我问他你这是做什么,他回答说因为屏幕一会就会黑下来然后锁屏,碰屏幕一下就能再亮一会。我当场吐血,在设置里教他把自动锁屏的时间设为了「永不」。
他好像有点可笑,为什么,因为自带的这么简单的功能他竟然不知道!非要用手一下一下地碰来让设备保持解锁状态。那么,反过来想想自己。有的 App,你几乎每次用都是用它的那个功能那个界面,但你每次都是从主屏幕找到它,再点进去,再在一层一层的功能里选中它。这样的你,是不是在哪里跟我那位朋友有点儿像?