跳到主要内容
版本: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: [email protected]✅✅
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,
): EventSubscription;

通过监听 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.plist 的 LSApplicationQueriesSchemes 键中添加特定的 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}>