对 URL Scheme 有一定了解的读者都能感受到它的便捷之处,但是在实际运用的时候很多人会遇到一个现实的问题:不知道某个软件的 URL Scheme 是什么。

最常见的解决办法就是直接上网搜索。但是搜索引擎也并非万能,总还是有一些比较难找到的 URL Scheme。以查询软件的 Info.plist 的办法来说,它只能查询到 scheme 头,没有任何可以使用的参数,URL Scheme 支持的功能只能局限于打开或者返回软件。

另一种情况是没有官方文档可供查询,这样的问题多见于国产软件,对国内非效率类型的 App 来说,支持 URL Scheme 是一件费力不讨好的事情。功能做强大了,却只有少部分用户会去使用;功能做少了,Power User 又不满足。在这样的背景条件下,会用心去打磨 URL Scheme 的开发者就屈指可数了。

所以本文将结合传统 URL Scheme 查询方法,以及新的网页 URL Scheme 查询法,共同讲解如何查询软件的 URL Scheme。

下图是一份 URL Scheme 查询思路,推荐三个方向入手去查询软件的 URL Scheme。三个方向依次是:网络搜索法、网页法、书签法

为方便读者直接使用,笔者整理了部分常见的生活类应用的 URL Scheme,有需要的可以直接 含参数的 URL Scheme 部分收集 查阅。

网络搜索查询

捷径社区

在网上有人整理了很多常用的 URL Scheme 可供查询,例如「捷径社区」只要输入软件名进行搜索,如果该软件有被收录即可查询到对应的 URL Scheme。

官方文档

大多的的效率类 App 都会有自己官方的 URL Scheme 文档库,在大多数的情况下只要在谷歌搜索:「软件名 + URL Scheme」即可在第一个结果就直接找到官方文档结果。

