URL Scheme 的介绍和使用 | 来自缤纷多彩的灰

URL Scheme 的介绍和使用 @ WHlcj | 2024-01-29T15:22:51+08:00 | 3 分钟阅读 | 更新于 2024-01-29T15:22:51+08:00

演示的两个 Demo 分别是 Swift 和 OC 版本的,项目地址在这里。下文主要以 OCDemo 进行截图配讲。

简介

URL Scheme 是一个可以让 APP 之间相互跳转的协议。比如:淘宝跳转到支付宝、京东使用微信登陆…许多场景使用的都是 URL Scheme 协议。

在 iOS 中的特殊性

其实安卓设备也使用了 URL Scheme 协议,但是通常提到 URL Scheme 常常跟 iOS 关联更多。这是因为 Apple 先接入了该协议的使用,并且 iOS 设备可以直接识别 URL Scheme 而安卓设备则不行。下文中提到的 URL Scheme 都默认是在 iOS 环境中。eg: iOS 中点击下面这个链接可以直接打开微信

1
weixin://  
1
tel://123456789         #拨打电话号码 123456789。  

URL Scheme 的一般格式

1
scheme://host:port/path?query
  • scheme 表示协议或方案,用于标识要调用的应用程序。类比 http://xxxx 中的 http
  • host 表示主机,通常是应用程序的名称或标识符。
  • port 表示端口,用于指定连接的端口(可选)。
  • path 表示路径,用于指定要执行的操作或导航的位置(可选)。
  • query 表示查询参数,用于传递额外的信息(可选)。

可以简单理解为

1
url_scheme://(传入的)参数

URL Scheme 与 URL Schemes

URL Scheme 是指某个 App 支持的单个 URL 协议,而 URL Schemes 则是指一个 App 支持的多个 URL 协议。例如,微信 App 支持多个 URL Scheme:

  • weixin:// :调起微信 App
  • weixin://scanqrcode :直接进入微信扫一扫页面
  • weixin://dl/moments :直接进入微信朋友圈页面(已失效)
  • weixin://dl/settings :直接进入微信设置页面(已失效)

实战

下面具体介绍如何使用 URL Scheme 实现 App 间跳转

注册 URL Schemes

  1. Info.plist 添加 URL types

  1. 添加 URL Schemes

URL types下只自带 URL Identifier,需要点击 ‘+’ 手动添加 URL Schemes

  1. 配置 URL Schemes & URL Identifier

URL Schemes 必须能唯一标识一个 App,如果你设置的 URL Schemes 与别的 App 的 URL Schemes 冲突时 URL Schemes 生效的优先级: 系统 App > 先装 App > 后装 App。

URL Identifier 是自定义的 URL schemes 的名字,一般采用反转域名的方法保证该名字的唯一性。

URL Identifier 在链接中是可选的。完成上面配置后,可以在 Safari 中输入并打开 ocDeme:// or ocDemo:com.ocDemo.www 能成功跳转则配置成功。

配置 URL Schemes 白名单

当我们想要跳转第三方 App 时,通常使用openURL:options:completionHandler:直接跳转,或者先canOpenURL:判断手机内是否安装有目标 App 再跳转。后一种方式的canOpenURL:则依赖于 URL Schemes 白名单。

iOS 9 后限制了 HTTP 协议的访问,现在需要在 Info.plist 中添加 Queried URL Schemes 并声明本 App 所支持的其他应用程序的 URL Schemes —— 如下图 —— 告知操作系统可能会查询或与之交互的其他 App,这样才可以正常检查其他 App 是否安装

安全性

虽然直接通过openURL:options:completionHandler:进行跳转也是允许的,不过使用canOpenURL:再进行跳转判断,可以提前发现问题,规避问题。

Queried URL Schemes 与 URL types

URL types 里的字段是为了让别的 App 能调起你的 App,而 Queried URL Schemes 是为了让系统允许你的 App 调用别的 App。

App 间跳转

swiftDemo 跳转 ocDemo

ocDemo 跳转 swiftDemo

传递参数

App 间跳转并传递参数的过程跟 get 方式请求接口类似。在 URL Scheme 中明文添加参数信息,被跳转的 App 调用合适的方法解析。比如这里 swiftDemo 跳转 ocDemo 传入参数user=elee

iOS 13 之前

直接在 AppDelegate 调用 application(_:open:options:) 或者 application(_:open:sourceApplication:annotation:) (iOS 9后被弃用)处理 URL Scheme。这里不多做介绍,读者可以参考官方文档自行摸索。

iOS 13 之后

需要在 SceneDelegate 调用 scene(_:openURLContexts:) 的方法进行处理。不过也可以去掉 SceneDelegate ,使用 AppDelegate 的方式。

  • URL: 启动 App 的 URL
  • sourceApplication: 来源 App 的 Bundel ID

终~