作者:令川 | 发布时间:2023-05-14

记一次扒 iOS URL Scheme 的经历

前言

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 中的交通码。

output.gif

下面介绍一下如何实现这个功能的,其重点是如何获取交通码页面的 URL Scheme。

实现步骤

iOS App URL Scheme 具体格式、参数由 App 开发者自行决定,因此每个 App 的 URL Scheme 规则都有所差异,大部分 App 开发商通常不会公开 URL Scheme。

在我们想要获取一款 App 的 URL Scheme 时,首先应该尝试的,是去搜索引擎上搜索,例如:“网易云音乐 URL Scheme”。能搜到的结果最好,如果搜不到就需要自行尝试扒一扒 App 的 URL Scheme 了。

1. 在 App 内寻找“添加到桌面”

杭州市民卡-杭州人才码提供了从桌面打开功能:

image.png

微信小程序提供了从桌面打开功能:

image.png

一般来说,App 会为某些页面提供“添加到桌面”功能,允许用户快速从桌面进入 App 能的某个功能页面。它的具体实现原理:

  1. 在浏览器中打开一个引导页,让用户将当前网页添加到桌面
  2. 用户从桌面点击添加的网页
  3. 网页内部执行 JS 跳转逻辑,比如 window.location.href = <app-url-scheme>
  4. 打开对应的 App,由 App 处理 URL Scheme 的路径、参数

因此添加到桌面的网页里,就有我们需要的 URL Scheme,把它揪出来就行。

2. 在引导页中找到 URL Scheme

这是杭州市民卡-杭州人才码的“添加到桌面”的引导页:

image.png

把这个网页在浏览器里打开一下,分析里面的源代码。

额外提一下,图里的引导页被添加到桌面后,用户从桌面点击图标,打开的还是这个网页,然后快速执行跳转。因此这个网页的源码一般都不会很复杂,很容易就能找到 URL Scheme。

image.png

这里找关键字,很快就找到了 jumpSchema() 这个函数,函数内执行了 window.location.href = window.AlipaySchema; ,其中的变量 window.AlipaySchema 应该就是保存了 URL Scheme。

再简单搜索一下 window.AlipaySchema 被赋值的地方,就能获得 URL Scheme了:

image.png

打开杭州人才码的 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 里观察一下,确定找不到它的页面地址,换其他方法,抓包!(不一定可行,先试试)

好巧不巧,还真找到了一个交通出行页面的地址:

image.png

使用 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 的方法:

总的来说,扒 URL Scheme 是需要一些经验的,因为每个 App 的 URL Scheme 规则都不一样,这个过程中需要在适当的时候用抓包、字符编码,甚至通过观察已有的 URL Scheme,改变参数值观察效果如何、自己构造参数观察是否有效……整个过程中涉及到大量的尝试,也会有大量的失败,但是尝试的多了,下次再扒其他 App 的 URL Scheme 就轻车熟路了。

目录 / Contents

空。

令川 · 记