# 聚合扫码，用一个 Shortcuts 动作统一常用软件的扫码入口

> 本文公开全文。

原文：https://utgd.net/article/20241

《赛博朋克2077》在中国发售时，曾揶揄中国玩家来自“最赛博朋克的国度”。此话固然是抖机灵，开发商可能在韩国或日本都说过类似的话，不过，低头看看我们每天在用的软件服务，“高技术，低生活”，或许不是玩笑——比如扫描二维码。

没有任何一种交互方式像扫码一样，能够在如此之短的时间内席卷整个中国市场；然而，一旦各家软件——微信、支付宝、各种快递软件、各种骑车软件、以及许多本地服务机构的客户端——都将扫码作为重要、甚至是唯一的操作入口，事情就变了味，原本（我怀着善意猜测）想方便人，现在却要在一堆软件中挑挑拣拣半天，反倒麻烦。若在排队，还耽误后面的人。

就此问题，有开发者尝试统一扫码入口，即只用一款软件扫码，再根据二维码内容跳转到对应软件，并继续调用目标软件扫码。这一思路非常聪明，开发者也足够细心，内置支持了微信、支付宝等常用软件——然而，现实中的商家却不配合，各类本地服务——例如小区物业、行政机构、实体店的微信小程序——基本不可能被收录；而软件暂不支持自定义，最终能够覆盖到的服务，着实有限。

当然，尝试前述软件时，理想情况下一气呵成的扫码流程让我难忘，稍加分析后，我试着用 Shortcuts 自制了一个聚合扫码动作，除了自动跳转这一核心功能外，重在可以自定义目标软件，几乎任何乖僻的服务都可兼容。

- Shortcuts 动作

- GitHub

## 使用简介

示例动作仅提供中国邮政和美团单车等常见微信小程序的二维码，扫描后会打开微信，并直接跳到扫一扫界面，继续扫描刚才的画面。听上去似乎并不高明，但实际非常快，几乎看不到中间的跳转过程，途中也不需要任何操作。至于如何自定义其他软件和服务，请阅读后一节。

迨 iOS 17 以后，任何 Shortcuts 动作均可安插于锁屏界面，届时此动作也更容易触及。事实上，我一直试着将锁屏界面打造成各种信息的捕捉器（Tools for Capture），向左滑动是相机界面，捕捉影像；扫描按钮，捕捉纸质文件；笔记按钮，捕捉一闪而过的念头……等 Shortcuts 也跻身其中，则能够快速捕捉的信息类型将大大拓展，扫描跳转，只是其中的小水花吧。

这种把指向真实世界的功能集合于一处的思路，十年前在 Google Nexus 手机上就很成熟了，Google 让镜头捕捉尽可能多的信息，照片、视频、文字、花卉、食品标签……当然，也有二维码。可一旦二维码成为交互的第一入口，第三方厂商就不太可能再让渡权利，或许只要二维码不死，用户就只能用各种奇技淫巧来回跳转。

## 原理简析

二维码所隐含的，大多是 URL 链接信息，而所谓的自动跳转，其实就是事先备好一份名单，遇到不同的 URL 就打开对应软件，有点像查通讯录。

但如何将这一系列步骤翻译为 Shortcuts 语言，答案却并不明显，传统思路是套用大量的 If 条件判断模块，从而区分种种情形，然而，世上的二维码千千万万，随便添加几个服务，Shortcuts 动作就会瓜瓞绵绵，最终冗长到你自己都不认识它。

所幸我们可以组合其他模块，显著简化 Shortcuts 步骤。在《给照片添加“徕卡风格水印”，兼谈 Shortcuts 中的字典》一文中，我介绍了词典（Dictionary）、循环（Repeat for each）和条件判断（If）模块的组合用法，它们可以实现常见编程语言中的 Case/Switch 功能，即针对不同情况，设置不同的后续操作，而不是不断嵌套 If。

不过，前文需要考虑的情景还不算多，用循环也感受不到明显的延迟，但二维码却不同，很可能有几十上百个服务，好在也不需要真的一一列入词典，只需列开头部分即可，比如中国邮政就只需要 https\://mini\.ems\.com\.cn，随后的内容并不影响应当打开哪个目标软件，但所涉项目还是过多。于是我调整了逻辑，直接用正则匹配（Match）模块，组合词典键（key）为关键词，判断所扫二维码的开头是什么，从而避开了效率相对低的循环模块。

其中的技术细节是，假设你有 https\://app1\.com、https\://app2\.com 和 https\://app3\.com 三个 URL 模板，均要打开微信扫码，则以正则表达式 https\://app1\\\.com\|https\://app1\\\.com\|https\://app1\\\.com，即可判断任何一个待测试 URL 是否应当跳到微信。其中 \| 表示逻辑或，可包罗种种情形，进而简化动作，免去重复添加模块。

上图中的词典步骤存储了可能会扫到的 URL 开头部分，以及对应软件扫描界面的 URL Scheme，注意它们显然不是一一对应，而是一个扫码 URL Scheme 接管多种 URL，例如在我的生活中，微信就接管了骑车、寄快递和去附近的烘焙店攒会员积分等多个功能。你可以扫码（用 iPhone 自带摄像头即可）获取生活中常遇到的二维码，取其前半部分填入词典中为键（key），再以对应软件的 URL Scheme 为值（value），自行拓展本动作的数据库。

下面是一些常用软件的扫码 URL Scheme，可供参考：

```
微信扫一扫：weixin://scanqrcode
支付宝扫码：alipayqr://platformapi/startapp?saId=10000007
知乎扫一扫：zhihu://codereader
美团扫一扫：imeituan://www.meituan.com/scanQRCode
```

惟需注意，为兼顾正则表达式和词典各自的特殊语法，二维码 URL 中的英文句号 \. 需要加上斜杠 \\，以将其转义，免得正则模块或词典模块以为其有特殊含义。仍以中国邮政小程序的 URL 模板为例，应写成 https\://mini\\\.ems\\\.com\\\.cn。

此外，本动作默认会保存扫码记录，如有需要可保留此功能，而在使用前，建议先确定您所需的数据存储位置，默认是 iCloud 中的 Shortcuts 文件夹。这一设计要归功于文章开头所提软件的开发者。

## 小结

诚然，选一下用什么软件扫码，绝非难事，但恰恰是这些平时隐而不见的摩擦力，在人状态不佳时就会无限放大，比如撞上阵雨，或者加班到深夜，甚至刚刚结束一场饭局……这些时候，人的精神状态通常不会太好，交互上的瑕疵就会迅速撕裂。

状态对使用者的影响难以预料，曾闻有人“手撕 ATM 机”，这事儿大概设计师要负一些责任；鄙人当然无意更无力解决社会问题，但若能消除或避开一些不合理的设计，减少一些摩擦力，起码会让人更舒服一些。扫码一事，自然也落入我的视野，遂有此文。

---

[前往标准阅读页](https://utgd.net/article/20241?audience=web)