微信支持 URL Scheme 跳转吗?在大多数人的印象里微信支持的 URL Scheme 少之又少,最常用的也只有扫描二维码 (weixin://scanqrcode) 这么一个 URL Scheme。但是通过查阅 微信小程序的官方文档 可以知道其实企业的小程序也是支持外部 URL Scheme 跳转的,它的格式是:

weixin://dl/business/?t= *TICKET*

利用这样的 URL Scheme 可以利于企业推广自己的商品,例如在少数派文章里插入 PiStore 的商品链接,点击即可直接进入小程序的商品页面。但是缺点就是目前只对企业小程序开放,个人小程序无法使用该功能。

第三方文档

还有一些热心网友自己创建了 URL Scheme 整理表格,在 Hum《URL Schemes 使用详解》这篇文章下面看到读者 @张小刚 做了一份共同维护收集的表格,有兴趣的读者也可参考阅读:URL Scheme 分享

但是网络搜索法有一个问题,由于是纯人工记录,会受限于精力和时间的限制,无法保证 100% 查询到需要的 URL Scheme,于是就有了下面的 Launch Center Pro 查询法。它支持超过 100,000 种 App 的 URL Scheme 查询,足以对付多数的国外厂商开发的 App。

Launch Center Pro 查询

Launch Center Pro 是最简单的查询方法之一,可以直接给出构造好的 URL Scheme。

这里以 Bear 为例,点击右上角的编辑之后再点击任意加号,新增一个 Action。

依次点击 Action Composer Apps with Actions

在顶部搜索栏搜索 Bear,点击进去可以看到有许多支持的 Action。

以 Prepend to Note 为例,点击进去填写参数之后再点击右上角的 Done 即可在 URL 地址栏中获得到 Bear 追加笔记的 URL Scheme。

但是这个方法也有一定的局限性,如果 Launch Center Pro 没有收录该软件的 URL Scheme 就无法通过这个方法查询。而且 Launch Center Pro 并不一定会收录全部支持的参数,对于部分软件只会给出最常用的一些 URL Scheme。

Info.plist 查询

非越狱 Info.plist 查询法

非越狱的 Info.plist 查询法是最广为人知的 URL Scheme 查询方法,但是自从 macOS Catalina 开始 iTunes 就被移除了,不能通过 iTunes 直接下载 ipa 来查询 Info.plist 了,所以目前的解决方法是使用 iMazing 下载 ipa。

下载 iMazing 之后连接设备,点击管理应用程序

点击资料库,选择需要查询的程序,下载之后右键选择导出 ipa。

导出 ipa 文件之后就需要对其进行解包,ipa 文件的本质是一个 zip 文件,将它的后缀修改为 zip 即可进行解压。

进入解压文件夹的 Payload 目录,右键选择显示包内容

进入主程序文件夹后,找到 Info.plist 文件。

选择合适的文本编辑器打开,例如此处的 Sublime Text,在文件中搜索「CFBundleURLSchemes」,在这个数组下的元素即是该软件对应的所有 URL Scheme。

可以看到知识星球支持的 URL Scheme 有 zsxq、xmq、xiaomiqian 和 com.unnoo.quan。可以看出知识星球的 URL Scheme 命名是产品前名称「小密圈」的拼音和拼音缩写,还有知识星球的拼音缩写。

越狱 Info.plist 查询法

越狱用户可以使用 Filza 文件管理器来查阅 Info.plist 中的 URL Scheme。它可以通过内置的「App管理器」直接跳转到对应的目录,不需要像 iFile 遍历查找过去。该方法需要在 Cydia 下载 Filza File Manager,该文件管理器在自带的 BigBoss 源就有,无需额外添加软件源。

进入主界面后,点击下方的星标按钮,选择 App管理器

以微信为例,点击微信右边的 info 图标,进入软件详情页,再点击主程序,跳转到微信主程序目录。

进入 WeChat.app 主程序目录,点击上方的搜索栏,搜索关键词「info.plist」

经过等待,发现会匹配到多个搜索结果,一般情况下文件大小最大的才是我们真正需要的 Info.plist,如下图高亮的 12KB 大小的 Info.plist。

打开 Info.plist,依次点击 CFBundleURLTypesItem 0CFBundleURLSchemes,在这个数组下的元素即是该软件对应的所有 URL Scheme。比如此处微信 7.0.14 支持的 wexinVideoAPI、weixin、weixinapp、wechat 等 URL Scheme。

但是无论是越狱或者非越狱的 Info.plist 查询法,它们能做到的也只有查询 App 的 Host URL Scheme,无法查询到包含参数的 URL Scheme。以目前的眼光来看,实用性不如 Launch Center Pro 、官方文档查询和网络搜索法。

到此为止,传统的 URL Scheme 查询方法介绍完毕,接下来是新的网页 URL Scheme 查询法介绍。

网页报错法

报错法的原理是让浏览器伪装成 iPhone Safari 客户端,打开链接对应的 URL Scheme,因为电脑上没有安装相应的 App,所以报错显示出真实的 URL Scheme 地址。报错法需要使用到电脑上的 Safari 或者 Chrome 浏览器。接下来以最复杂的京东 URL Scheme 举例进行说明。

京东

第一步:本文以 Safari 为例,在菜单栏中选择开发用户代理,将用户代理设置为 iPhone。(如果菜单栏中没有开发子菜单,需要在偏好设置的高级页面勾选在菜单栏中显示“开发”菜单)Chrome 浏览器需要另外下载修改 User Agent 的插件实现。

第二步:访问京东网页版,任意搜索一件商品,向下滑动商品列表看到一个立即打开按钮,点击得到 URL Scheme 报错地址如右图所示。

第三步:从地址栏复制这段 URL Scheme 进行处理。

根据已知的 URL Scheme 相关知识,可以知道 %XX 的形式是字符被编码之后得到的结果,所以需要对这段 URL Scheme 进行解码。将这段 URL Scheme 粘贴到 URL Decoder 进行解码得到结果。

关注到 URL Scheme 前段的参数,含有刚才搜索的关键词,后面是其他的参数可以忽略不看。将这几个参数逐一翻译过去,猜测它们的意思分别为:描述、商品关键词、来源、动作分类。

openapp.jdmobile://virtual?params={
"des":"productList",
"keyWord":"烧水壶",
"from":"search",
"category":"jump",
"sourceType":"Search",
"sourceValue":"search-ware"
......

在传统的 URL Scheme 进行查询一般只需要关键词参数即可,所以可以再删除 sourceType 和 sourceValue 这两个无关参数。根据剩下四个参数可以这样猜测出这样一个流程:jump 到 App 的 search 页面,以烧水壶为 keyWord 搜索并显示 productList,所以这四个参数缺一不可。通过实验验证只要缺少四个参数中的任何一个,跳转到京东 App 之后都无法进行搜索,最后证明结论与猜测一致。

删除可被忽略的参数,闭合最后的方括号,得到如下京东搜索 URL Scheme:

openapp.jdmobile://virtual?params={"des":"productList","keyWord":"商品名称","from":"search","category":"jump"}

用这段京东搜索的 URL Scheme 创建一个 Launch Center Pro 的搜索 Action,并将 keyWord 参数来源设置为键盘输入。但是 Launch 之后发现提示「URL could not be opened」。

这是由于 {}" 没有进行 URL 编码导致的,熟悉 Launch Center Pro 的用户应该知道可以使用 {{}} 将字符括起来就可以对它们进行编码,所以更新得到:

openapp.jdmobile://virtual?params={{{"des":"productList","keyWord":"[prompt]","from":"search","category":"jump"}}}

小结

京东 URL Scheme 较为复杂且参数较多,这是通过传统的查阅 Info.plist 无法查出来的。使用报错法能够非常方便地一次爆出所有参数,但是该方法有以下局限性:

  1. 如果该网站没有搜索栏,就无法使用该方法。例如闲鱼在早期是有搜索栏的,但是后来被彻底地移除了,经过其他方式验证闲鱼确实不支持搜索的 URL Scheme。
  2. 即使有搜索栏,如果网站开发者没有在此处设置跳转的 URL Scheme 同样无法通过这个方法获取 URL Scheme。比如当当就是在商品详情页设置了跳转,而搜索页没有设置,导致了无法获取到当当的搜索 URL Scheme。

在构造 URL Scheme 时,如果有 {}" 三种需要被编码的字符,记得要加上 {{}} 进行编码或者直接硬编码,否则 URL Scheme 可能无法被正确识别。

淘宝

相信多数人都有过这样的经历,朋友用微信发给你了一个淘宝链接。点进去一看,微信提示说请复制后使用浏览器访问,你不得不复制了再切换到 Safari 粘贴打开。由于两大巨头之间的竞争,让这原本简单的事情变得复杂了。

在 Safari 粘贴打开链接之后,会提示是否要在淘宝中打开。看到下图这样的提示弹窗,结合上面京东搜索的例子,就可以得到一个重要的结论:「凡是弹窗提示打开的,背后都是 URL Scheme」

一般的在微信之前打开淘宝链接的过程是:复制链接 → 打开 Safari → 粘贴到 Safari → 打开链接。但是借助 Shortcuts 和 URL Scheme 就可以复制链接 → 运行捷径直接打开。

接下来就来看看如何通过报错法获取淘宝的打开店铺的 URL Scheme。方法和京东类似,将 Safari 浏览器的 UA 改为 iPhone 然后访问即可。

和京东略微不同的是不需要手动点击,访问之后会直接跳转报错得到 URL Scheme

根据经验盲猜通过 URL Scheme 打开淘宝店铺,最少只需要一个店铺的 ID 参数即可,扫一眼过去就看到了 shopId 参数,至于 shopId 后面的参数都可以删去不看了,所以删除无用参数后得到更新的 URL Scheme:

tbopen://m.taobao.com/tbopen/index.html?h5Url=https://shop.m.taobao.com/shop/shop_index.htm?shopId=184770392

打开这个 URL Scheme,可以看出这是在淘宝客户端内打开了一个网页链接,不仅没有实现需要的打开指定店铺的功能,反而还访问了一个未知的网址。

那么就可以考虑不要使用淘宝内的网页打开,而是直接使用淘宝客户端访问店铺地址,删除前面的跳转页面,得到如下 URL Scheme,经测试可以正确打开淘宝店铺。

tbopen://fshop.m.taobao.com/shop/shop_index.htm?shopId=184770392

 

到此已经得到了直接打开淘宝店铺的 URL Scheme,它的 Scheme 并不是熟悉的 taobao:// 而是 tbopen,格式如下:

tbopen://shop.m.taobao.com/shop/shop_index.htm?shopId=店铺 ID

接下来的工作就是编写捷径通过 URL Scheme 直接打开店铺了,捷径下载:淘宝店铺捷径。淘宝分享店铺有两种方式:淘口令和网页链接,两者的基本格式如下:

2👈💲5PTlXcKr44c🗝 https://m.tb.cn/h.4piUivo?sm=b0be17  少数派正版软件

https://shop184770392.taobao.com/?spm=a230r.7195193.1997079397.2.7a3e4e09eDyokfhttps://shop184770392.taobao.com/?spm=a230r.7195193.1997079397.2.7a3e4e09eDyokf

网页链接中含有 shopId 可以直接匹配出来使用。淘口令没有相关参数,但是复制到剪切板后可以被淘宝客户端直接识别。为了优化体验,捷径对于这两种分享格式都可以正确识别并打开。为什么要考虑支持两种分享格式?这是因为淘宝对部分人来说并不是一个需要摆在主屏幕的 App,它是可以被收到文件夹里的。在这种情况下,微信复制 → 打开文件夹 → 打开淘宝又成了一个很麻烦的事情,而 URL Scheme 的存在正是为了解决这种不必要的点击。所以有了这个捷径之后我直接打开淘宝的频率更低了,甚至都可以直接移除淘宝这个图标了。

捷径具体制作过程以后另写文章介绍,目前只要会用即可,具体演示视频如下:

进阶版:网页分析法

网页分析法我认为是进阶版的报错法,它不像报错法只要修改 UA 再点击即可爆出 URL Scheme,它需要对网页 HTML 代码进行分析得出 URL Scheme。此处以 QQ 为例讲解网页分析法,为什么此处不能使用报错法?这是因为 QQ 跳转名片的页面设计考虑比较周到,如果检测到没有安装 QQ 并不会报错,而是提示前往 App Store 下载,所以报错法对于 QQ 来说就失效了。

使用 Launch Center Pro 的二维码扫描功能扫描 QQ 名片,扫描成功后可以直接将得到的结果复制到剪切板,这个 Action 的 URL Scheme 如下:

launch://x-callback-url/clipboard?text=[scan]

 

扫描得到如下的 QQ 名片链接地址:

https://qm.qq.com/cgi-bin/qm/qr?k=kPVripBdv5wz46kyXXXXXXXXXF0gls&noverify=0

打开网页检查器,在控制台输入如下代码就可以获取网页内所有的协议的链接。这段代码的作用比较好理解,它先把网页的所有 HTML 代码以 ; 分割,分割完了赋值给 text 变量,接着以 text 数组长度写一个 for 循环,匹配出所有的 :// 格式的文本。

text = document.getElementsByTagName('html')[0].innerHTML.split(';')
for (var i = 0 ; i < text.length ; i++)
  console.log(text[i].match(/:\/\/.*?\/.*/))

 

按下回车,可以看出控制台输入了所有匹配到的链接。扫一眼过去中间的这一段 URL 格外引人注目,它含有关键词 card 而且没有 com org net 这样的域名后缀,更能肯定它是一个 URL Scheme 而不是 URL。

card/show_pslcard 为关键词在网页源代码中搜索,可以找到这样一段代码:

var scheme = 'mqqapi';
if(isQim){
    scheme = 'qimapi';
}
var iosUrl = scheme + "://card/show_pslcard?src_type=internal&amp;version=1&amp;uin="+ rawuin +"&amp;card_type=group&amp;source=qrcode&amp;jump_from=" + jump_from + "&amp;auth=" + auth_key+"&amp;authSig=" + auth_sig + "&amp;source_id=" + (isQR ? '2_40002' : '2_40001');

 

删除不必要的参数,拼接构造跳转 QQ 个人信息页面的 URL Scheme:

mqqapi://card/show_pslcard?src_type=internal&version=1&uin= QQ 号码

网页分析法看上去需要一定的技术门槛,但是只要多动手实践几次就能举一反三,掌握这个技能。

基本方法就是:找点击按钮或者直接找 URL Scheme,大致分析一下 JS 代码即可拼接出对应的 URL Scheme。在部分网站中,甚至不需要拼接,只要执行了上面 JavaScript 之后基本就能直接看出 URL Scheme。

另外谈论一下像 QQ 添加好友这类带有 ID 参数的 URL Scheme,相比较于搜索的 URL Scheme,在以前很多人会认为带有 ID 参数的 URL Scheme 是无用的,比如下面这个:

fleamarket://item?id=商品 ID

但是通过 QQ 这个例子的介绍,读者还可以认识到这类 URL Scheme 的其他用途:

  1. 配合捷径绕过微信的屏蔽,直接打开商品页面。
  2. 微信小程序的 URL Scheme 可以帮助商家提供推广的点击率。
  3. 小红书的个人主页的 URL Scheme 插入在文章里降低别人关注你的门槛。

组合技:配置文件法

配置文件法一般不单独使用,而是配合前面的网页分析法一起使用。原理是查阅网站的 Universal Link 配置文件推测出 scheme 支持的参数。查阅 苹果开发者文档 可以看到这样一段话:

Create an apple-app-site-association file that contains JSON data about the URL Scheme that your app can handle.

Upload the apple-app-site-association file to your HTTPS web server. You can place the file at the root of your server or in the .well-known subdirectory.

由此可知配置文件 apple-app-site-association 都存放在网站的根目录或者 .well-known 子目录下,而且是以 JSON 格式无后缀保存。以知乎为例进行分析,直接访问 https://www.zhihu.com/apple-app-site-association 或者在终端中使用 curl 命令发送请求均可,这里以 curl 发送请求为例,得到如下结果:

➜ curl https://www.zhihu.com/apple-app-site-association
{
  "applinks": {
    "apps": [],
    "details": {
      "8J52SRPW6X.com.zhihu.ios": {
        "paths": [
          "/universal-links-callback/*",
          "/qq_conn/100490701/*",
          "NOT /question/*/log",
          "/question/*",
          "/people/*",
          "/topic/*",
          "/p/*"
        ]
      },
......

通过 paths 的键值可以分析出知乎的 URL Scheme 支持跳转到指定问题、主页、主题和文章,再配合网页分析法即可得到整个 URL Scheme 的基本结构。

但是需要特别指出的是,即使一个网站的 apple-app-site-association 为空,也并不代表着这个网站对应的软件不支持 URL Scheme,因为它可能是将 URL Scheme 直接写在了 HTML 代码中。

➜ curl https://h5.m.taobao.com/apple-app-site-association
{}

所以配置文件法只能作为一个辅助方法配合 Universal Link 或者上面的这些方法一起使用,关于 Universal Link 可参阅 Hum 写的《Universal Link 使用详解》

网页书签法

闽政通

由于 2021 年疫情防控的需要,在福建省内出入人流量较大的公共场所,需要出示闽政通上的健康码才可以进出。但是闽政通 App 打开健康码需要点两下才行,因为软件优化不佳比较卡顿,这两下反应也比较慢。所以闽政通的开发者添加了一个功能,可以在桌面以书签的形式创建健康码的快捷方式方便打开。

既然可以通过快捷方式直接跳转健康码页面,那么就可以再次猜想背后是在调用一个 URL Scheme 进行跳转。出于好奇查看一下地址栏的 URL,如下所示:

https://mztapp.fujian.gov.cn:8190/mztAppWeb/app/lnk/index.jsp?pwd=evecom123&appName=福建八闽健康码&appLogo=https://mztapp.fujian.gov.cn:8192/mztAppFile/uploadfile/image/null/20210128/wu_1et39pvj74l91vj7ulc1pbo16sq4.png&appUrl=mztapp://quickOpenServer?jumpUrl=-cw-ff8080816f9cc87501703eda492e017a

对 URL Scheme 熟悉的读者就可以看出此处应该使用 & 进行分割,分割后的结果如下所示:

https://mztapp.fujian.gov.cn:8190/mztAppWeb/app/lnk/index.jsp?
pwd=evecom123
&appName=福建八闽健康码
&appLogo=https://mztapp.fujian.gov.cn:8192/mztAppFile/uploadfile/image/null/20210128/wu_1et39pvj74l91vj7ulc1pbo16sq4.png
&appUrl=mztapp://quickOpenServer?jumpUrl=-cw-ff8080816f9cc87501703eda492e017a

在这段书签 URL 地址中,一共有四个参数,授权密码、软件名字、软件图标和软件对应的 URL,而这个 URL 参数就是闽政通打开健康码页面的 URL Scheme,之前的猜想再一次被证实。

那么从书签中获得到了这段 URL Scheme 有什么用吗?它比直接打开书签好在哪里?从书签中获得了 URL Scheme 之后至少有以下两个用途:

  1. 现在只有这样一个书签,但是如果是有三四个 URL Scheme 类型的书签,它们就会在主屏幕上占用 1/6 的区域,对于单屏用户来说这是不划算的。所以可以把它整合到 Launch Center Pro 成为一个 Action,或者新建一个捷径打开这个 URL Scheme 并设置双击屏幕背部运行捷径。
  2. 添加 Due 提醒。例如我们学校之前要求每周末截图健康码上传,获得到了这段 URL Scheme 之后我就可以在 Due 提醒事项内容中直接添加这段 URL Scheme。在滑动确认任务完成之后可以直接打开健康码的界面,这样可以保证每周都会记得打卡且简化了流程。

小结

书签法是一种通解的 URL Scheme 查询方式,只要软件支持生成桌面书签,那么一定是可以在 URL 的参数中查到 URL Scheme 的。但是我翻遍了 iPhone 上安装的所有软件,支持桌面书签的软件寥寥无几,只有闽政通、支付宝和菜鸟。好在支付宝是一个很大的聚合平台,有很多的官方和第三方接入,解决了这个支持桌面书签软件少的问题。接下来我们就以支付宝为例再探寻一下书签法。

支付宝

在支付宝中无论是支付宝官方的小程序或者第三方个人的小程序,都可以生成书签添加到桌面。以我市支付宝的乘车码为例,从添加书签的页面拷贝 URL 得到如下链接:

https://render.alipay.com/p/s/shortcut/index?appId=200011235&appName=支付宝乘车码&appIcon=https://gw.alipayobjects.com/mdn/gov_busmetro_card/afts/img/A*wrG-S5kIrsgAAAAAAAAAAABjAQAAAQ/original

 

这与闽政通的四个参数不同,此处只要三个参数即可,同样使用 & 进行分割,分割后的结果如下所示:

https://render.alipay.com/p/s/shortcut/index?
appId=200011235
&appName=支付宝乘车码
&appIcon=https://gw.alipayobjects.com/mdn/gov_busmetro_card/afts/img/A*wrG-S5kIrsgAAAAAAAAAAABjAQAAAQ/original

但是此处可以看出支付宝的书签与闽政通的书签最大不同之处在于:支付宝没有 appUrl 参数,也就是我们所说的 URL Scheme。一眼看过 appId 引起了我的注意,不难猜出 appId 就是每个小程序的「身份证号」。那么如何使用这个「身份证号」呢?

URL Scheme 肯定不是凭空产生的,既然在 URL 地址里看不出什么,那就打开网页检查器,看看支付宝书签页面的源代码里都有些什么。可以看到有一个「立即进入」的按钮,点击之后会调用 jumpSchema() 函数。

往下翻到 <script> 查看 jumpSchema() 函数的具体实现代码,很快就可以定位到下图高亮处。此处代码的用途是将支付宝打开小程序的固定格式 URL Scheme 和 appId 进行字符串拼接然后跳转。

此处的 URL Scheme 如下所示:

alipays://platformapi/startapp?appId=${appId}&chInfo=ch_desktop${appUrl}

此处 URL Scheme 的 chInfo 参数可以被省略,所以得到这样一段新的 URL Scheme:

alipays://platformapi/startapp?appId=${appId}

所以现在你就知道如何获取任意支付宝小程序的 URL Scheme 了,这也就是网上常见的各种支付宝小程序 URL Scheme 的来源,本质上就是支付宝打开小程序的固定 Scheme 格式与 appId 的拼接。

支付宝的八闽健康码和莆田市乘车码小程序调用 URL Scheme 如下,给福建省内的读者们参考使用。其他省市也基本都有在支付宝提供相应的健康码小程序,可以如法炮制获取相关的 URL Scheme。

八闽健康码小程序
alipays://platformapi/startapp?appId=2021002125635929

莆田市乘车码小程序
alipays://platformapi/startapp?appId=200011235

小结

得益于支付宝的开放性,可以很轻易地获取官方和第三方任意小程序的 URL Scheme 链接进行跳转,使用场景在闽政通的例子中总结过了,此处不在赘述。但是可以补充增加一个用处,比如上面提到的闽政通也提供了支付宝小程序,可以直接使用支付宝小程序的 URL Scheme 调用闽政通,手机上就可以把闽政通删除了。

另外,由于不同的小程序权限不同,它们可以被添加到的位置也是不同的。如下图所示闽政通和乘车码权限对比。闽政通可以添加到支付宝首页,而乘车码只被允许添加到桌面。

所以在获得了乘车码的 URL Scheme 之后就摆脱支付宝的束缚,可以将它添加为一个 Launch Center Pro Action 或者 Shortcuts 负一屏组件方便使用。

调试工具

Launch Center Pro

介绍完了上面四种查询 URL Scheme,肯定会有读者跃跃欲试,想亲自拿几个 App 来练练手。但是大家以前都是如何调试 URL Scheme?修改了然后再粘贴到 Safari 打开吗?这是一种效率很低的调试方法,所以在此介绍两种高效的 URL Scheme 调试方法,首先以 Launch Center Pro 为例。

构思一下如何想做出一个可以方便调试的 Action,这个 Action 需要实现哪些功能?

我认为应该有以下两个:

  1. 可以编辑 URL Scheme,方便调试;
  2. 调试完的结果应该可以暂存到剪切板方便下次继续修改。

基于上面两个需求,可以编写出这样的一条 URL Scheme:

launch://x-callback-url/clipboard?text=[prompt-return:URL Scheme Debug 🐛=[clipboard]]&x-success=[clipboard]

 

这个 Action 的运行流程是这样的:

  1. 首先从剪切板读取内容,一般情况下需要先查询一个基本的 URL Scheme 拷贝到剪切板,这也就是初始 URL Scheme 的来源。
  2. 弹出文本编辑界面,可以对这条 URL Scheme 参数进行编辑。编辑完成后点击 Launch 在 prompt-return 的作用下会覆盖原始剪切板内容。
  3. 前两个步骤完成后执行 x-success 参数内容。x-success 从剪切板读取刚刚编辑好的 URL Scheme 并进行跳转。

从演示图片和视频中可以看出,这是在调试一段 Bear 的 URL Scheme。唯一需要说明的就是调试的时候中文字符同样要遵循 Launch Center Pro 的编码原则,在中文字符的左右两边加上两对方括号,如下所示:

bear://x-callback-url/add-text?title={{测试笔记}}&text={{这是一段测试文本内容}}&mode=prepend&x-success=launch://

Drafts

考虑到有些读者是只有购买 Drafts,而没有 Launch Center Pro,这里同样提供可供 Drafts 使用的调试工具(点击下载)。下面是制作思路:

第一步:新建 Action,命名:「URL Scheme Debug 🐛」,点击0 steps添加 Script 模块。

第二步:编辑 JavaScript 代码,简单的两行代码如下:

url = encodeURI(draft.content);

draft.setTemplateTag('url', url);

 

第一行调用 draft.content 方法可以获取到 Drafts 的草稿内容,对它使用 encodeURI 进行 URL 编码,接着赋值给 url 变量。第二行使用内置的 draft.setTemplateTag 函数将编码后的内容定义为 url 标签。

读者在这里可能会有疑问,为什么要使用 encodeURI() 进行编码,而不是直接在 URL 当中进行编码?这是因为如果在 URL 中选择对标签进行编码,:// 会被编码成 %3A%2F%2F 而导致 URL Scheme 无法打开报错。

第三步:新增 URL 模块,来源就是刚刚定义好的 url 标签。与以往的 URL 不同的是这里一定要记得关闭「URL encode tags」,因为刚才已经使用 encodeURI() 编码过了,在这里不可以重复编码。

第四步:回到 Action 编辑页面,将「AFTER SUCCESS」修改为 Nothing,因为大多数情况下,复杂的 URL Scheme 可能不会一次调试成功,所以动作执行成功后可以保留草稿方便继续调试。

至此,Drafts 用户也有了一个高效方便的调试 Action 了。

文章小结

最后,我们来总结下查询 URL Scheme 的流程。

首先考虑软件开发商,如果软件开发商是国外开发商,那么很大概率会被收录在 Launch Center Pro 中,可以先去它里面进行查询。如果查询不到再考虑网络搜索查询方法,比如捷径社区、官方文档和个人文档。

如果该软件有网页端,访问网页端,试着寻找有无按钮可以选择跳转 App 客户端,如果有就可以使用网页报错法、网页分析法和脚本分析法。在做这一步的同时也可以查询一下网页上的 Universal Link 配置文件内容,用以辅助查询 URL Scheme。

如果是国产 App 且支持创建功能桌面快捷方式,就可以考虑使用网页书签法,这是最简单的办法之一,可以快速得到功能的 URL Scheme。

至于 Info.plist 查询法,这个方法查询到的 URL Scheme 意义不大,除非是只有通过 URL Scheme 打开应用的需求,否则一般不建议使用该方法。

经过这个流程,可以查询出 95% 以上支持 URL Scheme 的 App。剩下 5% 是需要更高级的脚本分析法,对网页的 JS 脚本进行分析,难度不定,所以在此不展开讨论,有能力的读者碰上这种情况时可以自行分析。

参考文章