这是一个非常常见的需求,尤其是在移动应用开发中,用于从一个 App 跳转到另一个 App 并传递数据。

(图片来源网络,侵删)
什么是 URL Scheme?
简单回顾一下 URL Scheme 是什么。
URL Scheme 是一种特殊的 URL 格式,它允许一个应用(源应用)通过操作系统直接启动另一个应用(目标应用),它就像是给每个应用分配了一个“电话号码”,其他应用可以通过拨打这个号码来唤醒它。
基本格式如下:
<scheme>://<host>?<query>#<fragment>
myapp://product/detail?id=123&user=456

(图片来源网络,侵删)
URL Scheme 的核心组成部分(参数所在位置)
当用于分享和传递数据时,参数主要位于 URL 的 查询字符串 和 片段标识符 部分。
a. Scheme (协议)
- 作用:告诉操作系统应该用哪个应用来打开这个链接,这是 URL Scheme 的核心。
- 示例:在
myapp://...中,myappScheme。 - 如何设置:每个应用都需要在系统(iOS 的 Info.plist 或 Android 的 AndroidManifest.xml)中注册自己独一无二的 Scheme,就像注册商标一样,避免冲突。
b. Host (主机)
- 作用:通常用来表示目标应用内的一个具体功能模块或页面,起到路径的作用。
- 示例:在
myapp://product/detail中,product可以是模块,detail是具体页面。 - 如何设置:开发者可以自由设计,
user/profile,order/list等。
c. Query String (查询字符串) - 最常用的参数位置
- 作用:以键值对的形式传递具体的参数数据,这是最标准、最清晰的参数传递方式。
- 格式:以 开头,参数之间用
&分隔,键和值用 连接。 - 示例:
myapp://product/detail?id=123&title=新款手机&from=social_shareid=123: 传递一个产品 ID。title=新款手机: 传递一个产品标题。from=social_share: 传递来源信息,方便目标 App 分析流量来源。
d. Fragment (片段标识符)
- 作用:传统上用于定位网页内的某个锚点,在 App 间跳转中,它也可以用来传递参数,或者作为 Query String 的补充。
- 格式:以 开头。
- 示例:
- 作为参数:
myapp://page#section=comments,这种方式有时可以避免 URL 被一些服务器或中间代理(如微信)错误地解析或修改。 - 与 Query String 结合:
myapp://product/detail?id=123#section=reviews,先跳转到产品详情页,然后目标 App 可以根据section参数自动滚动到评论区域。
- 作为参数:
参数的设计与最佳实践
如何设计参数名称和结构是一门艺术,良好的设计能让对接更顺畅。
a. 参数命名规范
- 简洁清晰:使用有意义的英文单词,如
id,name,type,from。 - 统一风格:统一使用小写字母,或者使用驼峰命名法 (
userId),避免混用。 - 避免冲突:如果参数可能被中间方(如微信、微博)处理,尽量使用自己应用前缀,如
myapp_id,myapp_data。
b. 参数值的数据类型
- 字符串:最常见,如
title,name。 - 数字:如
id,count,在传递前,通常会将其转换为字符串形式。 - 布尔值:通常用
1/0或true/false字符串表示。 - JSON 对象:当需要传递复杂、结构化的数据时,可以将一个对象序列化为 JSON 字符串,然后作为 Query String 的一个参数值。
- 示例:
myapp://share?data={"productId":123,"user":{"id":456,"name":"张三"}} - 优点:可以一次性传递多个关联数据。
- 缺点:需要对 JSON 字符串进行 URL 编码(转义),否则特殊字符(如
&, , )会破坏 URL 结构,在 iOS 中,可以使用[data stringByAddingPercentEncodingWithAllowedCharacters:];在 Android 中,可以使用URLEncoder.encode()。
- 示例:
c. 实战案例:从 App A 分享到 App B
假设 App A 是一个电商 App,App B 是一个社交分享 App。
目标:在 App A 中选择一个商品,点击“分享到 App B”,App B 被唤醒并展示该商品的分享卡片。

(图片来源网络,侵删)
步骤 1: App A 构建分享链接 App A 的开发者需要知道 App B 的 URL Scheme,并设计好参数。
假设 App B 的 Scheme 是 socialapp,参数设计如下:
url: 商品详情页的网页链接,用于生成分享卡片。: 商品标题。desc: 商品描述。imgUrl: 商品图片的链接。
App A 会构建这样一个 URL:
socialapp://share?title=新款iPhone&desc=性能强劲,值得拥有&imgUrl=https://.../iphone.jpg&url=https://.../p/123
步骤 2: 用户点击分享 用户在 App A 中点击“分享到 App B”,系统会唤起 App B,并将上述 URL 传递给它。
步骤 3: App B 接收并解析参数 App B 被唤醒后,会执行以下操作:
- 获取启动 URL:App B 在
AppDelegate(iOS) 或MainActivity(Android) 中,会获取到传递过来的这个 URL。 - 解析 URL:
- 检查
scheme是否为socialapp,确认是自己的“来电”。 - 检查
host是否为share,确认是分享功能。 - 解析
query string,提取出title,desc,imgUrl,url这四个参数的值。
- 检查
- 执行业务逻辑:
- 根据解析出的
title,desc,imgUrl,url,在 App B 的界面上动态生成一个分享卡片。 - 用户可以编辑文案,然后点击“发布”按钮。
- 根据解析出的
重要注意事项
-
安全性问题
- Scheme 劫持:恶意应用可以注册一个与你相同的 Scheme,从而截获你的跳转,为了缓解,可以在跳转前尝试通过
canOpenURL(iOS) /Intent.resolveActivity(Android) 检查目标应用是否已安装。 - 参数篡改:用户可以手动修改 URL 中的参数,目标 App 绝对不能信任从 URL 中获取的任何敏感信息(如用户 Token、支付信息等),URL Scheme 适合传递公开的、非敏感的业务数据(如 ID、标题、来源标记)。
- Scheme 劫持:恶意应用可以注册一个与你相同的 Scheme,从而截获你的跳转,为了缓解,可以在跳转前尝试通过
-
兼容性与健壮性
- URL 编码:如果参数值中包含特殊字符(如
&, , , , 空格),必须进行 URL 编码,否则 URL 结构会被破坏,大多数编程语言都提供了现成的编码函数。 - 参数校验:目标 App 在接收到 URL 后,应对参数进行校验,检查
id是否为数字,title是否为空等,防止因参数错误导致 App 崩溃。 - 处理未安装的情况:如果目标应用未安装,跳转会失败,源应用需要有兜底方案,比如引导用户去应用商店下载。
- URL 编码:如果参数值中包含特殊字符(如
-
平台差异
- iOS:在
Info.plist中使用<LSApplicationQueriesSchemes>和<CFBundleURLTypes>来声明和查询 Scheme。 - Android:在
AndroidManifest.xml中使用<intent-filter>来声明 Scheme。
- iOS:在
| 组成部分 | 作用 | 示例 | 备注 |
|---|---|---|---|
| Scheme | 唤醒目标应用 | myapp |
必须唯一,需在系统注册 |
| Host | 指定目标功能模块 | product/detail |
类似网页路径,用于导航 |
| Query String | 传递核心参数 | ?id=123&from=share |
键值对,最常用,最标准 |
| Fragment | 传递补充参数或锚点 | #section=reviews |
可作为 Query String 的补充 |
设计 URL Scheme 分享参数时,核心思路是:定义清晰的协议和路径,使用标准化的查询字符串来传递结构化的、非敏感的业务数据,并充分考虑编码、校验和异常处理。
