跳到主要内容
版本:0.83

链接

Linking 为你提供了一个通用接口,用于与应用的入站和出站链接交互。

每个链接(URL)都有一个 URL Scheme,一些网站会以 https://http:// 开头,其中的 http 就是 URL Scheme。我们简称它为 scheme。

除了 https 之外,你可能也熟悉 mailto scheme。当你打开一个使用 mailto scheme 的链接时,操作系统会打开已安装的邮件应用。类似地,也有用于拨打电话和发送短信的 scheme。下面可阅读更多关于内置 URL scheme 的内容。

与使用 mailto scheme 类似,也可以通过自定义 url scheme 链接到其他应用。例如,当你收到来自 Slack 的 Magic Link 邮件时,Launch Slack 按钮是一个锚点标签,其 href 看起来像这样:slack://secret/magic-login/other-secret。和 Slack 一样,你可以告诉操作系统你想要处理一个自定义 scheme。当 Slack 应用打开时,它会接收到用于打开它的 URL。这通常被称为深度链接。阅读更多关于如何将深度链接引入你的应用。

自定义 URL scheme 不是在移动端打开应用的唯一方式。例如,如果你想给别人发一个链接,让其在移动设备上打开,使用自定义 URL scheme 并不理想,因为用户可能会在桌面端打开邮件,而那里的链接将无法工作。相反,你应该使用标准的 https 链接,例如 https://www.myapp.io/records/1234546。在移动端,这些链接可以配置为打开你的应用。在 Android 上,这个特性叫做 Deep Links,而在 iOS 上,它被称为 Universal Links

内置 URL Schemes

如前言所述,每个平台上都存在一些用于核心功能的 URL scheme。下面的列表并不完整,但涵盖了最常用的 scheme。

Scheme描述iOSAndroid
mailto打开邮件应用,例如:mailto: hello@world.dev
tel打开电话应用,例如:tel:+123456789
sms打开短信应用,例如:sms:+123456789
https / http打开网页浏览器应用,例如:https://expo.dev

启用深度链接

如果你想在应用中启用深度链接,请阅读下面的指南:

信息

有关如何在 Android 上添加对深度链接支持的说明,请参阅 为应用内容启用深度链接 - 为你的深度链接添加 Intent 过滤器

如果你希望在现有的 MainActivity 实例中接收 intent,可以在 AndroidManifest.xml 中将 MainActivity 的 launchMode 设置为 singleTask。更多信息请参阅 <activity> 文档。

XML
<activity
android:name=".MainActivity"
android:launchMode="singleTask">

处理深度链接

有两种方式来处理打开你应用的 URL。

1. 如果应用已经打开,则应用会被切换到前台,并触发 Linking 的 'url' 事件

你可以使用 Linking.addEventListener('url', callback) 来处理这些事件 —— 它会以 callback({url}) 的形式调用 callback,并传入链接 URL

2. 如果应用尚未打开,则会先打开应用,并将 url 作为 initialURL 传入

你可以使用 Linking.getInitialURL() 来处理这些事件 —— 它会返回一个 Promise,解析后得到该 URL(如果存在的话)。


示例

打开自定义设置

获取深度链接

发送 Intent(Android)

Reference

方法

addEventListener()

React TSX
static addEventListener(
type: 'url',
handler: (event: {url: string}) => void,
): EmitterSubscription;

通过监听 url 事件类型并提供处理函数,为 Linking 变更添加一个处理函数。


canOpenURL()

React TSX
static canOpenURL(url: string): Promise<boolean>;

确定已安装的应用是否可以处理给定的 URL。

该方法返回一个 Promise 对象。当确定给定的 URL 是否可处理后,promise 会被 resolve,且第一个参数表示它是否可以被打开。

如果在 Android 上无法检查该 URL 是否可以打开,或者在针对 Android 11(SDK 30)时你没有在 AndroidManifest.xml 中指定相关的 intent 查询,Promise 将会被 reject。同样,在 iOS 上,如果你没有在 Info.plistLSApplicationQueriesSchemes 键中添加特定的 scheme,promise 也会被 reject(见下文)。

参数:

NameTypeDescription
url
必填
string要打开的 URL。
备注

对于 Web URL,必须相应地设置协议("http://", "https://")!

注意

此方法在 iOS 9+ 上有一些限制。来自 Apple 官方文档

  • 如果你的应用链接的是较早版本的 iOS,但运行在 iOS 9.0 或更高版本上,你最多可以调用此方法 50 次。达到该限制后,后续调用始终会返回 false。如果用户重新安装或升级应用,iOS 会重置该限制。
  • 从 iOS 9 开始,你的应用还需要在 Info.plist 中提供 LSApplicationQueriesSchemes 键,否则 canOpenURL() 将始终返回 false
信息

当针对 Android 11(SDK 30)时,你必须在 AndroidManifest.xml 中为你想要处理的 scheme 指定 intents。常见 intents 列表可在 此处 找到。

例如,要处理 https scheme,需要在 manifest 中添加以下内容:

<manifest ...>
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https"/>
</intent>
</queries>
</manifest>

getInitialURL()

React TSX
static getInitialURL(): Promise<string | null>;

如果应用启动是由某个应用链接触发的,它会返回该链接的 url;否则返回 null

提示

当 Remote JS Debugging 处于活动状态时,getInitialURL 可能会返回 null。请禁用调试器以确保它被传递。


openSettings()

React TSX
static openSettings(): Promise<void>;

打开 Settings 应用,并显示该应用的自定义设置(如果有)。


openURL()

React TSX
static openURL(url: string): Promise<any>;

尝试使用已安装的任意应用打开给定的 url

你可以使用其他 URL,例如位置(如 Android 上的 "geo:37.484847,-122.148386" 或 iOS 上的 "https://maps.apple.com/?ll=37.484847,-122.148386")、联系人,或任何可由已安装应用打开的其他 URL。

该方法返回一个 Promise 对象。如果用户确认打开对话框,或 url 自动打开,则 promise 会被 resolve。如果用户取消打开对话框,或没有为该 url 注册应用,则 promise 会被 reject。

参数:

NameTypeDescription
url
必填
string要打开的 URL。
备注

如果系统不知道如何打开指定的 URL,该方法将失败。如果你传入的是非 http(s) URL,最好先检查 canOpenURL()。对于 Web URL,必须相应地设置协议("http://", "https://")!

注意

此方法在模拟器中的表现可能不同,例如在 iOS 模拟器中,"tel:" 链接无法处理,因为无法访问拨号器应用。


sendIntent()
Android

React TSX
static sendIntent(
action: string,
extras?: Array<{key: string; value: string | number | boolean}>,
): Promise<void>;

使用 extras 启动一个 Android intent。

参数:

NameType
action
必填
string
extrasArray<{key: string, value: string | number | boolean}>