跳到主要内容
版本:0.77

链接

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 上,此功能称为 深链接,而在 iOS 上,它被称为 通用链接

内置 URL Scheme

正如引言中提到的,每个平台上都存在一些用于核心功能的 URL scheme。以下是一个非详尽的列表,但涵盖了最常用的 scheme。

Scheme描述iOSAndroid
mailto打开邮件应用,例如:mailto: hello@world.dev
tel打开电话应用,例如:tel:+123456789
sms打开短信应用,例如:sms:+123456789
https / http打开 Web 浏览器应用,例如: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) 来处理这些事件 - 它会使用链接的 URL 调用 callback({url})

2. 如果应用尚未打开,它会被打开并且 url 会作为 initialURL 传入

你可以使用 Linking.getInitialURL() 来处理这些事件 - 它返回一个 Promise,如果有的话,该 Promise 会解析为 URL。


示例

打开链接和深链接(通用链接)

打开自定义设置

获取深链接

发送 Intents (Android)

参考

方法

addEventListener()

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

通过监听 url 事件类型并提供处理程序来添加 Linking 变更的处理程序。


canOpenURL()

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

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

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

如果在 Android 上无法检查 URL 是否可以打开,或者当针对 Android 11 (SDK 30) 时未在 AndroidManifest.xml 中指定相关的 intent queries,Promise 将 reject。类似地,在 iOS 上,如果未在 Info.plist 内的 LSApplicationQueriesSchemes 键中添加特定的 scheme,promise 将 reject(见下文)。

参数:

名称类型描述
url
必需
string要打开的 URL。

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

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

  • 如果您的应用链接的是较早版本的 iOS 但在 iOS 9.0 或更高版本上运行,您最多可以调用此方法 50 次。达到该限制后,后续调用始终 resolve 为 false。如果用户重新安装或升级应用,iOS 会重置限制。

自 iOS 9 起,您的应用还需要在 Info.plist 内提供 LSApplicationQueriesSchemes 键,否则 canOpenURL() 将始终 resolve 为 false

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

例如,要处理 https schemes,需要将以下内容添加到您的 manifest 中:

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

getInitialURL()

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

如果应用启动是由应用链接触发的,它将提供链接 url,否则将提供 null

要在 Android 上支持深链接,请参考 https://developer.android.com/training/app-indexing/deep-linking.html#handling-intents

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


openSettings()

tsx
static openSettings(): Promise<void>;

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


openURL()

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。

参数:

名称类型描述
url
必需
string要打开的 URL。

如果系统不知道如何打开指定的 URL,此方法将失败。如果您传递的是非 http(s) URL,最好先检查 canOpenURL()

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

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


sendIntent()
Android

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

启动带有 extras 的 Android intent。

参数:

名称类型
action
必需
string
extrasArray<{key: string, value: string | number | boolean}>