看完上一节之后,我们对 URL Schemes 应该已经有了从整体到局部的认识了。现在我们来拼上最后一块拼图——x-callback-URL。
首先我们来整体地理解一下 x-callback-URL。
一般来说,一段 URL Schemes 只有一个目的,比如打开一个应用、打开一个应用的界面,或者是打开界面后填充一些内容。当应用成功跳转完成后就会停留在跳转后的应用界面,这一段 URL 的使命就完成了。
但这对「自动化」这个概念做得就很不到位,因为自动化一般要串联很多步骤,而能够让 URL Schemes 串联多个步骤的,就是 x-callback-URL。有了 x-callback-URL 之后,一段 URL 可以在做完一件事后,再做另一件事。
x-callback-URL 在 URL 结构中对应的位置
x-callback-URL 其实也服从 《入门 iOS 自动化:读懂 URL Schemes》这篇文章中对 URL Schemes 结构的划分。在这篇文章里,我们把文档的结构划为了下面 4 个部分:
- Scheme(链街头):用来启动应用。
- Action(动作):用来指明干什么。
- Parameter(参数): 用来指明干哪一部分。
- Value(值):用来指明把哪一部分干成什么样。
还是看 Things 的这段 URL:things:///show?id=today
Action 是 show
,说明要「展示(show)」。那么展示谁?或者说根据什么展示?Things 的 URL 告诉我们,根据 id
展示。展示哪个 id
?展示 today
这个 ID 的界面。
而 x-callback-URL 的元素,在这个 URL 结构中主要对应两个位置:
第一个是链接头后面的 x-callback-url
,比如 Launch Center Pro 的 launch://x-callback-url/
,Drafts 的 drafts5://x-callback-url/
。
理论上,在这个位置加上 x-callback-URL
算是一个声明,告诉系统和应用现在要用 x-callback-URL 了。但是这只是 x-callback-URL 创始人建议的方案,在原理上,一个应用完全可以不这么做也实现 x-callback-URL,同时也可以在 URL 中加上 x-callback-URL 却不做任何跳转。因此,我们实际使用中会发现这些情况:
- Drafts 的这段 URL
drafts5://x-callback-url/create?text=Hello%20World
不会继续做任何跳转; - 欧陆词典的这段 URL
eudic://dict/Hello?jumpback=Safari:
在查完「Hello」这个单词后可以跳转到 Safari。
也就是说,x-callback-URL
所占的这个位置并不绝对,要根据文档来判断。
而与之对应的,x-callback-URL 这个方案真正流传出来的,并且基本上被行业通用的,是它在 URL 结构中的参数部分。
x-callback-URL 的参数以及其对应的位置
还是拿 Things 的这一段 URL 来看 things:///show?id=today
,我们已经知道它的参数部分是 id
。从这条 URL 来看,URL Schemes 的参数部分的位置特征是——一般在问号(?)后面,等号(=)前面。
除此之外,URL Schemes 的参数部分还有个重要特征是:它是由开发者自身决定的,比如 OmniFocus 里表示任务名的参数是 name
,Things 里表示任务名的参数是 title
。
而 x-callback-URL 厉害的地方就在于,虽然参数是每个开发者自己制定的,但大家在用到 x-callback-URL 的时候都要按照 x-callback-URL 的规则来写参数。这些参数分别是:
x-success
,表示前一个 URL 成功以后下一步做什么x-error
,表示前一个 URL 失败以后下一步做什么x-cancel
,表示取消前一个 URL 的操作结果后下一步做什么x-source
,现在已经基本不用1
因为它们是参数,所以它们的位置一般是在问号(?)之后,等号(=)前面。又因为一段 URL Schemes 中,参数不一定是一个,比如 OmniFocus 的这段 OmniFocus:///add?name=任务名¬e=备注
,所以参数之间也可以通过 &
相连。
这就让 x-callback-URL 的实现成为了可能。因为一段 URL Schemes 最后都会以参数或者赋予参数的值结尾,比如我们见过好几次的这段 Things 的 URL Schemes things:///show?id=today
,它就是以值结的尾。那么我们想要做完这件事后再做下一件事,比如打开捷径,就可以利用参数可以为多的特点,直接在后面加上 &x-success=shortcuts:
。这时候整段 URL 拼起来就是 things:///show?id=today&x-success=shortcuts:
。
一般来说,我们用到的最多的,就是 x-success
。像 x-error
和 x-cancel
,已经没有太多第三方开发者支持它们了,它们的使用场景基本上也纯粹是为了提升「体验」而存在。举个例子,比如我们习惯经常查看某个 Twitter 的列表2 ,而因为某个原因,比如说没用梯子,没网,或者我删除了这个列表但忘记了,导致这个列表无法查看了。这时候就会出现错误画面,也就是 error。只有在这种时候,x-error
才会有用……而且它还只能按照预定的 URL 接着跳转到下一个应用或者界面,但这实在太机械了,设计不好不光不能省操作还得加操作。
所以在使用 x-callback-URL 的时候,大家只要记得,直接在后面加 &x-success=你想做的事的 URL
就可以。如果报错,那么多半是因为这个应用需要把 x-callback-URL
加到链接头后面的三条斜线之间,就像 OmniFocus 这样 omnifocus://x-callback-url/add?name=任务名¬e=备注
,到时候按照文档修改一下即可。
在捷径里,如果我们想懒省事儿,不手动输入 &x-success=
这些内容,可以使用「打开 X-Callback URL」这个操作,它默认的情况是:当运行成功后返回捷径。你还可以对 &x-success=
后面的内容进行自定义,只要把「自定 X-Success URL」后的开关打开,在里面填上你想要实现的功能的 URL 即可:
x-callback-URL 的意义
说实在的,要说什么比 URL Schemes 更凉,那就只有 x-callback-URL 了。尽管如此,x-callback-URL 还是有两个比较便捷甚至是无可替代之处:
- 运行 URL Schemes 后返回主屏幕
- 运行 URL Schemes 后返回唯一标识符
返回主屏幕这个需求,大家太喜欢问了,在此统一回答。
iOS 在不越狱的情况下是不能做到通过 URL Schemes 直接返回主屏幕的,如果想要通过 URL Schemes 返回主屏幕还不想(能)越狱,那么只有用一些间接的办法3 。
这个间接的办法就是使用那些有返回主屏幕功能的应用的 URL 来实现这件事,也就是说为了实现这个功能你手机里要多下一个应用。在能够做到这件事的应用里,Launcher 名气比较大,也是免费的,而且应该是最先开发出这个手段的应用。
Launcher 返回主屏幕的 URL 有两个:
- 崩溃返回:launcher://crash
- 动画返回:launcher://homescreen
崩溃返回的效果是先跳转到 Launcher,然后 Launcher 闪退;动画返回的效果是先跳转到 Launcher,然后再正常回到主屏幕,有缩放的效果。手机上有 Launcher 的话,你可以试着点一下上面两个链接。
接下来我们来看另一个意义,这个意义其实才是最不可替代的,并且与捷径息息相关。那就是「运行 URL Schemes 后返回唯一标识符」。
唯一标识符我们在《18 利用捷径在 Ulysses 中收集资料》提到过。像是 Ulysses、Drafts、Bear、OmniFocus、Things 这些比较规范的笔记、任务管理工具,为了不让里面的笔记因为内容或者标题重合导致无法区别,都会为每一则信息(笔记或任务)赋予一个唯一的 ID,也就是它们的唯一标识符。
而这些工具在运行 x-callback-URL 之后,实际上都会「返回」这个唯一标识符。只不过我们大多数使用 x-callback-URL 的场景都不那么在乎它返回什么,同时也因为 URL Schemes 的限制,很多应用根本就没有估计到这一点,所以很多人没有意识到 x-callback-URL 在这方面的作用。
但是在捷径里,因为它是一个完整的输入输出流程,所以上一步的结果(输出)会作为下一步的输入继续提供价值。换句话说我们在捷径里可以把多个 x-callback-URL 组成的 URL Schemes 拼在一起,这个时候 x-callback-URL 传递唯一标识符的意义就体现了出来。
在《18 利用捷径在 Ulysses 中收集资料》里,我让 Ulysses:
- 先在「奏折」这个组里创建一条新笔记
- 跳转回捷径
- 再跳转回 Ulysses 为刚才那条笔记加上标签(关键词)
- 再跳转回捷径(也可以不返回)
这实际上是两个 x-callback-URL 式的 URL Schemes 的结合,这个结合能成立的关键,就是在 2 这个环节。通过 Ulysses 的 x-callback-URL 跳转回捷径时,它会返回刚刚生成的那条笔记的唯一标识符,这个唯一标识符进而作为 3 这一步的输入被利用了起来,才能做到为刚生成的笔记打标签。
很多人认为捷径抢了 URL Schemes 的饭碗,实际上并不是。从 x-callback-URL 这个角度来说,我们甚至可以说捷径是把 x-callback-URL 最不可替代的价值给挖掘了出来。
- 1x-source 的存在十分鸡肋,它本身的目的是提示使用者该 URL 下一个跳转的对象是谁,当时本身就没什么应用使用。在 iOS 11 加入了跳转提示后,这个功能几乎彻底被人遗忘了,连 x-callback-URL 的提出人之一 Drafts 开发者,也没有在 Drafts 的文档里再使用 x-source 了。
- 2这个技巧的详情见《Tweetbot 进阶技巧:通过 URL 直接进入列表》:https://sspai.com/post/38661
- 3而且这个方法很不雅,感觉很有可能被苹果取缔。