App URL Scheme

最近使用北京易通行扫码坐公交地铁,为了更高效些,开始调研是不是能够做到一键弹出地铁码/公交码,毕竟每次找到App=>启动App=>切换到对应乘车码,这样一套操作还是很麻烦的。

一键唤起App的具体页面功能,该需求能实现的本质就是个URL Scheme,因此关键就是能不能拿到这个信息了。

先说结论,最终我只能实现一键唤起易通行App,即RuubyPay://,而具体地铁码/公交码页面并不行,原因是查不到具体功能/页面的介绍SDK,或者没有猜出来。虽然没有彻底解决,但至少搞清楚了寻找指定App URL Scheme的一般方法了,以后有此需要就这么来搞。

基本方法

  1. Google/GitHub检索

    首先还是万能搜索大法,毕竟别人很多都想到和找到了,比如微信扫码weixin://scanqrcode

  2. 官方文档

    好点的软件对其URL Scheme支持是有系统介绍的,比如Surge/Things等,通过官方文档就可以了解能支持到什么程度。这点微信,美团之类的都没系统的介绍,基本都靠网友自己去找了,这点差评。

  3. iMazing等软件查看app中的info.plist,如果是Mac App的话,直接finder中查看app内容即可,不需要第三方App

    info.plist中检索CFBundleURLSchemes关键词,具体数组值即Scheme

https://static.1991421.cn/2022/2022-10-16-211355.jpeg

  1. 很多App对应网页版经常有点击跳转到对应App,这个跳转链接就是URL Scheme,抓取到网页内容中的该链接即可。比如腾讯会议的网页链接中的一键加入会议,又比如招商银行的活动页,一键打开,通过简单的调试就可以得到URL Scheme。

    https://static.1991421.cn/2022/2022-10-16-214238.jpeg

注意

  1. Scheme区分大小写,比如RuubyPay://可以唤起易通行,而rubbypay://报地址不对
  2. 一个App的Scheme支持多个,也可以没有,这点完全取决于App开发者
  3. info.plist这种办法只能解决唤起App,但是具体页面路径不得而知,因为该部分并不在该文件中提前定义,而是具体代码中实现。具体页面除了SDK/网页代码中抓取,就只能猜了。Scheme正确而路径错误的情况下App是可以正常被唤起,只是无法执行对应动作。
  4. 苹果系统下,iPad/iPhone/Mac均有Scheme支持

特别用途- check目标App安装状态

URL Scheme除了可以用于快速换起某App/具体功能之外,还有个特殊用途即可以查询某App是否安装。

使用方法

  1. info.plist中声明这些App需要查询

    注意URL Scheme query的数量限制为50

1
2
3
4
5
<key>LSApplicationQueriesSchemes</key>
<array>
<string>myapp1</string>
<string>myapp2</string>
</array>
  1. 代码中调用,根据返回值true/false来确定App是否安装
1
UIApplication.shared.canOpenURL(URL(string: "myapp1://test")!)

题外话

之所以了解到该用法是因为taio作者利用这个能力检查用户是否装了Surge类MitM工具进而导致被用户喷。做法虽然过分,但技术无罪,了解下无妨。 相关讨论贴见大家是怎么看待 Taio 的这种行为的

相关文档