前言
iOS 的 URL Scheme 被设计用于应用之间的跳转和数据传递,举个例子,打开微信 App 的 URL Scheme:
weixin://
iOS 上打开这个链接时,会自动打开微信 App。
://
后面是可以附带路径或参数的,例如打开支付宝扫一扫的 URL Scheme:
alipayqr://platformapi/startapp?saId=10000007
网易云播放指定歌单:
orpheuswidget://playlist/<歌单id>
我们可以利用 URL Scheme,执行一些自动化流程操作,或者只是将 URL Scheme 用作快速启动 App 某个功能的方式。
我最近在 iPhone 上实现了个小玩意:从 iPhone 锁屏界面点击一个按钮,直接打开杭州市民卡 App 中的交通码。
下面介绍一下如何实现这个功能的,其重点是如何获取交通码页面的 URL Scheme。
实现步骤
iOS App URL Scheme 具体格式、参数由 App 开发者自行决定,因此每个 App 的 URL Scheme 规则都有所差异,大部分 App 开发商通常不会公开 URL Scheme。
在我们想要获取一款 App 的 URL Scheme 时,首先应该尝试的,是去搜索引擎上搜索,例如:“网易云音乐 URL Scheme”。能搜到的结果最好,如果搜不到就需要自行尝试扒一扒 App 的 URL Scheme 了。
1. 在 App 内寻找“添加到桌面”
杭州市民卡-杭州人才码提供了从桌面打开功能:
微信小程序提供了从桌面打开功能:
一般来说,App 会为某些页面提供“添加到桌面”功能,允许用户快速从桌面进入 App 能的某个功能页面。它的具体实现原理:
- 在浏览器中打开一个引导页,让用户将当前网页添加到桌面
- 用户从桌面点击添加的网页
- 网页内部执行 JS 跳转逻辑,比如
window.location.href = <app-url-scheme>
- 打开对应的 App,由 App 处理 URL Scheme 的路径、参数
因此添加到桌面的网页里,就有我们需要的 URL Scheme,把它揪出来就行。
2. 在引导页中找到 URL Scheme
这是杭州市民卡-杭州人才码的“添加到桌面”的引导页:
把这个网页在浏览器里打开一下,分析里面的源代码。
额外提一下,图里的引导页被添加到桌面后,用户从桌面点击图标,打开的还是这个网页,然后快速执行跳转。因此这个网页的源码一般都不会很复杂,很容易就能找到 URL Scheme。
这里找关键字,很快就找到了 jumpSchema()
这个函数,函数内执行了 window.location.href = window.AlipaySchema;
,其中的变量 window.AlipaySchema
应该就是保存了 URL Scheme。
再简单搜索一下 window.AlipaySchema
被赋值的地方,就能获得 URL Scheme了:
打开杭州人才码的 URL Scheme:
SMKApplication://eyJzY2hlbWUiOiJzbWthcHBsaWNhdGlvbiIsImlkIjoic21rX2h6cmNtIiwibmFtZSI6IuadreW3nuS6uuaJjeeggSIsImljb25JZCI6InNta19jb2RlIiwidXJsIjoiaHR0cHM6XC9cL2h6cmNrLmh6ZGouZ292LmNuXC9leHRodG1sXC9oYW5nWmhvdVRhbGVudENhcmRcL2luZGV4Lmh0bWwjXC9pbmRleCJ9
在 iPhone 上尝试一下打开这个 URL,哎,打不开 🤡。
这里我做了如下尝试:将 SMKApplication
全转为小写,然后就能使用了,iOS 上打开这个链接,将会自动打开杭州市民卡 App,并跳转到杭州人才码页面。
smkapplication://eyJzY2hlbWUiOiJzbWthcHBsaWNhdGlvbiIsImlkIjoic21rX2h6cmNtIiwibmFtZSI6IuadreW3nuS6uuaJjeeggSIsImljb25JZCI6InNta19jb2RlIiwidXJsIjoiaHR0cHM6XC9cL2h6cmNrLmh6ZGouZ292LmNuXC9leHRodG1sXC9oYW5nWmhvdVRhbGVudENhcmRcL2luZGV4Lmh0bWwjXC9pbmRleCJ9
3. 解析已有的 URL Scheme
上面拿到的 URL Scheme,跳到了一个不是我们想要的 App 页面,得想想办法,让它能跳到我们想要的交通码页面。
首先解析一下 URL Scheme 中的 eyJzY2h...
,这个一看就很像是 Base64 编码,解码一下:
{
"scheme": "smkapplication",
"id": "smk_hzrcm",
"name": "杭州人才码",
"iconId": "smk_code",
"url": "<https://hzrck.hzdj.gov.cn/exthtml/hangZhouTalentCard/index.html#/index>"
}
这就明白了, url
字段值就是跳到 App 后,告诉 App 要跳到哪个地址。至于其它的这些参数我们先不去关心。
那接下来就是把 url
的值替换为交通码页面的地址。如何获取它?首先还是在 App 里观察一下,确定找不到它的页面地址,换其他方法,抓包!(不一定可行,先试试)
好巧不巧,还真找到了一个交通出行页面的地址:
使用 Base64 遍码 { "url": "smkapp://scanCodeRide2"}
,最终得到了杭州市民卡 App 打开交通码/交通出行页面的 URL Scheme:
smkapplication://ewogICJ1cmwiOiAic21rYXBwOi8vc2NhbkNvZGVSaWRlMiIKfQo=
快试试!
其他
如果需要从 iOS 锁屏页面快速打开 URL Scheme,主要是通过锁屏小组件来实现,有很多 App 都可以添加锁屏小组件,我使用的是 Scriptable,实现起来也很简单,具体代码就不放了。
其他还有一些扒 App URL Scheme 的方法,比如分析应用的 info.plist
,找到 Bundle ID
。这里推荐两篇文章,帮你进一步掌握 URL Scheme!
总结
本文介绍了一种扒 iOS 上 App 的 URL Scheme 的方法:
- 在 App 内找到“添加到桌面”
- 在“添加到桌面”网页中找到 URL Scheme,并解析其含义、格式
- 通过抓包等方式,生成我们最终想要的 URL Scheme
总的来说,扒 URL Scheme 是需要一些经验的,因为每个 App 的 URL Scheme 规则都不一样,这个过程中需要在适当的时候用抓包、字符编码,甚至通过观察已有的 URL Scheme,改变参数值观察效果如何、自己构造参数观察是否有效……整个过程中涉及到大量的尝试,也会有大量的失败,但是尝试的多了,下次再扒其他 App 的 URL Scheme 就轻车熟路了。